BINDのDNSテスト環境構築メモ

## BINDのDNSテスト環境構築メモ

CentOS上にBINDのDNSテスト環境を構築した際のメモを残します。
また本DNSサーバのMXレコードを参照しメールを配送するPostfixを構築し、以下エントリで構築したテスト環境Postfixにメールを配送します。

https://qiita.com/keikmobile/items/2440ecebdd02adccc6a1

### BINDのDNSテスト環境目的

本テスト環境の目的は、環境内部からのDNSによる名前解決、およびBINDの動作確認です。
以下の動作が確認可能な環境の構築および動作確認を行います。

* DNSレコードのdigコマンドからの参照

本エントリでは、以下で構築したOSX上のCentOS6に構築します。
https://qiita.com/keikmobile/items/2c1cec8b875387a83a71
SElinuxは無効とすることを前提としています。

### BINDのDNSテスト環境・動作確認方針

上記目的を実現するためのDNS環境構成・設定値・動作確認の方針・前提条件を記述します。

#### DNSテスト環境プロセス構成方針

本DNSテスト環境は以下のプロセス構成をとる方針とします。

 * 上記のプロセスは全て同一のCent OS上に構成する。
 * 以下は各コンポーネントのイメージ。(http://plantuml.com/)

![SoWkIImgAStDuOfEoKpNoIlEoS_FBYs8LT0joapFAD6rKuZEIynDJObLi59myGjMA2nDBQhaYYxEBIdGBSulBKfErIb9pSbBBK7M4P1VN9AMMG7I4-mR4i254D0jBS1b948Dt1o8BPbvsJ2J53I2KdCIApMv75BpKe2E1W00.png](https://qiita-image-store.s3.amazonaws.com/0/22861/637c9fbb-da3e-f47f-c0c0-78528c475115.png)

```
@startuml
[dig,nslookup] -right-> [named] : DNS query
[smtp-source,telnet] -right-> [Postfix] : SMTP
[Postfix] -up-> [named] : DNS query
[Postfix] -right-> [smtp-sink] : SMTP (Relay)
@enduml
```

#### DNSテスト環境設定構成方針

BINDの振る舞いを設定する設定値は以下の方針で決定します。

* ドメインはexample.comを使用する。(https://tools.ietf.org/html/rfc2606#section-3)
* DNSサーバは、テスト環境からのみ参照可能とする。
* 再帰的クエリーを無効とします。

#### 動作確認方針

本テスト環境の動作確認は以下の方針で実施します。

* DNSサーバの動作の確認を行う。以下の確認観点で行う。
 * digコマンドの応答を確認する。

### BINDのDNSテスト環境構築手順

#### BINDのインストール

yumでbindをインストールし、rpmでインストールされたことを確認します。digコマンドもインストールされます。
chkconfigで起動設定を有効化します。

```
$ sudo yum -y install bind
...
$ rpm -qa | egrep 'bind'
...
$ chkconfig named on
```

### BINDの設定(named.conf)

前述のBIND設定構成方針に従い、BINDの設定を行います。
named.cfの以下設定値を書き換えます。

* /etc/named.comf

本設定ではoptionsステートメント、zoneステートメントを編集します。

optionsステートメント

|設定               |設定値                  |Note            |
|:-----------------|:----------------------|:---------------|
| listen-on        |port 53 { 127.0.0.1; };|DNSサーバのインターフェース、ポートを指定します。<BR>テスト環境からのみの参照とするため、インターフェースは127.0.0.1を指定します。ポートは53を指定します。|
| allow-query      |{ localhost; };        |DNSクエリを許可するホストを指定します。<BR>ローカルのみ許可するためlocalhostを指定します。|
| recursion        |no;                    |再帰的クエリの有効無効を指定します。無効とするためnoを指定します。|

```
options {
	listen-on port 53 { 127.0.0.1; };
#	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     { localhost; };
	recursion no;

	dnssec-enable yes;
	dnssec-validation yes;

	/* Path to ISC DLV key */
	bindkeys-file "/etc/named.iscdlv.key";

	managed-keys-directory "/var/named/dynamic";
};
```

zoneステートメント

```
zone "example.com" IN {
        type master;
        file "/var/named/example.com.zone";
};
```

* /var/named/example.com.zone

/etc/named.confのzoneステートメントで記述したexample.comのゾーンファイルを作成します。

```
$TTL 86400
@       IN SOA example.com. example.com(
                            2018010901      ; Serial
                            10800           ; Refresh
                            3600            ; Retry
                            3600000         ; Expire
                            3600            ; Negative Cashe TTL
)
        IN NS example.com.
@       IN MX 10 mail.example.com.
@       IN TXT "v=spf1 ip4:192.168.33.10 -all" ; SPF record
@       IN A  192.168.33.10
```

### namedの再起動

serviceコマンドでnamedの再起動を行います。

```
$ sudo service named restart
```

### BINDのDNSサーバ動作確認

digコマンドでexample.comのDNSレコードが参照可能であることを確認します。

```
$ dig @127.0.0.1 example.com any

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.62.rc1.el6_9.5 <<>> @127.0.0.1 example.com any
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 5289
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 0, ADDITIONAL: 1

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

;; ANSWER SECTION:
example.com.		86400	IN	SOA	example.com. example.com.example.com. 2018010901 10800 3600 3600000 3600
example.com.		86400	IN	NS	example.com.
example.com.		86400	IN	MX	10 mail.example.com.
example.com.		86400	IN	TXT	"v=spf1 ip4:192.168.33.10 -all"
example.com.		86400	IN	A	192.168.33.10

;; ADDITIONAL SECTION:
example.com.		86400	IN	A	192.168.33.10

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Mon Sep 17 14:32:31 2018
;; MSG SIZE  rcvd: 186

$
```