BIND DNSサーバー構築の記事一覧

DNSサーバーの種類(キャッシュサーバーとコンテンツサーバー)

DNSサーバーには、大きく分けてキャッシュサーバーとコンテンツサーバーの2つの種類があります。

種類 説明
キャッシュサーバー DNSクライアント(リゾルバ)から送られる再帰(Recursive)問い合わせを受け、名前解決が完了するまで、それぞれの名前について他のDNSサーバーに反復(Iterative)問い合わせを行なう。その結果をDNSクライアントに返答する。また、その結果をキャッシュする。
コンテンツサーバー ドメイン名とIPアドレスの対応表を「ゾーン」という単位で管理し、自分が管理しているゾーンに対する問い合わせだけに回答する。

ここで、DNSの名前解決方法には「再帰問い合わせ」と「反復問い合わせ」の2種類があったことを思い出してください。(詳細は「DNSの仕組み」参照。)

再帰問い合わせ リゾルバからの問い合わせを受けたDNSサーバが、他のDNSサーバに問い合わせを行いその最終的な結果をリゾルバに応答する問い合わせのこと。
反復問い合わせ リゾルバから再帰問い合わせを受けたDNSサーバーが、再帰問い合わせの結果を返すために、答えを得られるまで繰り返し他のDNSサーバへ行う問い合わせのこと。

前述のとおり、再帰問い合わせを受けて、他のDNSサーバーに反復問い合わせを行なうのがキャッシュサーバーです。例えば、下図に出てくる「社内DNSサーバー」はキャッシュサーバーになり、「ルートDNSサーバー」「.comのDNSサーバー」「example.comのDNSサーバー」はコンテンツサーバーになります。
DNSの名前解決方法

DNSフォワーダ

前回までの記事で構築してきたDNSサーバーは自身が管理する「webtest01.com.」というゾーンに対する問い合わせには回答しますが、それ以外の問い合わせについては自信は管理していないので応えられません。そこで反復問い合わせを行い答えを見つけようとしていたかどうかと言えば、していません。

ただ、「webtest01.com.」以外のドメインに対する名前解決も出来ていました。では、なぜ名前解決を行えたのでしょうか。それはフォワーダ機能を使用していたからです。

named.confのoptionsステートメントで「forwarders」を指定したことを思い出してください。

# cat /etc/named.conf
options {
    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     { 127.0.0.1;
                      172.16.0.0/24;
     };
    forwarders{
            172.16.0.254;
    };

};
  ~ 省略 ~

フォワーダ機能を使用すると、自身のDNSで解決できない問い合わせをフォワーダに指定したDNSサーバーに転送することができます。上記の設定では自身が解決できない問い合わせを受けた場合、IPアドレス「172.16.0.254」に問い合わせを転送することになります。そして、転送された側で、最終的に反復問い合わせを行い、答えを返してくれます。当方の環境ではまずルータに転送され、さらにプロバイダのDNSサーバー(キャッシュサーバー)に転送されます。

DNSサーバーで取得したDNS問い合わせに対するパケットキャプチャーを見てみましょう。下記は、「172.16.0.2」のPCから当サイトのFQDNである「cos.linux-dvr.biz」に対する名前解決を行った際のパケットキャプチャーです。
DNSフォワーダパケットキャプチャ

PC(172.16.0.2)からの名前解決要求を、DNSサーバー(172.16.0.10)はルータ(172.16.0.254)へ転送し、ルータからDNSサーバーに結果が返され、DNSサーバーはその結果をPCへ返している様子が見て取れます。

キャッシュサーバーとしての設定

では、今回構築したDNSサーバーをキャッシュサーバーとして動作させるための設定を行なってみます。そのためにはnamed.confを編集します。

# vi /etc/named.conf
options {
        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     { 127.0.0.1;
                          172.16.0.0/24;
        };
        recursion yes;
        allow-recursion{
                127.0.0.1;
                172.16.0.0/24;
        };
//        forwarders{
//                172.16.0.254;
//        };

};

キャッシュサーバーとして動作させるためには、再帰問い合わせを許可してやる必要があります。

設定項目 概要
recursion 再帰問い合わせ(リカージョン)の可否を指定。
allow-recursion 再帰問い合わせを許可するホストもしくはネットワークを指定。
forwarders 自身で解決できない問い合わせを転送するフォワーダーを指定。

「recursion」をyesにして再帰問い合わせを許可します。これにより、再帰問い合わせを受けたら、その結果を返すために、反復問い合わせを行うようになります。また、「forwarders」の指定は不要となるので、コメントアウトします。

編集が完了したら、BINDを再起動させ、設定を反映させます。

# service named restart

これで設定は完了です。では、この設定で取得したDNS問い合わせに対するパケットキャプチャーを見てみましょう。下記は、「172.16.0.2」のPCから当サイトのFQDNである「cos.linux-dvr.biz」に対する名前解決を行った際のパケットキャプチャーです。
DNS反復問い合わせパケットキャプチャ

