フタなしカンヅメ

徒然なるままに @happytar0

VPSを使ってネームサーバ構築

今までバリュードメインの無料ネームサーバを利用していたのですが、ご存知の状況でして・・・。この際自分で作ってしまおうと思ったわけです。

まず、サーバをどうしようかなと思いました。自分で構築するのであれば、もちろんroot権限がある専用サーバが必要です。安いものだとさくらインターネットの月額7800円のもの。スペックはネームサーバを構築するならば十分です。一つ気になるといえば、HDDが冗長化されていないくらいでしょうか?RAID1のプランだと初期が一気に高くなるので厳しいです。

自宅サーバでもいいかなと思いましたが、プライマリのサーバを置いておくのはちょっと心配な気もします。もうちょっと安いレンタルはないかなと思い、VPNとやらを調べてみることにしました。

感想は思ったより高くてびっくりってな感じです。これなら専用サーバ借りたほうがいいんではと思えるほどです。しかも制限が厳しくて使いづらそうです。Pleskとかもいらないですし、評判もすこぶる悪い。海外サーバを再販しているようなところも多くて、これなら海外で借りたほうがいいんではと思い、調べてみると日本とは比べて安いしいい感じです。

色々調べた結果Linodeというところにしました。一番安い$19.95のものを選択。クレジットカードで登録後、すぐに使えるようになりました。スバラシイです。
Webからコンソールで操作できますし、ディストリビューションも選択できて申し分ないです。しかもIPアドレスの逆引きにも対応しています。

ちょっと気になったのはネームサーバって最初にプライマリに問い合わせて、ダウンしてたらセカンダリにいってと考えていたので、海外にネームサーバがあるとレスポンスが悪くなったりするのかと心配でした。
かなり常識的なことなのかもしれませんが、距離や応答速度などから最適なネームサーバに問い合わせをしてくれるらしい。ということは、セカンダリを日本に置いておけばそっちにいくってことかな?
下記のような構成でいくことにしました。

プライマリDNS => Linode
セカンダリDNS => 自宅サーバ

ディストリはCentOSにしてしまったのですが、今思えばDebianとか他のにすればよかった・・・。さっそく起動してsshを認証鍵のみにして、不要なデーモンを止めました。ふと、気づいたのですがlocaleの設定が日本になってないみたい。

## /etc/sysconfig/i18n
# 下記のように変更して再ログイン
LANG="ja_JP.UTF-8"

時間もまだズレている・・・。そうか、タイムゾーンが日本になっていないか。タイムゾーンは、/etc/localtimeで管理されているので、日本(東京)のもので上書きします。

# cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

ネームサーバは、bind9を使おうと思います。昨今色々な問題点が出てきているのでちょっと心配ではあるのですが、以前にちょっとだけいじったこともあったので今回はこれを使ってみます。
その前にファイアウォールの設定をします。

## ルールのクリア
# iptables -F
## ポリシー設定
## OUTPUTは全て許可、FORWARDは破棄
# iptables -P OUTPUT ACCEPT
# iptables -P FORWARD DROP
## ループバックからは許可
# iptables -A INPUT -i lo -j ACCEPT
## ICMP(ping), DNS, SSHのみ許可
# iptables -A INPUT -p icmp -j ACCEPT
# iptables -A INPUT -p tcp --dport 53 -j ACCEPT
# iptables -A INPUT -p udp --dport 53 -j ACCEPT
# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
## その他は全て破棄
# iptables -P INPUT DROP
# /etc/init.d/iptables save
# /etc/init.d/iptables restart

yumを使い、bindをインストールします。bind-chrootを使うとchroot環境で動作するらしいです。安全のためにchrootを使ってみます。caching-nameserverは一度問い合わせた内容をキャッシュすることで高速に動作させることができるそうです。

# yum install bind bind-chroot caching-nameserver

bindの設定をします。rndcを利用すると権限のないユーザなどから、bindの制御ができなくなるそうです。chrootなので下記の位置となります。

## 設定ファイルをサンプルからコピー
# cp /var/named/chroot/etc/named.caching-nameserver.conf /var/named/chroot/etc/named.conf

## ゾーンファイルを保存するディレクトリの作成
# mkdir /var/named/chroot/var/named/zones
# chown root:named /var/named/choort/var/named/zones

## /var/named/chroot/etc/named.confを編集
options {
        listen-on port 53 { any; };
        directory       "/var/named";
        dump-file       "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
        allow-query     { any; }; # 外部に公開
        # セカンダリDNSに転送を許可
        allow-transfer { 
                192.168.x.1;
                192.168.x.2;
        };
        also-notify { 
                192.168.x.1;
                192.168.x.2;
        };
        notify yes;
        version "unknown";
};
logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
};

include "/etc/rndc.key"; 
controls {
        inet 127.0.0.1 port 953
        allow { 127.0.0.1; } keys { "rndckey"; };
};

view external {
        match-clients { any; };
        recursion no;

        zone "." {
                type hint;
                file "named.ca";
        };
        zone "example.com" {
                type master;
                file "zones/example.com.zone";
        };
}; 

次にルートネームサーバの情報を更新します。

# dig @a.root-servers.net . ns > /var/named/chroot/var/named/named.ca

ゾーンファイルを作ります。

## /var/named/chroot/var/named/zones/example.com.zone

; example.com
$TTL    300 # 5分に設定、短すぎ?
@       IN      SOA     ns1.example.com. root.ns1.example.com. (
                2009080701      ; Serial # シリアル番号、いじったらここも更新
                300             ; Refresh # ゾーン転送の間隔
                120             ; Retry # 失敗した場合の試行時間
                3600000         ; Expire # 有効期限
                3600 )          ; Minimum # ネガティブキャッシュの保持期間

                IN      NS      ns1.example.com.
                IN      NS      ns2.example.com.
                IN      NS      ns3.example.com.
ns1             IN      A       192.168.x.10
ns2             IN      A       192.168.x.1
ns3             IN      A       192.168.x.2

www             IN      A       192.168.x.5

bindが無事に起動すれば成功です。ついでに定期的にルートネームサーバを更新するようにします。

## /usr/local/etc/shells/update_named_ca.sh
#!/bin/sh

NAMED_CA=/var/named/chroot/var/named/named.ca
dig @a.root-servers.net . ns > $NAMED_CA

Cronで一日一回実行します。

# chmod 700 /usr/local/etc/shells/update_named_ca.sh 

## Cronに登録
02 4 * * * /usr/local/etc/shells/update_named_ca.sh > /dev/null 2>&1

参考サイト
404 Not Found
bind9 設定
3 Minutes Networking No.68