bind(DNS)のインストール

「DNSサーバー」と言っても役割が2通りあるのです。

コンテンツとキャッシュサーバー(フルリゾルバー)

クライアントが指定しているのはこの内のキャッシュサーバー(フルリゾルバー)の事です。
フルリゾルバーというのは反復問い合わせに対応しているものです。
ルートサーバーから順に検索して目的のホスト(FQDN)のアドレスを返答してくれます。
このことからインターネットに直接アクセスできることが条件になります。

コンテンツサーバーはドメイン名(FQDN)からIPアドレス(正引き)に変換するゾーン情報を持っているものです。
IPアドレスからドメイン名(FQDN)の情報(逆引き)も持っているものもあります。

正式にドメインを取得し、権限が委任されていればグローバルDNSとして機能します。

コンテンツサーバーには機能としてマスターサーバーとスレーブサーバーがあります。
その名の通りマスターサーバーは親サーバーです。スレーブサーバーはマスターサーバーの複製です。複製するにはゾーン転送機能を利用して行われます。
bind4の名残でプライマリー・セカンダリーなどと解説されていますが、bind8.3以降はマスター・スレーブの方が正しいと思います。

マスターは1台ですが、スレーブは何台あってもよいのです。
インターネット側から見たときにはマスター・スレーブの区別はつきません。
分散型データベース構造の利点ですね。

bindでは正引き情報や逆引き情報の管理としてゾーンと言う名前の単位で管理します。

ゾーン情報のなかに管理者情報やシリアルナンバー、有効期間などが定義されます。
これがSOAレコードと言います。
レコードはリソースレコードとよばれ、この他、NS、MX、A、TXT、PTRなどがあります。

インストール例として以下に紹介します。

# yum -y install bind bind-utils bind-libs bind-chroot

読み込んだプラグイン:fastestmirror
インストール処理の設定をしています
Determining fastest mirrors
* base: ftp.tsukuba.wide.ad.jp
* extras: ftp.tsukuba.wide.ad.jp
* updates: ftp.tsukuba.wide.ad.jp
base | 3.7 kB 00:00 
base/primary_db | 4.6 MB 00:00 
extras | 3.4 kB 00:00 
extras/primary_db | 30 kB 00:00 
updates | 3.4 kB 00:00 
updates/primary_db | 3.3 MB 00:00 
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> Package bind.x86_64 32:9.8.2-0.30.rc1.el6_6.2 will be インストール
--> 依存性の処理をしています: portreserve のパッケージ: 32:bind-9.8.2-0.30.rc1.el6_6.2.x86_64
---> Package bind-chroot.x86_64 32:9.8.2-0.30.rc1.el6_6.2 will be インストール
---> Package bind-libs.x86_64 32:9.8.2-0.30.rc1.el6_6.2 will be インストール
---> Package bind-utils.x86_64 32:9.8.2-0.30.rc1.el6_6.2 will be インストール
--> トランザクションの確認を実行しています。
---> Package portreserve.x86_64 0:0.0.4-9.el6 will be インストール
--> 依存性解決を終了しました。

~途中省略

インストール:
bind.x86_64 32:9.8.2-0.30.rc1.el6_6.2 
bind-chroot.x86_64 32:9.8.2-0.30.rc1.el6_6.2 
bind-libs.x86_64 32:9.8.2-0.30.rc1.el6_6.2 
bind-utils.x86_64 32:9.8.2-0.30.rc1.el6_6.2 

依存性関連をインストールしました:
portreserve.x86_64 0:0.0.4-9.el6 
 
完了しました!

Config設定

プライベート IP アドレスの解決を外部に問い合わせしないようにする方法を追加します。
具体的には「empty-zones-enable yes;」指定して有効にすると、bind が空のゾーンを自動的に作成します。
この他RFC1819等に指定されているネットワークアドレスに対してemptyゾーン宣言して設定する方法もあります。
自動的に作成されるものには以下のようなものがあります。

  • ループバックアドレス     (例:127, ::1) [RFC 1122]
  • ブロードキャストアドレス (例:255.255.255.255, 0) [RFC 1122]
  • プライベートネットワーク (例:10, 172.16, 192.168) [RFC 1918]
  • リンクローカルアドレス  (例:169.254) [RFC 3927]
  • テストネットワーク    (例:192.0.2, 198.51.100, 203.0.113) [RFC 5737]
  • シェアードアドレススペース (例:100.64〜100.127) [RFC 6598]