PC(172.16.0.2)からの名前解決要求を受けたDNSサーバー(172.16.0.10)は、まず「198.41.0.4」に対して問い合わせを行っていることが確認できます。「198.41.0.4」が何者かというと、その正体はルートDNSサーバーです。ルートDNSサーバーから回答を得たあと、再度別のDNSサーバーに対して要求を出し、その回答を得たらまた別のDNSサーバーに要求を出す、という動作を繰り返していることが確認できます。そして、最後にDNSサーバー(172.16.0.10)からPC(172.16.0.2)へ回答しています。

注意点

今回はサンプルのため個人で構築したDNSサーバーをキャッシュサーバーとして動作させましたが、実はこの行為、よくありません。

個人や中小企業などが家庭LAN、社内LAN用に構築したDNSサーバーの場合、プロバイダーのDNSサーバーをフォワーダとして指定することが推奨されます。その主な理由は、DNS問い合わせトラフィックを減少させるためです。

反復問い合わせを行う場合、まず、ルートDNSサーバーに問い合わせが行きます。それはつまり、ルートDNSサーバーは世界中からものすごい数のリクエストが届いているということです。

ただ、DNSサーバー(キャッシュサーバー)は一度得た回答をキャッシュしておくことができます。プロバイダのDNSサーバーはある程度まとまった数のリクエストを受けるため、反復問い合わせをしなくてもキャッシュしてある結果を返すことができます。

例えば、YahooやGoogleといった大手サイトは必ず誰かが見ています。2番目以降に問い合わせてきたクライアントに対しては全てキャッシュした結果を返してやればいいため、トラフィックが大幅に減少します。実際、通常のDNS問い合わせとその回答はほとんどがキャッシュサーバーからの回答です。

さらに、キャッシュサーバーとした場合、セキュリティの面でも好ましくありません。再帰問い合わせを許可した場合、やりようによっては悪意を持ったユーザーがでたらめなキャッシュを勝手に登録できてしまいます。それはつまり、様々な悪用ができてしまうということが容易に想像できると思います。ですので、キャッシュサーバーとして動作させる場合は、きちんとセキュリティ対策がされている必要があるということです。

2016年01月09日(土)|BIND DNSサーバー構築

DNSサーバー動作確認(digコマンド)

前回までの記事でDNSサーバーとして設定はひととおり完了しました。今回はDNSサーバーが正しく動作しているかどうかを確認する方法について見ていきます。

digコマンド

DNSサーバーの動作を確認するためにはdigコマンドを使用します。digコマンドはDNSサーバーに対して様々な要求を出すことが出来ます。また、digコマンドが表示する結果はこれまでに設定してきたゾーンファイルと同じフォーマットとなるため、正しく設定できているかどうかの確認がしやすいことが特徴です。

DNSサーバーの動作確認で使用するコマンドとしてnslookupコマンドがあります。Windowsでも同名のコマンドがあるため、nslookupコマンドの方が認知度は高いと思いますが、LinuxでDNSサーバーのトラブルシューティングを行う際にはdigコマンドを使うことが推奨されます。

nslookupコマンドは応答を加工して表示したり、実際に行いたい問い合わせ以外の問い合わせも行うので、場合によっては意図しない結果に見えることがあるなど、トラブルシューティングには向かない部分があるからです。

ホスト名からIPアドレスを確認する

では、早速digコマンドを使用してホスト名からIPアドレスを検索してみましょう。オプションなしで使用するとAレコードを検索します。

# dig pc01.webtest01.com

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6_4.6 <<>> pc01.webtest01.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 58998
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1

;; QUESTION SECTION:
;pc01.webtest01.com.            IN      A

;; ANSWER SECTION:
pc01.webtest01.com.     86400   IN      A       172.16.0.1

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

;; ADDITIONAL SECTION:
ns.webtest01.com.       86400   IN      A       172.16.0.10

;; Query time: 2 msec
;; SERVER: 172.16.0.10#53(172.16.0.10)
;; WHEN: Sat Jan  2 01:18:24 2016
;; MSG SIZE  rcvd: 85

「ANSWER SECTION」を確認すると、「pc01.webtest01.com.」に対応するIPアドレスが「172.16.0.1」であることが確認できます。

digコマンドの出力では応答メッセージのヘッダ情報から、各セクションの応答内容がしっかりと分かれて表示されているのが分かります。また、「Query time」欄には問い合わせにかかった時間も表示されます。

IPアドレスからホスト名を確認する

続いて、IPアドレスからホスト名を検索します。-xオプションをつけるとPTRレコードを検索します。

# dig -x 172.16.0.1

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6_4.6 <<>> -x 172.16.0.1
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 9642
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1

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

;; ANSWER SECTION:
1.0.16.172.in-addr.arpa. 86400  IN      PTR     pc01.webtest01.com.

