【BIND】DNSキャッシュサーバの構築

##目標
BINDを利用してDNSキャッシュサーバを構築すること（AWS環境を利用）。

##BIND、及びDNSキャッシュサーバ基礎情報
BINDとは多くのLinuxディストリビューションで標準的に利用されているDNSサーバソフトウェアです。
BINDのサーバデーモンはnamedとして動作します。

DNSキャッシュサーバに関しては、以下参考サイト掲載致します。
[「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典（DNSキャッシュサーバ）](https://wa3.i-3-i.info/word12271.html)

##前提
・同一VPC内にAWS EC2インスタンス2台（本記事ではAmazon Linux 2 AMI (HVM), SSD Volume Type利用）(※)が構築済みであること。

※DNSサーバとして利用するインスタンスに関しては、**53番UDPポート（DNS）を開けておく**こと。

##作業の流れ
| 項番 | タイトル |
|:----:|:-------------|
| 1 | [DNSキャッシュサーバの構築](#1dnsキャッシュサーバの構築) |
| 2 | [名前解決確認](#2名前解決確認)|

##手順
###1.DNSキャッシュサーバの構築
**①必要パッケージのインストール**
DNSサーバとして利用するEC2インスタンスにOSログイン後、ルートスイッチ。
その後DNSサーバソフトのBINDをインストールします。

```
yum -y install bind
```

**②BINDのメイン設定ファイル編集**
BINDのメイン設定ファイルである、`/etc/named.conf`の編集を開始します。
コメントの記載しているパラメータが、デフォルトから編集した部分、もしくはDNSキャッシュサーバの設定として重要な設定箇所となります。
`DNSサーバのプライベートIPアドレス`と`VPCのネットワークアドレス`は書き換えを行ってください。

```bash:/etc/named.conf
options {
        # プライベートIPアドレスで待ち受け
        listen-on port 53 { DNSサーバのプライベートIPアドレス; };

        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";

        # クエリ、及び再帰問い合わせはVPC内ホストに限定し、セキュリティ強化
        allow-query     { VPCのネットワークアドレス; };
        allow-recursion { VPCのネットワークアドレス; };

        /*
         - 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 yes;

        dnssec-enable yes;
        dnssec-validation yes;

        /* 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;
        };
};

# ルートDNSサーバの指定
zone "." IN {
        type hint;
        file "named.ca";
};

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

`named-checkconfコマンド`を利用して、namd.confの書式が正しいかチェックします。

```bash
# エラー出力がないこと
named-checkconf
```

**③namedデーモンの起動⇒自動起動⇒状態確認**

```
systemctl start named
systemctl enable named
systemctl status named
```

一応プライベートIPアドレスでUDPの53番ポートを待ち受けているかも確認

```bash
# DNSサーバのプライベートIPアドレス:53というレコードが出力されること
[root@ip-172-31-34-5 ~]# netstat -aun | grep 53
udp        0      0 172.31.34.5:53          0.0.0.0:*
udp6       0      0 ::1:53                  :::*
```

###2.名前解決確認
事前同一VPC内に用意したEC2インスタンスにOSログインし、`nslookupコマンド`を利用したDNSキャッシュサーバの機能確認を行います。
DNSサーバのIPアドレス部分を詰め替えて、以下コマンドを実行します。

```
nslookup google.com DNSサーバのプライベートIPアドレス
```

以下のようにサンプルとして利用したgoogleサイトのIPアドレスがNon-authoritative answer:以下に出力されればOKです。

```
[root@ip-172-31-42-71 ~]# nslookup google.com 172.31.34.5
Server:         172.31.34.5
Address:        172.31.34.5#53

Non-authoritative answer:
Name:   google.com
Address: 172.217.175.110
Name:   google.com
Address: 2404:6800:4004:81f::200e
```

`/etc/resolv.conf`内に構築したDNSキャッシュサーバを登録し、リゾルバがデフォルトで利用するサーバとしてしまいます。
nameserverセクションに構築したDNSサーバのプライベートIPアドレスを記載

```:/etc/resolv.conf
nameserver DNSサーバのプライベートIPアドレス
```

今度は第二引数にDNSサーバのIPを指定しなくても名前解決できるようになります。

```
[root@ip-172-31-42-71 ~]# nslookup google.com
Server:         172.31.34.5
Address:        172.31.34.5#53

Non-authoritative answer:
Name:   google.com
Address: 172.217.175.110
Name:   google.com
Address: 2404:6800:4004:81f::200e
```

##参考
権威DNSサーバの構築もしてみました。
[【BIND】権威DNSサーバの構築](https://qiita.com/OPySPGcLYpJE0Tc/items/2f02280efe96c8faf566)