EC2にDNSサーバを構築してRoute53インバウンドエンドポイントへのフォワードを試す（CNAMEを使用した方法）

# 内容
Network Load Balancer（NLB）の先にWEBシステムを構築。`www.example.co.jp`にアクセスするとNLB作成時に自動的に払い出されるNLBのDNS名（`test-lb-xxx.elb.ap-northeast-1.amazonaws.com`）にアクセスする環境を想定します。この場合、`www.example.co.jp`の名前解決が必要となりますが、Route53のホストゾーンにレコードを登録する方式ではなく、オンプレミスのDNSサーバにCNAME（別名レコード）を登録する方法を検証します。`www.example.co.jp`にアクセスするとCNAMEとして定義された、`test-lb-xxx.elb.ap-northeast-1.amazonaws.com`にアクセス。その後、`test-lb-xxx.elb.ap-northeast-1.amazonaws.com`の名前解決が行われ、NLBのIPアドレスを取得する流れとなります。なお、オンプレミス環境はインターネット接続出来ない環境を想定しています。

# 構成
下記の図でEC2がオンプレミス側のDNSサーバ想定環境になります。検証で使用するDNSサーバはLinux環境にbindをインストールします。ECサーバ内部から赤線の流れで`www.example.co.jp`の名前解決が行われ、黄色線の流れでECサーバからNLBが提供するWEBシステムにアクセスする環境を想定します。EC2サーバ内部からの名前解決の流れは下記のようになります。

![DNS02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/666f1b58-4a7d-4b1d-a5c6-f423f9a948ee.png)

* EC2サーバから`nslookup www.example.co.jp`コマンドを実行します。
* `/etc/resolv.conf`には問合せ先のDNSサーバを指定します。EC2内に構築したDNSサーバに問合せを行うため、ここはEC2サーバのローカルのIPアドレスとなります。
* `nslookup www.example.co.jp`コマンドを実行した際、`/etc/resolv.conf`を参照し、172.20.1.10(ローカルにインストールされたDNSサーバ)に名前解決のリクエストを送信します。
* DNSサーバには`www.example.co.jp`⇒`test-lb-xxx.elb.ap-northeast-1.amazonaws.com`といったCNAMEレコードが存在するため`test-lb-xxx.elb.ap-northeast-1.amazonaws.com`にアクセスします。

`test-lb-xxx.elb.ap-northeast-1.amazonaws.com`はインターネット上に存在するゾーンです。通常、インターネットに接続可能な環境ではこの後、`test-lb-xxx.elb.ap-northeast-1.amazonaws.com`の名前解決は可能ですが、未接続の環境ではインターネット上の`amazonaws.com`が名前解決出来ません。ここでインターネット上の名前解決を行うために、DNSインバウンドエンドポイントを使用します。該当ドメインをDNSインバウンドにフォワードすることによって、インターネット上の名前解決が可能になります。そのため、オンプレミスのDNSサーバに`amazonaws.com`ドメインはDNSインバンドエンドポイントに転送するといったルールを記載します。


* `test-lb-xxx.elb.ap-northeast-1.amazonaws.com`の名前解決が行われ、NLBのIPアドレスを取得します。これにより、NLBにアクセスが可能となります。

# 環境構築

## 前提
* インバウンドエンドポイントが作成済みである。
* VPCおよびEC2が作成済みである。
* セキュリティグループ、ルートテーブルの設定などが適切にされている。

上記準備が完了している状態でEC2にbindのインストール、設定を行っていきます。

## 構築

* bindのインストール

```shell
yum install -y bind bind-utils
```

* リゾルバの設定
EC2サーバ内から名前解決する時、問合せ先のDNSサーバを指定します。VPC内のデフォルトDNSサーバが設定されているため、EC2のIPアドレスに設定します。

```shell
vi /etc/resolv.conf
nameserver 172.20.1.10
```

* インターネット向けの名前解決が出来ないため、NLBの名前解決出来ない状態です。
```shell
nslookup test-lb-xxx.elb.ap-northeast-1.amazonaws.com
;; communications error to 172.20.1.10#53: timed out
;; communications error to 172.20.1.10#53: timed out
;; Got SERVFAIL reply from 172.20.1.10
Server:         172.20.1.10
Address:        172.20.1.10#53
```

* named.confに下記を追加、amazonaws.com宛の通信をDNSインバウンドエンドポイントにフォワードするルールを追加後、bindの再起動を行います。

```shell
vim /etc/named.conf

zone "amazonaws.com" IN {
    type forward;
    forward only;
    forwarders { 172.20.1.20; 172.20.1.30; };
};

systemctl restart named
```

* DNSインバウンドエンドポイント経由でNLBの名前解決が出来るようになりました。

```shell
nslookup test-lb-xxx.elb.ap-northeast-1.amazonaws.com
Server:         172.20.1.10
Address:        172.20.1.10#53

Non-authoritative answer:
Name:   test-lb-xxx.elb.ap-northeast-1.amazonaws.com
Address: 172.20.1.40
Name:   test-lb-xxx.elb.ap-northeast-1.amazonaws.com
Address: 172.20.1.50
```

* まだこの状態ではCNAMEレコード未追加のため、www.example.co.jpの名前解決を行うことが出来ません。

```shell
nslookup www.example.co.jp
;; communications error to 172.20.1.10#53: timed out
;; communications error to 172.20.1.10#53: timed out
;; Got SERVFAIL reply from 172.20.1.10
Server:         172.20.1.10
Address:        172.20.1.10#53

** server can't find www.example.co.jp: SERVFAIL
```

* named.confにexample.co.jpのゾーン情報を追加します。

```shell
vim /etc/named.conf
zone "example.co.jp" IN {
    type master;
    file "example.co.jp.zone";
};
```
* また/var/named/example.co.jp.zoneを作成しCNAMEレコードを定義後、bindの再起動を行います。

```shell
vim /var/named/example.co.jp.zone
$TTL 86400
@   IN  SOA ns1.local.net. root.local.net. (
        2024031701
        3600
        900
        604800
        86400 )
;
@       IN  NS      ns1.local.net.
ns1 IN  A   172.20.1.10
www IN  CNAME test-lb-xxx.elb.ap-northeast-1.amazonaws.com.

systemctl restart named
```

* これでwww.example.co.jpの名前解決が出来るようになりました。

```shell
nslookup www.example.co.jp
Server:         172.20.1.10
Address:        172.20.1.10#53

www.example.co.jp       canonical name = test-lb-xxx.elb.ap-northeast-1.amazonaws.com.
Name:   test-lb-xxx.elb.ap-northeast-1.amazonaws.com
Address: 172.20.1.50
Name:   test-lb-xxx.elb.ap-northeast-1.amazonaws.com
Address: 172.20.1.40
```