;; AUTHORITY SECTION:
0.16.172.in-addr.arpa.  86400   IN      NS      ns.webtest01.com.

;; ADDITIONAL SECTION:
ns.webtest01.com.       86400   IN      A       172.16.0.10

;; Query time: 0 msec
;; SERVER: 172.16.0.10#53(172.16.0.10)
;; WHEN: Sat Jan  2 01:35:53 2016
;; MSG SIZE  rcvd: 106

「ANSWER SECTION」を確認すると、IPアドレス「172.16.0.1」に対応するホスト名が「pc01.webtest01.com.」であることが確認できます。

外部との接続を確認する

自身が管理するゾーン以外のホスト名に対しても名前解決ができるかどうか確認します。

# dig www.google.co.jp

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6_4.6 <<>> www.google.co.jp.
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 16288
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 4, ADDITIONAL: 4

;; QUESTION SECTION:
;www.google.co.jp.              IN      A

;; ANSWER SECTION:
www.google.co.jp.       300     IN      A       216.58.196.227

;; AUTHORITY SECTION:
google.co.jp.           86400   IN      NS      ns2.google.com.
google.co.jp.           86400   IN      NS      ns4.google.com.
google.co.jp.           86400   IN      NS      ns1.google.com.
google.co.jp.           86400   IN      NS      ns3.google.com.

;; ADDITIONAL SECTION:
ns4.google.com.         172130  IN      A       216.239.38.10
ns2.google.com.         172130  IN      A       216.239.34.10
ns1.google.com.         172130  IN      A       216.239.32.10
ns3.google.com.         172130  IN      A       216.239.36.10

;; Query time: 56 msec
;; SERVER: 172.16.0.10#53(172.16.0.10)
;; WHEN: Sat Jan  2 01:38:35 2016
;; MSG SIZE  rcvd: 196

無事に名前解決できていることが確認できます。

2016年01月08日(金)|BIND DNSサーバー構築

BINDの起動

BINDはデーモンとして動作させる必要があるのでserviceコマンドを使用して起動させます。

serviceコマンドはデーモンの起動・再起動・停止・状態確認などの操作を行なえます。

まずはBINDの状態を確認します。状態確認は以下のコマンドで行なえます。

# service named status
rndc: connect failed: 127.0.0.1#953: connection refused
named is stopped

「stopped」と表示されたので、現在、BINDは停止中となっています。逆に「running…」と表示されれば、BINDは既に起動中であることを示します。

BINDを起動する

BINDを起動するには以下のコマンドを実行します。

# service named start
Starting named:                            [  OK  ]

named.conf、正引き用設定ファイルや逆引き用設定ファイルなどを更新した場合、その設定を反映させるためには、BINDを再起動させる必要があります。BINDの再起動は以下コマンドで行います。

# service named restart
Stopping named:                            [  OK  ]
Starting named:                            [  OK  ]

※正引き用設定ファイルや逆引き用設定ファイルを更新した場合、必ずSOAレコードのSerialの値を加算してください。加算しないと設定がうまく反映されません。加算忘れはBINDをさわったことがあるエンジニアが一度は必ずといって良いほどやってしまうミスです。

ファイアウォール設定を確認する

CentOSの初期設定では外部からの接続はssh(22)以外を拒否する設定となっており、DNSで使用する通信(TCP:53、UDP:53)はファイアウォールでドロップされてしまいます。そのため、ファイアウォールの設定を変更する必要があります。

まずはファイアウォール(iptables)の設定を確認します。iptablesはLinuxの標準的なファイアウォール・アプリケーションです。

# service iptables status
Table: filter
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
2    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0
3    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
4    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22
5    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:80
6    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:443
7    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:81
8    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination
1    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination

上記状態では、外部からの接続はssh(22)、http(80、81)、https(443)のみ許可しており、それ以外は拒否されます。DNSの接続許可の設定を追加してみましょう。

# iptables -I INPUT 8 -p tcp --dport 53 -j ACCEPT
# iptables -I INPUT 8 -p udp --dport 53 -j ACCEPT

「-I」でチェインと番号を指定すると、指定したチェインの指定した番号にルールが挿入されます。指定した番号以降のルールは、それぞれ一つ下にずれます。番号をつけない場合は、先頭(1番)にルールを挿入されます。

続いて、変更した内容を保存します。

# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[  OK  ]

最後にもう一度iptablesの設定を確認し、上記で追加したルールが追加されていることを確認します。

# service iptables status
Table: filter
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
2    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0
3    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
4    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22
5    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:80
6    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:443
7    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:81
8    ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0           udp dpt:53
9    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:53
10   REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination
1    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination

これで、DNSでの接続が可能になりました。

/etc/resolv.confの編集

「/etc/resolv.conf」は、自身が利用するDNSサーバーの情報(IPアドレス)を記述してあるファイルのことです。今回、BINDを構築したことで自身がDNSサーバーとなったため、名前解決の際に参照するDNSサーバーを自身に設定します。

