【BIND】権威DNSサーバの構築

##目標
BINDを利用して権威DNSサーバを構築すること（AWS環境を利用）。

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

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

##前提
・ドメインを取得済みであること（※１）。
・AWS EC2インスタンス1台（本記事ではAmazon Linux 2 AMI (HVM), SSD Volume Type利用）(※２)が構築済みであること。

※１
本記事ではAWS Route53に登録済みのメインドメイン（本記事内ryosukepersonal.com）のサブドメイン（本記事内subdomain.ryosukepersonal.com）を登録し、それを構築する権威DNSサーバに管理させるという流れを取ります。
AWS Route53を利用したドメイン取得、及び登録に関しては以下記事で実施致しましたので、
参考として記載致します。
[AWS Route53を利用してEC2へ独自ドメインアクセス](https://qiita.com/OPySPGcLYpJE0Tc/items/4a141a880351cf655de9)


※２
**53番UDPポート（DNS）を開けておく**こと。

##作業の流れ
| 項番 | タイトル |
|:----:|:-------------|
| 1 | [権威DNSサーバの構築](#1権威dnsサーバの構築) |
| 2 | [サブドメインのRoute53登録（サブドメインでなくメインのドメインを利用する場合は不要手順）](#2サブドメインのroute53登録サブドメインでなくメインのドメインを利用する場合は不要手順)|
| 3 | [名前解決確認](#3名前解決確認) |

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

```
yum -y install bind
```

**②BINDのメイン設定ファイル編集**
BINDのメイン設定ファイルである、`/etc/named.conf`の編集を開始します。
コメントの記載しているパラメータが、デフォルトから編集した部分、もしくは権威DNSサーバの設定として重要な設定箇所となります。
zoneステートメントに指定されているドメイン名は書き換えを行ってください。

```bash:/etc/named.conf
options {
        # コメントアウトし、全IPアドレスで待ち受け
        #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";
        recursing-file  "/var/named/data/named.recursing";
        secroots-file   "/var/named/data/named.secroots";

        # クエリリクエストは全送信元に対し許可
        allow-query     { any; };

        /*
           attacks. Implementing BCP38 within your network would greatly
           reduce such attack surface
        */

        # コンテンツサーバは再帰問い合わせを禁止にする
        recursion no;

        dnssec-enable yes;
        dnssec-validation yes;
//
// Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
        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;
        };
};

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

# ゾーンの設定（zone直後記載のドメイン名部分は書き換えを行ってください）
zone "subdomain.ryosukepersonal.com." IN {
        type master;
        file "localdomain.zone";
        allow-update { none; };
};

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

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

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

**③ゾーンファイルの設定**
対象ドメインのゾーンファイル設定を行います。
本記事に沿った場合、ゾーンファイルは`/var/named/localdomain.zone`となります。
以下はサンプルで書き換えを行う部分は、`SOAレコードの値（権威DNSサーバ名）`、`NSレコードの値（権威DNSサーバ名）`、`Aレコードの値（権威DNSサーバ、及びその他サンプルサーバのIPアドレス）`となります。
また、サーバ名の末尾には、`.`が必要なことに注意します。

```:/var/named/localdomain.zone
$TTL      86400
@         IN       SOA     ns.subdomain.ryosukepersonal.com.  root.test.local.(
                                        2020020501 ; Serial
                                        28800      ; Refresh
                                        14400      ; Retry
                                        3600000    ; Expire
                                        86400 )    ; Minimum
     IN NS ns.subdomain.ryosukepersonal.com.
ns   IN A  13.231.237.4
www  IN A  54.250.150.153
```

`named-checkzoneコマンド`を利用してゾーンファイルの書式をチェックしOKと出力されることを確認します。
第一引数のドメイン名は書き換えを行ってください。

```
[root@ip-172-31-34-202 ~]# named-checkzone subdomain.ryosukepersonal.com /var/named/localdomain.zone
zone subdomain.ryosukepersonal.com/IN: loaded serial 2020020501
OK
```

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

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

###2.サブドメインのRoute53登録（サブドメインでなくメインのドメインを利用する場合は不要手順）
冒頭記載の通り、今回はメインドメインのサブドメインを利用したため、その際に実施したメモを以下に参考として記載します。

[【Route53】サブドメインの登録メモ](https://qiita.com/OPySPGcLYpJE0Tc/items/550a030013232f7a121b)

###3.名前解決確認
自宅PCのコマンドプロンプトからnslookupを試します。

```
nslookup <ゾーンファイルのAレコードに記載したサーバ名(FQDN)>
```

以下のように正常に作成したゾーンファイルに定義したサーバの名前解決が実施されればOKです。

```
C:\Users\ryosu>nslookup www.subdomain.ryosukepersonal.com
サーバー:  UnKnown
Address:  192.168.11.1

権限のない回答:
名前:    www.subdomain.ryosukepersonal.com
Address:  54.250.150.153
```

##参考にさせて頂いた書籍及びサイト
・参考書籍
[Linux教科書 LPICレベル2 Version4.5対応](https://www.shoeisha.co.jp/book/detail/9784798151250)
・参考サイト
[centos7.7でDNSサーバを立てる(bind)](https://qiita.com/Higemal/items/6de23765797e18c428d7)

##参考
DNSキャッシュサーバの構築もやってみました。
[【BIND】DNSキャッシュサーバの構築](https://qiita.com/OPySPGcLYpJE0Tc/items/62f3e2947a748b79b1c6)