初めまして。エンジニアの阿久津です。
今回は社内でDNSサーバを構築する機会がありましたのでそれを記事にしたいと思います。
概要
CentOS6にBINDをインストールし、DNSサーバ(内部向け用)を構築します。
自身のクライアントPCからDNSサーバに問い合わせて、名前解決ができるところまでがゴールになります。
環境
- 物理サーバ
- CentOS release 6.9 (Final)
- BIND 9.8.2
BINDインストール
インストール
$ sudo yum install bind
確認
以下のように表示されればインストールが完了しています。
$ yum list installed | grep bind bind.x86_64 32:9.8.2-0.62.rc1.el6_9.4 bind-libs.x86_64 32:9.8.2-0.62.rc1.el6_9.4
設定ファイル(named.conf)の編集
BINDのメインの設定ファイルは”named.conf”です。
CentOS6にBINDをyumでインストールした場合は、”/etc/named.conf”が設定ファイルになります。
セキュリティを意識する場合は、chrootをすることをおすすめします。
※編集前にバックアップはとっておきましょう
$ sudo vi /etc/named.conf
// // named.conf // // Provided by Red Hat bind package to configure the ISC BIND named(8) DNS // server as a caching only nameserver (as a localhost DNS resolver only). // // See /usr/share/doc/bind*/sample/ for example named configuration files. // options { #DNSサーバの待ち受けIPアドレスの設定 listen-on port 53 { 127.0.0.1; 172.16.11.1; #DNSサーバのプライベートIPを指定 }; #listen-on-v6 port 53 { ::1; }; #IPv6は使用しないためコメントアウト 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 { localhost; }; recursion yes; dnssec-enable yes; dnssec-validation yes; /* Path to ISC DLV key */ bindkeys-file "/etc/named.iscdlv.key"; managed-keys-directory "/var/named/dynamic"; }; logging { channel default_debug { file "data/named.run"; severity dynamic; }; }; #ローカルネットワークを定義する acl localnet { 172.16.11.0/24; #DNSサーバが所属するネットワークを定義 172.16.12.0/24; #自身のクライアントPCが所属するネットワークを定義 }; #内部向け用の記述 view "internal" { match-clients { localnet; }; #定義したローカルネットワークに合致した場合、view内の処理をする allow-query { localnet; }; #定義したローカルネットワークのみ問い合わせを許可する zone "." IN { type hint; file "named.ca"; }; #正引きゾーン zone "example.com" IN { type master; file "/etc/named/example.com.zone"; }; #逆引きゾーン zone "11.16.172.in-addr.arpa" IN { type master; file "/etc/named/11.16.172.zone"; }; include "/etc/named.rfc1912.zones"; include "/etc/named.root.key"; };
ゾーンファイルの作成
正引きゾーンファイル作成
$ sudo vi /etc/named/example.com.zone
$TTL 86400 @ IN SOA dns.example.com. root.example.com.( 2017092701 ; Serial 10800 ; Refresh 3600 ; Retry 3600000 ; Expire 3600 ; Negative Cashe TTL ) IN NS dns.example.com. test1 IN A 172.16.11.2 test2 IN A 172.16.11.3
$TTL 86400
このゾーンの内容が他のDNSサーバーにキャッシュされる時間を表します。今回だと86400秒(1日)となります。
@
ゾーン基点を表します。今回だと自分自身(example.com)が基点となります。
@ではなく「example.com.」と記述してもOKです。
IN
決まり文句となります。「InterNet」を意味しています。
SOA dns.example.com. root.example.com.
SOAレコード。「Start Of Authority」の略で、権威を持つゾーンの開始を表します。
今回だとプライマリサーバは「dns.example.com」、管理者のメールアドレスは「root.example.com」となります。
2017092701 ; Serial
ゾーンファイルのシリアル番号を表します。「年月日+通し番号」が一般的になります。
10800 ; Refresh
セカンダリサーバがゾーンデータの更新をチェックする時間(秒)。今回だと10800秒(3時間)になります。
3600 ; Retry
プライマリサーバが応答しない時に再度接続を試みるまでの時間(秒)。今回だと3600秒(1時間)になります。
3600000 ; Expire
セカンダリサーバが、プライマリサーバにアクセスできない状態が続いた場合、ゾーンデータを無効にするまでの時間(秒)。今回だと3600000秒(1000時間)になります。
3600 ; Negative Cashe TTL
存在しないドメインを問い合わせた時は、そのドメインが存在しないということを一定期間キャッシュする時間(秒)。今回だと3600秒(1時間)になります。
IN NS dns.example.com.
NSレコード。今回だと「dns.example.com.」という名前にしています。
test1 IN A 172.16.11.2
Aレコード。今回だと「test1.example.com」は 172.16.11.2 であることを表します。
test2 IN A 172.16.11.3
Aレコード。今回だと「test2.example.com」は 172.16.11.3 であることを表します。
逆引きゾーンファイル作成
$ sudo vi /etc/named/11.16.172.zone
$TTL 86400 @ IN SOA dns.example.com. root.example.com.( 2017092701 ; Serial 10800 ; Refresh 3600 ; Retry 3600000 ; Expire 3600 ; Negative Cashe TTL ) IN NS dns.example.com. 2 IN PTR test1.example.com. 3 IN PTR test2.example.com.
$TTL 86400 〜 IN NS dns.example.com.
正引きゾーンファイルと同様です。
2 IN PTR test1.example.com.
PTRレコード。今回だと 172.16.11.2 は 「test1.example.com.」 であることを表します。
3 IN PTR test2.example.com.
PTRレコード。今回だと 172.16.11.3 は 「test2.example.com.」 であることを表します。
BIND起動
起動
$ sudo service start named
名前解決確認
digコマンドを使います。インストールしていない場合は、bind-utilsでインストールしてください。
インストール
$ sudo yum install bind-utils
確認
$ yum list installed | grep bind-utils bind-utils.x86_64 32:9.8.2-0.62.rc1.el6_9.4
正引き確認
「test1.example.com」のIPを知りたい場合
$ dig test1.example.com ; <<>> DiG 9.8.3-P1 <<>> test1.example.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 40332 ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 0 ;; QUESTION SECTION: ;test1.example.com. IN A ;; ANSWER SECTION: test1.example.com. 86400 IN A 172.16.11.2 ;; AUTHORITY SECTION: example.com. 86400 IN NS dns.example.com. ;; Query time: 7 msec ;; SERVER: 172.16.11.2#53(172.16.11.2) ;; WHEN: Mon Oct 30 20:28:49 2017 ;; MSG SIZE rcvd: 81
ANSWER SECTIONを見ると、正引きゾーンファイルで設定したIPが返ってきているのがわかりますね。
逆引き確認
「172.16.11.2」のドメインを知りたい場合
$ dig -x 172.16.11.2 ; <<>> DiG 9.8.3-P1 <<>> -x 172.16.11.2 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 35024 ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 0 ;; QUESTION SECTION: ;2.11.16.172.in-addr.arpa. IN PTR ;; ANSWER SECTION: 2.11.16.172.in-addr.arpa. 86400 IN PTR test1.example.com. ;; AUTHORITY SECTION: 11.16.172.in-addr.arpa. 86400 IN NS dns.example.com. ;; Query time: 3 msec ;; SERVER: 172.16.11.2#53(172.16.11.2) ;; WHEN: Mon Oct 30 19:13:18 2017 ;; MSG SIZE rcvd: 104
ANSWER SECTIONを見ると、逆引きゾーンファイルで設定したドメインが返ってきているのがわかりますね。
まとめ
今回はCentOS6にBINDをインストールし、DNSサーバ(内部向け用)を構築しました。
DNSサーバを構築する機会はなかなかないと思いますので、とても良い経験になったと思います。
今度はAWSのRoute53も機会を見つけて触ってみようと思います。
Wedding Parkでは一緒に技術のウエディングパークを創っていくエンジニアを募集しています。
興味のある方はぜひ一度気軽にオフィスに遊びにいらして頂ければと思います。