# vi /etc/resolv.conf
# Generated by NetworkManager
nameserver 172.16.0.10

nameserverディレクティブに、参照するDNSサーバーのIPアドレスを指定します。最大3行まで定義することが可能で、上から順番に利用されます。上記例では、IPアドレス「172.16.0.10」のDNSサーバーを参照するよう設定しています。

自動起動の設定

DNSサーバーは、常時稼動させておく必要があります。そのためにOS起動と同時にBINDも起動するように設定します。

# chkconfig named on

以上で自動起動するように設定されたため、CentOSを再起動しても、OS起動とともにBIND(named)が起動されるようになります。

2016年01月05日(火)|BIND DNSサーバー構築

BINDの設定(逆引き情報設定)

前回はホスト名からIPアドレスを取得するための正引き情報設定を行ないました。今回はIPアドレスからホスト名を取得するための逆引き情報設定の方法について見ていきます。設定は逆引き用設定ファイルを編集することで行ないます。

まずは作成済みの逆引き用設定ファイルを見てみましょう。当ファイルはnamed.confのopionsステートメント「directory」で指定したディレクトリに、逆引き用zoneステートメントの「file」で指定したファイル名で作成します。

# vi webtest01.com.rev
$TTL    86400
@       IN      SOA     ns.webtest01.com. root.webtest01.com.(
                                2015123105  ; Serial
                                28800       ; Refresh
                                14400       ; Retry
                                3600000     ; Expire
                                86400 )
        IN      NS      ns.webtest01.com.
10      IN      PTR     ns.webtest01.com.
1       IN      PTR     pc01.webtest01.com.
2       IN      PTR     pc02.webtest01.com.
254     IN      PTR     router.webtest01.com.

上記を見てわかるように、$TTLディレクティブ、SOAレコードやNSレコードが表す意味は正引き用設定ファイルと同じです。今回は逆引き用のPTRレコードについて見ていきます。

PTRレコード

PTRレコードは逆引き(IPアドレスからホスト名を取得する)のための情報を記述します。1つのIPアドレスは1つの正規なホスト(ドメイン)名のみに対応させます。

10      IN      PTR     ns.webtest01.com.
1       IN      PTR     pc01.webtest01.com.
2       IN      PTR     pc02.webtest01.com.
254     IN      PTR     router.webtest01.com.

PTRレコードでこのDNSサーバーが管理しているドメインのIPアドレスとホスト名の対応を記述しています。ホスト名はFQDNで記述します。

上記レコードを追加することで、例えば、IPアドレス「172.16.0.1」に対する名前解決を要求されたときホスト名「pc01.webtest01.com.」が返されるようになります。

以上で逆引き用設定ファイルの編集は完了です。

2016年01月03日(日)|BIND DNSサーバー構築

BINDの設定(正引き情報設定)

今回は正引き用設定ファイルの編集方法について見ていきます。

前回作成したnamed.conf内で定義したゾーンごとに、正引き用設定ファイルを作成します。正引き用設定ファイルでは、ホスト名とIPアドレスの対応づけを定義します。

まずは作成済みの正引き用設定ファイルを見てみましょう。正引き用設定ファイルはnamed.confのopionsステートメント「directory」で指定したディレクトリに、正引き用zoneステートメントの「file」で指定したファイル名で作成します。

# vi /var/named/webtest01.com
$TTL      86400
@         IN       SOA     ns.webtest01.com.  root.webtest01.com.(
                                        2015123105 ; Serial
                                        28800      ; Refresh
                                        14400      ; Retry
                                        3600000    ; Expire
                                        86400 )    ; Minimum
          IN NS    ns.webtest01.com.
          IN MX 10 mail.webtest01.com.
localhost IN A     127.0.0.1
ns        IN A     172.16.0.10
pc01      IN A     172.16.0.1
pc02      IN A     172.16.0.2
router    IN A     172.16.0.254

正引き用設定ファイルに登録するエントリーには、ディレクティブと資源(リソース)レコードの2種類があります。

ディレクティブ

ディレクティブは、ネーム サーバーの制御情報、およびゾーンごとのオプションを記述します。行頭がドル記号($)で始まり、その後にディレクティブの名前が続きます。

$ORIGIN

修飾指定のないレコードに付加するドメイン名を指定します。通常、$ORIGINディレクティブは省略されます。省略した場合は、zoneステートメントで指定したドメイン名(この例では「webtest01.com.」)が、$ORIGINディレクティブ値として適用されます。また、$ORIGINディレクティブに設定した値そのものを名前として利用する場合、「@」で置き換えることができます。

$TTL

$TTLディレクティブでは、当該ゾーンの各レコードの寿命(Time To Live)の値を秒単位で指定します。ここで設定した値が資源レコードの有効期間として応答メッセージ中に含まれ、応答メッセージを受信したサーバーはTTLで定められた期間、得られた情報をキャッシュします。そのため、プライマリDNSサーバー側で何らかの変更を行なった場合、すぐには反映されず、最大$TTLディレクティブで指定した時間、他のDNSサーバーに更新が反映されない可能性があります。

