自宅のLAN内の名前解決を行うためのDNSサーバを立ててみたのでその手順をメモ
1. bind9をインストール
$ sudo apt-get install bind9
デフォルトだと/etc/bind/に設定がすべておいてあるようなので、ひとまずそのままの構成を使うことにした。
2. ゾーンファイルの追加
name.conf.localにて自宅LAN用の設定を読み込むようにした。ゾーンファイルの形はもともとあるzones.*のファイルを真似る。
name.conf.localに追記
include "/etc/bind/zones.hoge";
/etc/bind/zones.hogeを作成
zone "29.168.192.in-addr.arpa" { type master; file "/etc/bind/db.29.168.192"; }; zone "hoge.com" { type master; file "/etc/bind/db.hoge.com"; };
/etc/bind/db.hoge.comを作成
$TTL 86400 @ IN SOA hoge.com. root.localhost. ( 2 ; Serial 604800 ; Refresh 86400 ; Retry 2419200 ; Expire 604800 ) ; Negative Cache TTL ; IN NS web web IN A 192.168.29.7 www IN A 192.168.29.7 router IN A 192.168.29.1
/etc/bind/db.29.168.192を作成
$TTL 86400 @ IN SOA web.hoge.com. root.localhost. ( 1 ; Serial 604800 ; Refresh 86400 ; Retry 2419200 ; Expire 604800 ) ; Negative Cache TTL ; @ IN NS web.hoge.com. 1 IN PTR router.hoge.com. 7 IN PTR web.hoge.com. 7 IN PTR www.hoge.com.
自分で解決できなかったときに名前解決を任せるサーバを指定
デフォルトだとルートサーバに行ってしまうのでISPのDNSを指定しておく
name.conf.options
forwarders { ISPのプライマリーDNS; ISPのセカンダリーDNS; }; ||< 上記の設定を入れたらbind9を再起動 >|| $ sudo service bind9 restart
3. 設定の書式チェック
以下のコマンドでname.confに文法的な誤りがないかチェックできる
$ sudo named-checkconf
デフォルトの構成を使っていない場合は引数など指定してファイルを明示する必要あるかも
以下のコマンドでゾーンファイルの文法チェック
正引き sudo named-checkzone hoge.com db.hoge.com zone hoge.com/IN: loaded serial 2 OK 逆引き sudo named-checkzone 29.168.192.in-addr.arpa /etc/bind/db.29.168.192 zone 29.168.192.in-addr.arpa/IN: loaded serial 1 OK ||< 上記のようにOKが出ればよい 間違っている場合はline No.とともにエラー文が出るので修正する 4.見に行くDNSサーバの変更 まず構築中のDNSサーバ上の設定を変更 resolve.conf >|| search hoge.com nameserver 127.0.0.1
これで構築中のDNSサーバ上で先ほどの設定を引けるようになったはずなのでチェック
$ host web.hoge.com web.hoge.com has address 192.168.29.7 $ host 192.168.29.7 7.29.168.192.in-addr.arpa domain name pointer www.hoge.com. 7.29.168.192.in-addr.arpa domain name pointer web.hoge.com.
正しく引けない場合はゾーンファイルのファイル名やパス名が間違っていないか確認する
5. LAN内のクライアントPCから確認
クライアントPCの参照するDNSを変更した上で4.と同じように名前解決できるか確認する
ただし、こちらの場合ネットワーク経由でのアクセスになるのでbindの設定以外にも原因がある可能性に注意。自分の場合はファイヤーウォールの設定が間違っていたため修正した。
iptables.sh
# LAN内からDNSサーバに来る名前解決のアクセスを許可 iptables -A INPUT -p udp -d $MY_IP --dport 53 -j ACCEPT iptables -A OUTPUT -p udp -s $MY_IP --sport 53 -j ACCEPT # ISPのDNSに解決を任せる場合のアクセスを許可 iptables -A INPUT -p udp -d $MY_IP --sport 53 -j ACCEPT iptables -A OUTPUT -p udp -s $MY_IP --dport 53 -j ACCEPT
これでクライアントPCから名前解決ができるようになった。
参考ページ
・http://www.obenri.com/_dnsserver/index.html
上記の「お便利サーバ.com」というページに設定の流れから書式の詳細まで多くの情報がまとまっていたため大変勉強になりました。