# vi /var/named/chroot/named.conf

options {
    directory "/var/named";
    pid-file "/var/named/named.pid";
    version "";

    recursion yes;

    blackhole { ← 問い合わせを拒否するクライアントのネットワークアドレス
        10/8;
        172.16/12;
    };
    listen-on {
        127.0.0.1;
        192.168.10.129; ← 待ち受ける(サービス提供する)I/FのIPアドレス
    };
    allow-query {
         127.0.0.1;
         192.168.0.0/24; ← 問い合わせを許可するクライアントのネットワークアドレス
    };
    empty-zones-enable yes;  ← 空のゾーンを自動的に作成します。
};
    allow-recursion {
         127.0.0.1;
         192.168.0.0/24; ← 再帰問い合わせを許可するクライアントのネットワークアドレス
    };

    zone "." IN {
         type hint;
         file "named.root"; ← ルートネームサーバーのアドレス情報が記載されている
    };

    zone "localhost" IN { ← 自分自身の正引き用
        type master;
        file "localhost.zone";
        allow-update { none; };
     };

    zone "0.0.127.in-addr.arpa" IN { ← 自分自身の逆引き用
        type master;
        file "named.local";
        allow-update { none; };
    };

    zone "hogehoge.com" IN { ← 管理するドメインの正引き用
        type master;
        file "hogehoge.com";
        allow-update { none; };
    };

    zone "0.168.192.in-addr.arpa" IN { ← 管理するネットワークアドレスの逆引き用
        type master;
        file "0.168.192.in-addr.arpa";
        allow-update { none; };
    };

channel "default_syslog" {
    syslog daemon;
    severity info;
}; 
# Use with the following in named.conf, adjusting the allow list as needed:
key "rndc-key" {
     algorithm hmac-md5;
     secret "{md5}secret";
};
#
controls {
      inet 127.0.0.1 port 953
              allow { 127.0.0.1; } keys { "rndc-key"; };
};

/etc/rndc.key はbind9では不要なので削除または名前変更しておきます、
rndcコマンドを利用するときに邪魔になるだけです。
(なぜかRPMパッケージに含まれてます。)
/etc/rndc.confはrndcコマンドを利用するときに必要です。

/etc/rndc.conf
options {
	 default-server	localhost;
	 default-key "rndc-key";
};
key "rndc-key" {
	 algorithm	hmac-md5;
	 secret	"{md5}secret";
};

Zoneファイルの設定

# vi localhost.zone
$TTL 86400
@ IN SOA ns.hogehoge.com. info.hogehoge.com.( ← SOAは「Start Of Authority」の略、MNAME、RNAME
            2002091903 ; serial
            3600 ; refresh
            900 ; retry
            1209600 ; expire
            43200 ; minimum
)

IN    NS    @
IN    A    127.0.0.1
# vi named.local
$TTL 86400
@ IN SOA ns.hogehoge.com. info.hogehoge.com.(
            2002091903 ; serial
            3600 ; refresh
            900 ; retry
            1209600 ; expire
            43200 ; minimum
)
IN    NS    localhost.
1    IN     PTR     localhost.
# vi hogehoge.com
$TTL 86400 ← ゾーンの各レコードの寿命(Time To Live)の値を秒単位で指定
@ IN SOA ns.hogehoge.com. info.hogehoge.com.(
        2002091903 ;  ← SERIAL ゾーン情報のシリアル番号(ヴァージョン番号)
        3600 ;  ← REFRESH  スレーブサーバがゾーン情報の更新の有無(「SERIAL」の増加)をチェックする周期
        900 ;  ← RETRY 再試行の周期、原則としてREFRESHの値の整数分の1の値
        1209600 ;  ← EXPIRE マ スターサーバがダウンした場合、スレーブサーバはこの数値で提示された期間が経過するまで保持する
          RFC1912は、2~4週間(1209600~2419200)を推奨
        43200 ;  ← MINIMUM 「存在しないレコード」の保持期間
)
;
; Name Server Section
;
IN    NS    ns.hogehoge.com.
;
; Mail Server Section
;
@    IN    MX    10 smtp.hogehoge.com.
;
; Host Section
;
router    IN    A    192.168.0.1
ns        IN    A    192.168.0.129
smtp      IN    A    192.168.0.7
pop       IN    A    192.168.0.7
www       IN    A    192.168.0.5
# vi 0.168.192.in-addr.arpa
$TTL 86400
@ IN SOA ns.hogehoge.com. info.hogehoge.com.(
        2002091904 ; serial
        3600 ; refresh
        900 ; retry
        1209600 ; expire
        43200 ; minimum
)
;
; Name Server Section
;
IN    NS    ns.hogehoge.com.
;
; Host Section
;
129    IN    PTR    ns.hogehoge.com.
1      IN    PTR    router.hogehoge.com.
5      IN    PTR    www.hogehoge.com.
7      IN    PTR    smtp.hogehoge.com.
7      IN    PTR    pop.hogehoge.com.