資源(リソース)レコード

ホスト名とIPアドレスを対応づけるための定義を記述します。
SOA、NS、Aなどの「レコード」と呼ばれる単位で記述していきます。レコードには以下のような種類があります。

レコード 意味
SOA ドメイン自体に関する情報
NS DNSサーバーの情報
A 正引きの情報
MX メールサーバーの情報
CNAME ホストの別名
PTR 逆引きの情報

SOAレコード

SOAは「Start Of Authority」の略です。直訳のとおり、権威のあるゾーンの定義を開始することを意味します。ゾーン(ドメイン)定義を宣言するレコードと考えればわかりやすいでしょう。
SOAレコードはルートゾーン用の正引き用設定ファイル(named.ca)以外のファイルで必要であり、1つのファイル中で有効なSOAレコードは1つのみとなります。SOAレコードは、ディレクティブの直後かつ資源レコードの先頭に記述します。

@         IN       SOA     ns.webtest01.com.  root.webtest01.com.(
                                        2015123105 ; Serial
                                        28800      ; Refresh
                                        14400      ; Retry
                                        3600000    ; Expire
                                        86400 )    ; Minimum

複数行にわたっていますが上記がSOAレコードの記述になります。まずはSOAレコードから見ていきます。

項目 設定値 内容
名前 @ $ORIGINディレクティブに設定した値を示す。$ORIGINディレクティブを省略した場合は、zoneステートメントで指定したドメイン名(この例では「webtest01.com.」)となる。「@」の代わり に、ゾーン名をそのまま書くことも可能。
クラス IN インターネットであることを表す「IN」を指定。
レコードの種類 SOA 本レコードがSOAレコードであることを示す。
MNAME ns.webtest01.com. 本ゾーンのプライマリーDNSサーバーをFQDNで指定。(末尾の「.」は必須)
RNAME root.webtest01.com. 本ゾーンの管理者メールアドレスをFQDNで指定。
Serial 2015123105 ゾーン情報のシリアル番号(バージョン)を指定。ゾーン情報を更新する場合はこの値を加算する。
Refresh 28800 セカンダリDNSサーバー(スレーブ)がゾーン情報の更新の有無(「SERIAL」の増加)をチェックする周期を秒単位で示す数値を指定。
Retry 14400 Refreshでゾーン情報の更新ができなかった場合の再試行周期を秒単位で指定。Retryで指定された時間後に再度リフレッシュを試みる。
Expire 3600000 何らかの理由でゾーン情報のリフレッシュができない状態が続いた場合、セカンダリDNSサーバーが持っているデータをどれだけの時間利用してもよいかを秒単位で指定。
Minimum 14400 各資源レコードのデフォルトのTTL(Time To Live=有効期間)を秒数で指定。

「Minimum」でTTL(有効期間)を指定していますが、前述の$TTLディレクティブで指定してした設定と内容がかぶっているように見えます。ただ実際は、両者が意味する内容は異なります。

TTLは、DNS問い合わせに成功したものをキャッシュ(ポジティブキャッシュ)する時間とDNS問い合わせを受けたがドメインが存在しない等の理由で失敗した結果をキャッシュ(ネガティブキャッシュ)する時間の2つのタイプに分かれます。

ポジティブキャッシュとネガティブキャッシュそれぞれの性質を考えると、同じTTLの値を使用するのはあまり都合よくありません。

そこで、BIND 8.2以降ではSOAレコードにあるTTL(Minimum)の値をネガティブキャッシュ用とし、新たに$TTLディレクティブを設けて各資源レコードのデフォルトTTLの値を指定するようにされました。また、各資源レコード内でもTTLを定義することが可能で、$TTLディレクティブの値を上書きすることができます。これにより、例えば、変更を予定しているホストに関しては、個別にTTL値を短くするなどの対応を取ることができます。

NSレコード

NSレコードには、自身が管理しているゾーンのDNSサーバーのFQDNを記述します。DNSサーバーが複数ある場合は、その数だけNSレコードが必要になります。

          IN NS    ns.webtest01.com.

NSレコードは必ず記述する必要があります。本レコードでは行頭の「名前」を省略しています。この場合、直前のレコードに利用したものを指定したことになります。つまりここではSOAレコードで指定した「@」が指定されます。

MXレコード

MXレコードには、メールサーバーのアドレスと優先順位を記述します。

          IN MX 10 mail.webtest01.com.

優先順位は数値が低いほど高く、優先順位の高いメールサーバーが停止したときに、低いサーバーをバックアップ用として利用します。上記サンプルでは1台分のみ定義し、優先順位を10としています。

Aレコード

Aレコードには、正引き(ホスト名からIPアドレスを取得する)のための情報を記述します。

