仮想マシンのsqueeze2台にDNSを導入

■squeezeにDNSを導入

 参考:DNSサーバ(BIND9)の設定
 http://www005.upp.so-net.ne.jp/develop-tom/deb/bind-deb.html

■デフォルトではキャッシュサーバとして動作

$ sudo apt-get install -y bind9

■ファイル構成は見たまま。「include」で呼び出す方式の為、「named.conf」は触らない。

$ grep include /etc/bind/named.conf
include "/etc/bind/named.conf.options";
include "/etc/bind/named.conf.local";
include "/etc/bind/named.conf.default-zones";

■正引き、逆引きの保存場所
 「directory」サブステートメントが指すディレクトリ

 ※フォワード機能は無効のまま、IPv6のリッスンはコメントアウト
  この設定は、正常に動作した事を確認してからでも遅く無い。

$ sudo grep -v '//\|^\$' /etc/bind/named.conf.options
options {
        directory "/var/cache/bind";
        auth-nxdomain no;    # conform to RFC1035
};

■「managed-keys.bind」対策
 syslogで「managed-keys.bind」が無いというエラーが出る。
 これは1,2のどちらかで対応出来る。

$ sudo tail -100 /var/log/syslog | grep managed-keys | cut -c 45-
: managed-keys-zone ./IN: loading from master file managed-keys.bind failed: file not found

1.単純に作業ディレクトリにtouchする

$ sudo touch /var/cache/bind/managed-keys.bind && sudo /etc/init.d/bind9 restart

2.「managed-key」のディレクトリを指定、同ファイルをtouchするか作成する
 必要になった時の為にコメントアウトで入れておけば忘れずに済む。

options {

    // managed-keys-directory "/etc/bind";

};

$ sudo tail -50 /var/log/syslog | grep managed-keys | cut -c 45-
: managed-keys-zone ./IN: loaded serial 0
: set up managed keys zone for view _default, file 'managed-keys.bind'

■設定チェック
 スペルミス等構文エラーが無いことを確認

$ sudo named-checkconf

■ドメインの設定

 プライマリDNS

$ hostname -f
vmsqueeze-amd64i.localdomain

 セカンダリDNS

$ hostname -f
vmsqueeze-clean.localdomain

■プライマリDNSの最小限の設定
 
$ sudo vim /etc/bind/named.conf.local
$ grep -v '//' /etc/bind/named.conf.local

zone "localdomain" {
    type master;
    file "localdomain.zone";
    allow-update {127.0.0.1;};
};

zone "72.168.192.in-addr.arpa" {
    type master;
    file "localdomain.rev";
    allow-update {127.0.0.1;};
};

■正引きのゾーンの設定

$ sudo cp /etc/bind/db.local /var/cache/bind/localdomain.zone
$ sudo cat /var/cache/bind/localdomain.zone
$TTL    3600
@       IN      SOA     vmsqueeze-amd64i.localdomain. root.mail.localdomain. (
                     2012040301         ; Serial
                           1800         ; Refresh
                            900         ; Retry
                         604800         ; Expire
                           1200 )       ; Negative Cache TTL
;
@                       IN NS   vmsqueeze-amd64i.localdomain.
                        IN A    192.168.72.188
vmsqueeze-amd64i        IN A    192.168.72.188


$ sudo named-checkzone localdomain /var/cache/bind/localdomain.zone
zone localdomain/IN: loaded serial 2012040301
OK

■逆引きのゾーンの設定

$ sudo cp /etc/bind/db.127 /var/cache/bind/localdomain.rev
$ cat /var/cache/bind/localdomain.rev
$TTL    3600
@       IN      SOA     vmsqueeze-amd64i.localdomain. root.mail.localdomain. (
                     2012040301         ; Serial
                           1800         ; Refresh
                            900         ; Retry
                         604800         ; Expire
                           1200 )       ; Negative Cache TTL
;
@       IN NS   vmsqueeze-amd64i.localdomain.
188     IN PTR  vmsqueeze-amd64i.localdomain.
$ sudo named-checkzone 72.168.192.in-addr-arpa /var/cache/bind/localdomain.rev
zone 72.168.192.in-addr-arpa/IN: loaded serial 2012040301
OK

■bind9を再起動、問題があればsyslogをチェック

$ sudo /etc/init.d/bind9 restart
Stopping domain name service...: bind9 waiting for pid 2891 to die.
Starting domain name service...: bind9.

$ sudo grep bind /var/log/syslog | tail -5

■セカンダリDNSのAレコードを追加する。

$ (echo 'server 127.0.0.1';
 echo 'update add vmsqueeze-clean.localdomain 3600 IN A 192.168.72.199';
 echo 'send'; ) | nsupdate -d

$ nslookup -type=A vmsqueeze-clean 192.168.72.188     Server:         192.168.72.188
Address:        192.168.72.188#53