hint zone

hint zoneはルートサーバーの情報です、キャッシュサーバーで動作させる為に最新情報に入れ替えます。

# cd /var/named/chroot/var/named/
直接ルートサーバから取得する方法
# dig +norec ns . @a.root-servers.net > named.root

公開情報から取得する方法
# wget ftp://ftp.rs.internic.net/domain/named.root

; This file holds the information on root name servers needed to
; initialize cache of Internet domain name servers
; (e.g. reference this file in the "cache . "
; configuration file of BIND domain name servers).
;
; This file is made available by InterNIC 
; under anonymous FTP as
; file /domain/named.cache
; on server FTP.INTERNIC.NET
; -OR- RS.INTERNIC.NET
;
; last update: May 23, 2015
; related version of root zone: 2015052300
;
; formerly NS.INTERNIC.NET
;

2015/05/23 に更新されていることが分かります、頻繁に更新されることはありませんがアナウンスされなくてもチェックしておく方がいいでしょう
ちなみに前回2014/11/05の更新ではIPv6の表記が変更になっていましたが、今回は差分がありませんでした。

文法チェック

# named-checkconf -t /var/named/chroot/

bind起動

# /etc/init.d/named start
named を起動中: [ OK ]

クライアントPCから実験

# dig any hogehoge.com

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.30.rc1.el6 <<>> any hogehoge.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 64747
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 2

;; QUESTION SECTION:
;hogehoge.com. IN ANY

;; ANSWER SECTION:
hogehoge.com. 86400 IN SOA ns.hogehoge.com. info.hogehoge.com. 2002091903 3600 900 1209600 43200
hogehoge.com. 86400 IN NS ns.hogehoge.com.
hogehoge.com. 86400 IN MX 10 smtp.hogehoge.com.

;; ADDITIONAL SECTION:
ns.hogehoge.com. 86400 IN A 192.168.10.129
smtp.hogehoge.com. 86400 IN A 192.168.0.7

;; Query time: 3 msec
;; SERVER: 192.168.10.129#53(192.168.10.129)
;; WHEN: Tue May 12 17:55:43 2015
;; MSG SIZE rcvd: 144
# dig a www.hogehoge.com

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.30.rc1.el6 <<>> a www.hogehoge.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 40921
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1

;; QUESTION SECTION:
;www.hogehoge.com. IN A

;; ANSWER SECTION:
www.hogehoge.com. 86400 IN A 192.168.0.5

;; AUTHORITY SECTION:
hogehoge.com. 86400 IN NS ns.hogehoge.com.

;; ADDITIONAL SECTION:
ns.hogehoge.com. 86400 IN A 192.168.10.129

;; Query time: 1 msec
;; SERVER: 192.168.10.129#53(192.168.10.129)
;; WHEN: Tue May 12 17:56:10 2015
;; MSG SIZE rcvd: 86
# dig -x 192.168.0.5
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.30.rc1.el6 <<>> -x 192.168.0.5
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 24110
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1

;; QUESTION SECTION:
;5.0.168.192.in-addr.arpa. IN PTR

;; ANSWER SECTION:
5.0.168.192.in-addr.arpa. 86400 IN PTR www.hogehoge.com.