localhost IN A     127.0.0.1
ns        IN A     172.16.0.10
pc01      IN A     172.16.0.1
pc02      IN A     172.16.0.2
router    IN A     172.16.0.254

AレコードでこのDNSサーバーが管理しているドメインのホスト名とIPアドレスの対応を記述しています。ドメイン名は省略しても構いません。

これで例えば、ホスト名「pc01.webtest01.com.」に対する名前解決を要求されたときIPアドレス「172.16.0.1」が返されるようになります。

以上で正引き用設定ファイルの編集は完了です。次回は逆引き用設定ファイルの編集方法について見ていきます。

2016年01月02日(土)|BIND DNSサーバー構築

BINDの設定(named.conf)

BINDを使用してDNSサーバーを構築するためには、まず以下3つの設定ファイルを編集する必要があります。

  • BIND自体の基本設定ファイル(named.conf)
  • 正引き用設定ファイル
  • 逆引き用設定ファイル

今回はBIND自体の基本設定ファイル(named.conf)の編集方法について見ていきます。

DNSサーバー配置概要

設定方法について見ていく前に、今回構築していくDNSサーバーの配置概要図を以下に示します。
DNSサーバー構築概要図

今回は、上図の「内部DNSサーバー」を構築します。ポイントとしては、内部DNSサーバーからインターネット上のDNSサーバーに対して、DNS問い合わせは可能となるようにしますが、インターネット上から内部DNSサーバーに対して、DNSの問い合わせはできない構成となるようにします。

named.conf

named.confはDNSサーバー(BIND)全体の基本になる設定ファイルです。DNSサーバー自体の設定の他、正引き用設定ファイルや逆引き用設定ファイルのパスなどを指定します。

まず一度、設定済みのnamed.confを見てみましょう。

# cat /etc/named.conf
options {
    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     { 127.0.0.1;
                      172.16.0.0/24;
     };
//  allow-transfer{
//         127.0.0.1;
//  };
    forwarders{
            172.16.0.254;
    };

};

logging {
    category lame-servers { null; };
};

zone "webtest01.com" IN {
    type master;
    file "webtest01.com";
    allow-update { none; };
};
zone "0.16.172.in-addr.arpa" IN {
    type master;
    file "webtest01.com.rev";
    allow-update { none; };
};

named.confでは、3つのステートメントで構成されます。

ステートメント 概要
opions BIND全体にかかわる設定項目を定義する。optionsステートメントで設定した一部内容はzoneステートメントにも反映される。
logging DNSサーバーのログ出力に関する設定項目を定義する。
zone ゾーンを宣言し、ゾーンファイルへのパスを設定する。また、そのゾーン固有の各種オプション設定(リカーションの可否、クエリーやゾーン転送の許可など)を設定する。

zoneステートメントでは複数のゾーンを定義できますが、各ゾーンで同じ設定となる項目は、opionsステートメントでまとめて設定することができます。それにより、同じ設定項目を各ゾーンごとに記述する必要がなくなります。(ゾーンとはDNSサーバーがドメインを管理する範囲のことです。厳密には違いますが、ここでは「1ゾーン=1ドメイン」と考えてください。)

opionsステートメント

設定項目はたくさんありますが、ここでは必要最低限な項目のみ見ていきます。

options {
    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     { 127.0.0.1;
                      172.16.0.0/24;
     };
//  allow-transfer{
//         127.0.0.1;
//  };
    forwarders{
            172.16.0.254;
    };

};
設定項目 概要
directory zoneステートメントの中に出てくる設定ファイルのディレクトリパスやnamedデーモンのワークディレクトリを指定。
dump-file キャッシュ内容を保存するファイルのパスを指定(rndcで利用)。
statistics-file rndcを使ってステータス情報を要求した際に統計情報が追記されるファイルのパスを指定。
memstatistics-file サーバー終了時にメモリ使用統計について出力するファイルのパスを指定(rndcで利用)。
allow-query DNSクエリ(問い合わせ)を許可するホストもしくはネットワークを指定。
allow-transfer ゾーン転送を許可するホストを指定(通常はセカンダリDNSサーバーを指定)。
forwarders 自身で解決できない問い合わせを転送するフォワーダーを指定。