Name:   vmsqueeze-clean.localdomain
Address: 192.168.72.199

■セカンダリDNSのPTRレコードを追加する
 ※最後の「.」に注意

$ (echo 'server 127.0.0.1';
 echo 'update add 199.72.168.192.in-addr.arpa 3600 IN PTR vmsqueeze-clean.localdomain.';
 echo 'send'; ) | nsupdate -d

$ nslookup -type=ptr 192.168.72.199 192.168.72.188
Server:         192.168.72.188
Address:        192.168.72.188#53

199.72.168.192.in-addr.arpa     name = vmsqueeze-clean.localdomain.

■MXレコードを追加する。

$ (echo 'server 127.0.0.1';
 echo 'update add mail.localdomain 3600 IN MX 10 192.168.72.188';
 echo 'send'; ) | nsupdate -d

■CNAMEレコードを追加する

$ (echo 'server 127.0.0.1';
 echo 'update add ns1.localdomain. 3600 IN CNAME vmsqueeze-amd64i.localdomain.';
 echo 'send'; ) | nsupdate -d

$ nslookup -type=cname ns1.localdomain 192.168.72.188 Server:         192.168.72.188
Address:        192.168.72.188#53

ns1.localdomain canonical name = vmsqueeze-amd64i.localdomain.

■追加されたゾーンは以下にある。
 「strings」で見れなくも無いが、見ても良く分からないw。

$ ls /var/cache/bind/localdomain.*.jnl
/var/cache/bind/localdomain.rev.jnl  /var/cache/bind/localdomain.zone.jnl

■実際には以下が上記のキャッシュに少し遅れて更新される。
 ※バックアップ対象はここと更新用のスクリプトという事になるはず。

$ ls -l /var/cache/bind/ | grep "zone\$\|rev\$"
-rw-r--r-- 1 bind bind  438 2012-04-03 23:30 localdomain.rev
-rw-r--r-- 1 bind bind  462 2012-04-03 23:47 localdomain.zone

■ACLを定義、セカンダリとLAN内のクエリ、転送を許可する

$ grep -v '//' /etc/bind/named.conf.options
acl vmnatlan {
        127.0.0.1;
        127.0.1.1;
        192.168.72.0/24;
};
options {
        directory "/var/cache/bind";



        allow-query {
                vmnatlan;
        };
        allow-transfer {
                192.168.72.199;
        };

        auth-nxdomain no;    # conform to RFC1035
};

■セカンダリDNS

■syslogエラー対策

$ sudo touch /var/cache/bind/managed-keys.bind

■IPv6無効、転送先をプライマリDNSへ。

$ grep v6 /etc/bind/named.conf.options
        //listen-on-v6 { any; };
$ grep "forwarders.*;" /etc/bind/named.conf.options
        forwarders {192.168.72.188;};

■「type slave」にし、「masters」を設定

$ grep -v '//' /etc/bind/named.conf.local

zone "localdomain" {
    type slave;
    masters {192.168.72.188;};
};

zone "72.168.192.in-addr.arpa" {
    type slave;
    masters {192.168.72.188;};
};

■設定のチェック、再起動

$ sudo named-checkconf
$ sudo /etc/init.d/bind9 restart

■DNSを参照するよう、「resolv.conf」を修正

 ※プライマリDNS
$ grep nameserver /etc/resolv.conf
nameserver 192.168.72.188
 ※セカンダリDNS
$ grep nameserver /etc/resolv.conf
nameserver 192.168.72.199
 ※ホストOS
$ grep nameserver /etc/resolv.conf
nameserver 192.168.72.188
nameserver 192.168.72.199
nameserver 192.168.188.254

■外部も確認

$ nslookup google.co.jp
Server:         192.168.72.188
Address:        192.168.72.188#53

Non-authoritative answer:
Name:   google.co.jp
Address: 74.125.235.95
Name:   google.co.jp
Address: 74.125.235.87
Name:   google.co.jp
Address: 74.125.235.88

■「forwarders」の設定
 ホストの「resolv.conf」にもあるルータを指定

$ grep "forwarders.*;" /etc/bind/named.conf.options
        forwarders {192.168.188.254;};
$ sudo named-checkconf
$ sudo /etc/init.d/bind9 restart

■ホストOSの「tcpdump」で待ち受け、ゲストOS内から「dig -x yahoo.co.jp」でチェックしたところ

$ sudo tcpdump -n port 53
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
00:08:44.494499 IP 192.168.188.188.49309 > 192.168.188.254.53: 56920+ [1au] PTR? jp.co.yahoo.in-addr.arpa. (53)
00:08:44.514878 IP 192.168.188.254.53 > 192.168.188.188.49309: 56920 NXDomain 0/1/1 (121)