CentOS_DNSServer構築

BINDを使って、権威サーバー＋キャッシュサーバーの機能を併せ持ったDNSServerを構築記録を残します。
## 環境情報
CentOS-8.5.2111
|パッケージ名  |バージョン  |
|---|---|
|bind-utils  |9.11.26-6.el8.x86_64|
|bind  |9.11.26-6.el8.x86_64|
|bind-chroot  |9.11.26-6.el8.x86_64|

* DNS_Server
  * ipv4　192.0.2.1/24
  * inet6 2001:0db8:ffff:ffff:ffff:ffff:ffff:fffa/96(a.f.f.f.f.f.f.f. f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.8.b.d.0.1.0.0.2)
* 外部dns　8.8.8.8 1.1.1.1
* clientIP 192.0.2.2/24 192.0.2.3/24

## BINDパッケージインストール
bind-chrootはchroot化する設定だが、実際chroot化した影響でエラーが出たりしたので、使わなかった。
```
yum -y install bind bind-chroot bind-utils
```

## etc/named.confの設定
```php:# cat /etc/named.conf

options {
        //listen-on port 53 { 127.0.0.1; };
        listen-on port 53 { 192.0.2.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";
        recursing-file  "/var/named/data/named.recursing";
        secroots-file   "/var/named/data/named.secroots";
        //allow-query     { 127.0.0.1; };
        allow-query     { 192.0.2.2; 192.0.2.3; };

        /*
         - If you are building an AUTHORITATIVE DNS server, do NOT enable recursion.
         - If you are building a RECURSIVE (caching) DNS server, you need to enable
           recursion.
         - If your recursive DNS server has a public IP address, you MUST enable access
           control to limit queries to your legitimate users. Failing to do so will
           cause your server to become part of large scale DNS amplification
           attacks. Implementing BCP38 within your network would greatly
           reduce such attack surface
        */
        recursion no;

        dnssec-enable yes;
        dnssec-validation no;

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

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

        pid-file "/run/named/named.pid";
        session-keyfile "/run/named/session.key";
};

logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
};

zone "test.co.jp" IN {
        type master;
        file "test.co.jp";
        allow-update { none; };
};

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

zone "f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.8.b.d.0.1.0.0.2.ip6.arpa" {
        type master;
        file "f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.8.b.d.0.1.0.0.2.ip6.arpa";
        allow-update { none; };
};

zone "f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.8.b.d.0.1.0.0.2.ip6.int." {
        type master;
        file "f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.8.b.d.0.1.0.0.2.ip6.arpa";
        allow-update { none; };
};

include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
```
外部DNSサーバーに問い合わせる機能を付けたい場合は、
recursion yes;
forwarders { 8.8.8.8; 1.1.1.1; };　を指定する。

送信元アドレス許可設定はallow-query
(再起問い合わせ許可　allow-recursion { xxxxxxx; }; )

allow-query { any;};
すべてのIPからDNSの問い合わせに応答する

allow-query { trust;};
許可リストを作成する

```php:許可リスト作成の例
allow-query { trust;};
    acl trust {
        192.168.1.0/24;
        localhost;
    };
```


## 正引きゾーンファイル設定
ゾーンファイルは/var/named配下に配置。
ホスト名からipアドレスを検索。
SOAの隣はDNSサーバのホスト名。さらにその隣に管理者メールアドレス。
```php:# cat test.co.jp
$TTL 3600
@                IN      SOA www.test.co.jp. root.test.co.jp. (
                         2019110401 ; serial
                         3600       ; refresh 1hr
                         900        ; retry 15min
                         604800     ; expire 1w
                         86400      ; min 24hr
)

                 IN      NS     www.test.co.jp.
www              IN      A      198.51.100.1
test6            IN      AAAA   2001:0db8:ffff:ffff:ffff:ffff:ffff:fffa
exam.test.co.jp. IN      CNAME  www.test.co.jp.
```

## 逆引きゾーンファイル設定
ipアドレスからホスト名を検索。
```php:# cat 100.51.198.in-addr.arpa.rev
$TTL 3600
@                IN      SOA www.test.co.jp. root.test.co.jp.  (
                         2019110401 ; serial
                         3600       ; refresh 1hr
                         900        ; retry 15min
                         604800     ; expire 1w
                         86400      ; min 24hr
)

                 IN      NS     www.test.co.jp.
1                IN      PTR    www.test.co.jp.
```

## 逆引きipv6ゾーンファイル設定
ipv6アドレスからホスト名。逆引きだけipv4とipv6を別のファイルに分けないといけない。
```php:# cat f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.8.b.d.0.1.0.0.2.ip6.arpa
$TTL 3600
@                IN      SOA www.test.co.jp. root.test.co.jp.  (
                         2019110401 ; serial
                         3600       ; refresh 1hr
                         900        ; retry 15min
                         604800     ; expire 1w
                         86400      ; min 24hr
)

                 IN      NS     www.test.co.jp.
a.f.f.f.f.f.f.f  IN      PTR    www.test.co.jp.
```


## named.confの構文チェック
etc/named.confの設定を確認する。
```
[root@localhost named]# named-checkconf -z
```

## named.checkzoneでゾーンファイルチェック
ゾーンファイルの構文チェック。
判定OKとなっても全角が混じっていることがあり、nslookupで名前解決出来ずに「NXDOMAIN」と出力されることがあるので注意。
```
named-checkzone test.co.jp /var/named/test.co.jp
```
その後再起動。
```
[root@localhost named]# systemctl restart named
```

## 検証
WindowsServerからDNS_Server(192.0.2.1/24）に名前解決を実施
```
C:\Users\Administrator>nslookup www.test.co.jp 192.0.2.1
サーバー: Unknown
Address: 192.0.2.1

名前:  www.test.co.jp
Address: 198.51.100.1

C:\Users\Administrator>nslookup 198.51.100.1 192.0.2.1
サーバー: Unknown
Address: 192.0.2.1

名前:  www.test.co.jp
Address: 198.51.100.1
```