DNSサーバーは通常、プライマリとセカンダリの2つ以上必要となります。これは、DNSがドメインや各ホストに関する情報を管理する基本的なサービスであり、常に動作していないといけないからです。複数のDNSサーバーは同じ内容を持っていなければいけません。情報を管理し更新するDNSサーバーをプライマリDNSサーバーと呼び、プライマリDNSサーバーの内容を自動的にコピーして情報を管理するDNSサーバーをセカンダリDNSサーバーと呼びます。「allow-transfer」にはセカンダリDNSサーバーを指定しますが、今回はサンプルであり、DNSサーバーを1台しか構築しないため、コメントアウトしておきます。(行頭に「//」と記述することでその行はコメントとなります。)

また、上記サンプルではフォワーダ機能を使用し、自身のDNSで解決できない問い合わせを「forwarders」に指定したDNSサーバーに転送するようにしています。通常、ルーターやプロバイダのDNSサーバーをフォワーダとして指定します。

loggingステートメント

BINDはこれまで数々の脆弱性が発見され、その度に緊急のアップデートを繰り返しています。シェアが群を抜いて高いこともあり、ハッカーにも狙われやすく、当たり前のことですがセキュリティに関しては高い意識を持つ必要があります。

loggingステートメントでは、ロギング機能の設定を行ないます。

BINDで適切なログを収集、監視し、攻撃の意思を持つアクセスを特定できるようにしておくことは管理者として必須な作業です。

と、大げさに前振りしましたが今回構築するDNSサーバーは(アドレス変換を行なう)ルーター配下に配置するため、外部からアクセスされることはありません。そのためここではロギングに関する設定は特に行ないません。

ただし、IPアドレスからホスト名を逆引きできなかった場合に出力される「lame server resolving …」というログを出力しないように「category lame-servers」をnullで指定します。

logging {
    category lame-servers { null; };
};

zoneステートメント

zoneステートメントではゾーンの宣言を行ないます。

ホスト名からIPアドレスを取得するための正引き用のゾーン設定を以下で行なっています。

zone "webtest01.com" IN {
    type master;
    file "webtest01.com";
    allow-update { none; };
};

webtest01.comドメインのためのゾーンを設定します。

設定項目 概要
type マスター/スレーブの関係を指定。プライマリDNSサーバーの場合は「master」、セカンダリDNSサーバーの場合は「slave」を指定。
file 正引き用設定ファイルのパスを指定。
allow-update ゾーン情報の更新を許可するホストもしくはネットワークを指定。

次にIPアドレスからホスト名を取得するための逆引き用のゾーン設定を行ないます。

zone "0.16.172.in-addr.arpa" IN {    //ネットワークアドレスを逆にした数値を入力
    type master;
    file "webtest01.com.rev";
    allow-update { none; };
};

設定項目は正引き用の内容と同じです。
決まりではありませんが、逆引き用設定ファイルの名前は正引き用設定ファイルの後ろに「.rev」を付加するのが慣習となっています。

以上でBIND自体の基本設定ファイル(named.conf)の編集は完了です。ただ、完了といってもあくまで基本的な部分のみの設定のみです。named.confには他にも様々な設定項目があり、非常に奥が深いです。一度に全て覚えようとせず、まずは動くものを構築するのが大切でしょう。

次回は正引き用設定ファイルの編集方法について見ていきます。

2016年01月01日(金)|BIND DNSサーバー構築

BINDのインストール

BINDをインストールするには、ソースアーカイブをダウンロードしてビルドする方法と、バイナリパッケージを利用する方法があります。

通常はパッケージ管理ユーティリティ(yumやrpm等)を利用できるバイナリパッケージをインストールします。

ここではyumを使用して、BINDをインストールします。以前はcaching-nameserver(キャッシュネームサーバー)というパッケージがあり、それも併せてインストールする必要がありましたが、最新バージョンのBINDでは左記パッケージも含まれるようになったため、インストールは不要です。caching-nameserverは、1度問い合わせを行うと一定期間、その結果をローカルに記憶しておきます。

# yum -y install bind
Loaded plugins: fastestmirror, refresh-packagekit, security
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * extras: ftp.iij.ad.jp
 * updates: ftp.iij.ad.jp
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package bind.i686 32:9.8.2-0.17.rc1.el6_4.6 will be installed

~ 省略 ~

Installed:
  bind.i686 32:9.8.2-0.17.rc1.el6_4.6

Dependency Installed:
  portreserve.i686 0:0.0.4-9.el6

Dependency Updated:
  bind-libs.i686 32:9.8.2-0.17.rc1.el6_4.6
  bind-utils.i686 32:9.8.2-0.17.rc1.el6_4.6

Complete!

以上でBINDのインストールは完了です。yumを使用すると上記のようにインストールは簡単に行なえます。

次回からはBINDの設定方法について見ていきます。

2015年12月31日(木)|BIND DNSサーバー構築

DNSの仕組み

今回からはDNSサーバーを構築していきます。構築する前にまずは前提となる基礎知識から見ていきます。

DNSとは

DNS(Domain Name System)とは、インターネットなどのTCP/IPネットワーク上でホスト名やドメイン名とIPアドレスの対応関係を管理するシステムのことです。

つまり、一言で表すと「インターネットにおける電話帳のようなもの」です。

例えば、Googleにアクセスしたいとき、実アドレスである74.125.153.103をブラウザのアドレスバーに打ち込む人はいないと思います。「google.jp」または「google.co.jp」などと入力するはずです。
クライアントはこの名前をDNSサーバーに問い合わせ、対応するIPアドレスを取得・接続します。その結果、ユーザーはWebサイトの実アドレスを意識せずコンテンツを閲覧できるというわけです。

ホスト名もしくはドメイン名からIPアドレスへ変換することを名前解決と言います。

問い合わせを出すソフトウェアを「リゾルバ」と言い、その問い合わせに返信するのが「DNSサーバー」となります。

FQDNとは

「ホスト名」や「ドメイン名」といった用語についても整理しておきます。

ドメイン名とは、ネットワーク内にあるコンピュータや機器(ホスト)の所属を表すものです。そのドメインの中からひとつのホストを表すものがホスト名です。

FQDN(Fully Qualified Domain Name)とは、ホスト名、ドメイン名(サブドメイン名)などすべてを省略せずに指定した記述形式のことです。例えば、FQDN「www.yahoo.co.jp.」は、ホスト名「www」、ドメイン名「yahoo.co.jp」という関係になります。
FQDN

なお、FQDNを正確に記述する場合、一番右端に「.(ピリオド)」を付ける必要があります。このピリオドは、ルート・ノードを示していますが、省略されることがほとんどです。

BINDとは

BINDとは、最も広く普及しているDNSサーバーソフトウェアの一つです。

Windows Serverに含まれるMicrosoft DNSサーバーなどもありますが、BINDはDNSサーバー実装の事実上の標準として幅広く使われています。

BINDの特徴として以下が挙げられます。

  • DNSサーバー実装の事実上の標準
  • DNSの仕様として規定されているほとんどの機能を実装しており高機能
  • サーバー向けOSパッケージなどでは標準のDNSサーバーとして同梱されている
  • オープンソースソフトウェアとして公開されており、誰でも自由に入手、利用、改変、再配布などが可能

設定が複雑で導入・管理が比較的難しいことや、広く普及していることもあり攻撃の標的となりなすいなどの面もあります。

Apacheなどと同じでデーモン(常駐プログラム)として動作し、プロセス名は「named」となります。

DNSの名前解決方法

DNSの名前解決方法には「再帰問い合わせ」と「反復問い合わせ」の2種類があります。

再帰問い合わせ リゾルバからの問い合わせを受けたDNSサーバーが、他のDNSサーバーに問い合わせを行いその最終的な結果をリゾルバに応答する問い合わせのこと。
反復問い合わせ リゾルバから再帰問い合わせを受けたDNSサーバーが、再帰問い合わせの結果を返すために、答えを得られるまで繰り返し他のDNSサーバへ行う問い合わせのこと。

例えば、WebブラウザにURLを入力し、あるWebサイトを表示しようとした場合、Webブラウザに実装されるリゾルバがDNSサーバーに名前解決を依頼します。
DNSの名前解決方法

パソコンのリゾルバが出した問い合わせは、最終的な答えを要求するタイプであり、再帰問い合わせを行ないます。再帰問い合わせを受け取ったDNSサーバーは、自分で調べて答えを返信しなければなりません。

これに対して上図で言う社内DNSサーバーのリゾルバが出した問い合わせは、必ずしも最終的な答えを要求するものではありません。もし、問い合わせたDNSサーバーが答えを知らなかったら、知ってそうな別のDNSサーバーのIPアドレスを教えてもらいます。この問い合わせを繰り返すことで、最後に答えを知っているDNSサーバーにたどり着くというわけです。このような問い合わせを反復問い合わせといいます。

DNSフォワーダ

フォワーダ機能を使用すると、自身のDNSで解決できない問い合わせをフォワーダに指定したDNSサーバーに転送することができます。
例えば、外部に公開したくない社内専用のDNSサーバーがあったとします。その社内専用DNSサーバーが答えられない名前解決の問い合わせが来た場合、外部へ抜けられるDNSサーバーへその問い合わせを転送してやります。あとは、転送先のDNSサーバーが答えを返してくれるのを待ち、返ってきたら、自身が受けた問い合わせ元へ結果を返してやるという仕組みです。

フォワーダの指定先は一般的にプロバイダのDNSサーバーになります。なお、フォワーダを指定しない場合は、自身が知っている範囲でしか応えられません。

2015年11月29日(日)|BIND DNSサーバー構築

サイト内検索

カテゴリー

  • Apache2.2構築
  • BIND DNSサーバー構築
  • Linux基礎知識
  • NTPサーバー構築
  • vsftpd FTPサーバー構築

サイト情報

  • 当サイトについて
  • 免責
  • お問い合わせフォーム
  1. CentOSサーバー構築入門
  2. BIND DNSサーバー構築の記事一覧

CentOSサーバー構築入門

CentOSによるサーバー構築方法をわかりやすく解説しています。
  • 特定商取引法に基づく表示
  • 運営者情報
  • お問い合わせ
  • サイトマップ
  • twitter
  • facebook
  • Google +1
  • RSS
Copyright ©2025 CentOSサーバー構築入門 All Rights Reserved.

[↑]このページの先頭へ