;; AUTHORITY SECTION:
0.168.192.in-addr.arpa. 86400 IN NS ns.hogehoge.com.

;; ADDITIONAL SECTION:
ns.hogehoge.com. 86400 IN A 192.168.10.129

;; Query time: 2 msec
;; SERVER: 192.168.10.129#53(192.168.10.129)
;; WHEN: Tue May 12 17:56:28 2015
;; MSG SIZE rcvd: 122

Config設定がミスっている場合

0.168.192.in-addr.arpa のゾーンファイル最終行
5 IN PTR www.hogehoge.com
としてしまい最後に「.」ピリオドをつけわすれると

# dig -x 192.168.0.5

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.30.rc1.el6 <<>> -x 192.168.0.5
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 49957
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1

;; QUESTION SECTION:
;5.0.168.192.in-addr.arpa. IN PTR

;; ANSWER SECTION:
5.0.168.192.in-addr.arpa. 86400 IN PTR www.hogehoge.com.0.168.192.in-addr.arpa.

;; AUTHORITY SECTION:
0.168.192.in-addr.arpa. 86400 IN NS ns.hogehoge.com.

;; ADDITIONAL SECTION:
ns.hogehoge.com. 86400 IN A 192.168.10.129

;; Query time: 1 msec
;; SERVER: 192.168.10.129#53(192.168.10.129)
;; WHEN: Tue May 12 17:57:51 2015
;; MSG SIZE rcvd: 138

FQDNにドメイン名が補完されて返事が返ってくるので、上記のように0.168.192.in-addr.arpa.が
余分についてしまっている。

ルートサーバーIPアドレス変更の主な履歴

2017年10月24日(協定世界時)B.ROOT-SERVERS.NETのIPv4アドレスが変更されました。
旧IPv4アドレス: 192.228.79.201
新IPv4アドレス: 199.9.14.201

2017年7月26日(協定世界時)L.ROOT-SERVERS.NETのIPv6アドレスが変更されました。
旧IPv6アドレス: 2001:500:3::42
新IPv6アドレス: 2001:500:9f::42

2015年12月1日(協定世界時)H.ROOT-SERVERS.NETのIPv4/IPv6アドレスが変更されました。
旧IPv4アドレス: 128.63.2.53
旧IPv6アドレス: 2001:500:1::803f:235

新IPv4アドレス: 198.97.190.53
新IPv6アドレス: 2001:500:1::53

2013年1月3日(協定世界時)D.ROOT-SERVERS.NETのIPv4アドレスが変更されました。
旧IPv4アドレス: 128.8.10.90
新IPv4アドレス: 199.7.91.13

2007年11月1日(協定世界時)L.ROOT-SERVERS.NETのIPv4アドレスが変更されました。
旧IPv4アドレス: 198.32.64.12
新IPv4アドレス: 199.7.83.42

ルートサーバ

ルートサーバーの一覧・所在地などの情報はhttp://root-servers.org/で確認できます。
エニーキャストによる負荷分散を行っているので13台ということではありません。
例)L.rootは161サイトのサーバーを世界中に分散配置して耐障害性と負荷分散を実現しています。

頭文字IPv4アドレスIPv6アドレス管理者ソフトウェア
A198.41.0.42001:503:BA3E::2:30VeriSignBIND
B199.9.14.2012001:500:84::b南カリフォルニア大学情報科学研究所BIND
C192.33.4.122001:500:2::cCogent CommunicationsBIND
D199.7.91.132001:500:2d::dメリーランド大学カレッジパーク校BIND
E192.203.230.102001:500:a8::eアメリカ航空宇宙局BIND
F192.5.5.2412001:500:2f::fInternet Systems ConsortiumBIND9
G192.112.36.42001:500:12::d0dアメリカ国防情報システム局BIND
H198.97.190.532001:500:1::53アメリカ陸軍研究所NSD
I192.36.148.172001:7fe::53Autonomica(スウェーデン)BIND
J192.58.128.302001:503:C27::2:30VeriSignBIND
K193.0.14.1292001:7fd::1RIPE NCC(オランダ)NSD
L199.7.83.422001:500:3::42ICANNNSD
M202.12.27.332001:dc3::35WIDEプロジェクト(日本)BIND