DNSサーバ構築

#目的
開発環境用にDNSサーバを構築する。
#方法
Bindを使用し、接続を限定的にする。
#環境
* Amazon Linux AMI release 2015.03
* bind-9.8.2-0.30.rc1.38.amzn1.x86_64

#設定
##named.confバックアップ
`# cp /etc/named.conf /etc/named.conf.bak`
##named.conf設定
###named.confはBind全体の設定ファイルです。
1. ”hosts”というaclを作成し、問い合わせ・再帰的問い合わせを限定的にする。（FWでも53番ポートは限定的開放にする。）
2. zoneステートメントでは動的更新を明示的に無効としておき、zoneファイルをフルパスで記述。
3. notifyオプションではゾーンファイルが更新された場合、SOAレコードに記述したrefresh間隔とは別に、マスターサーバからスレーブサーバにNOTITYメッセージを出し、NOTITYメッセージを受信したスレーブサーバはマスターサーバに対してゾーン転送要求する。マスターサーバはスレーブサーバからの要求を確認し、ゾーン転送を行う。also-notifyオプションはNSレコードに記述していないサーバへのゾーン転送を行う。

```named.conf
acl     "hosts" { localhost; localnets; IPアドレス; };
options {
        listen-on port 53 {　any;　};
        listen-on-v6 port 53 { ::1; };
        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     { hosts; };
        allow-recursion { none; };

        dnssec-enable yes;
        dnssec-validation yes;
        dnssec-lookaside auto;
        /* 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;
        };
};

zone "." IN {
        type hint;
        file "named.ca";
};

zone "example.com" IN {
        type master;
        file "/var/named/hoge.example.com.zone";
        allow-update { none; };
        notify { yes; };
        also-notify { NSレコードに記述していないDNSサーバのIPアドレス； };
};

include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
```

##zoneファイル設定
###zoneファイルはBindが管理するゾーンの情報を記述されたファイルです。
1.zoneファイル作成(非省略形)

`# touch /var/named/hoge.example.com.zone`

```hoge.example.com.zone
$TTL 1D
example.com.       IN      SOA     ns.example.com. root.example.com. (
                                        2015081101      ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H      ; minimum
)
example.com.           IN      NS      ns.example.com.
ns.example.com.        IN      A       ***.***.***.***
hoge.example.com.      IN      A       ***.***.***.***
```

* SOAはこのゾーンの権限を持つことを宣言している。それに続いて管理者のメールアドレスを[@]を[.]に置換して記述する。
* シリアルは年/月/日/番号で記述し、同日にファイル更新した場合、番号をインクリメントすること。
* NSレコードにマスターサーバを指定。（スレーブがある場合はその台数分記述する）
* DNSサーバと名前解決したいサーバのAレコードを記述
* ドメインの記述はルートを指す(.)を書く。

2.zoneファイル作成(省略形)
`# touch /var/named/hoge.example.com.zone`

```hoge.example.com.zone
$TTL 1D
$ORIGIN example.com
@       IN      SOA     ns.example.com. root.example.com. (
                                        2015081101      ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H      ; minimum
)
@           IN      NS      ns
ns          IN      A       ***.***.***.***
hoge        IN      A       ***.***.***.***
```

* ORIGINも省略可能。その場合はnamed.confで指定したゾーン名がORIGINになる。
* ドメインの記述はルートを指す(.)を書かない。

##フルサービスリゾルバ設定
Bindにはスタブリゾルバ機能はないので、Linuxのスタブリゾルバを利用する。
自分自身がフルサービスリゾルバになるようにローカル・ループバック・アドレスを記述する。

```/etc/resolv.conf
; generated by /sbin/dhclient-script
search ap-northeast-1.compute.internal
#nameserver ***.***.***.***
nameserver 127.0.0.1
```


##構文チェック
`# /usr/sbin/named-checkconf /etc/named.conf`

```
# /usr/sbin/named-checkzone example.com /var/named/hoge.example.com.zone
zone hoge.example.com/IN: loaded serial 2015081101
OK
```

##サービス起動
`# service named start`

##動作確認
1.  DNSサーバが機能しているか
2.  同じネットワークに存在するクライアントから正引きできるか
3.  異なるネットワークに存在するクライアントから正引きできるか。

###DNSサーバが機能しているか

```
# dig @127.0.0.1 hoge.example.com

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.30.rc1.38.amzn1 <<>> @127.0.0.1 hoge.example.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 18457
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1

;; QUESTION SECTION:
;hoge.example.com.            IN      A

;; ANSWER SECTION:
hoge.example.com.     86400   IN      A       ***.***.***.***

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

;; ADDITIONAL SECTION:
ns.example.com.        86400   IN      A       ***.***.***.***

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Tue Aug 11 04:07:37 2015
;; MSG SIZE  rcvd: 85

```

###同じネットワークに存在するクライアントから正引きできるか

```
$ dig @***.***.***.*** hoge.example.com

; <<>> DiG 9.9.5-3ubuntu0.4-Ubuntu <<>> @***.***.***.*** hoge.example.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 12828
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;hoge.example.com.            IN      A

;; ANSWER SECTION:
hoge.example.com.     86400   IN      A       hoge.example.com

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

;; ADDITIONAL SECTION:
ns.example.com.        86400   IN      A       ***.***.***.***

;; Query time: 3 msec
;; SERVER: ***.***.***.***#53(***.***.***.***)
;; WHEN: Tue Aug 11 13:33:53 JST 2015
;; MSG SIZE  rcvd: 96
```

###異なるネットワークに存在するクライアントから正引きできるか。

```
C:>nslookup
既定のサーバー:  ****.***.ne.jp
Address:  ***.***.***.***
> server ***.***.***.***
既定のサーバー:  ec2-***.***.***.***.ap-northeast-1.compute.amazonaws.com
Address:  ***.***.***.***
> hoge.example.com
サーバー:  ec2-***.***.***.***.ap-northeast-1.compute.amazonaws.com
Address:  ***.***.***.***
名前:    hoge.example.com
Address:  ***.***.***.***
```

* インターネットDNSとして運用するのであれば、レジストラに構築したDNSサーバを登録する。