初めまして。エンジニアの阿久津です。
今回は社内で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では一緒に技術のウエディングパークを創っていくエンジニアを募集しています。
興味のある方はぜひ一度気軽にオフィスに遊びにいらして頂ければと思います。

IT×ブライダルで業界を変える!プロフェッショナルなWEBエンジニア募集!

Join Us !

ウエディングパークでは、一緒に働く仲間を募集しています!
ご興味ある方は、お気軽にお問合せください(カジュアル面談から可)

採用情報を見る