自宅LANで内向きDNSを構築

自宅の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」というページに設定の流れから書式の詳細まで多くの情報がまとまっていたため大変勉強になりました。