Oracle Cloud：OCIにオンプレミスのDNSと同期するDNSキャッシュサーバーを構成してみてみた

#■目的
OCIのDNS名は、VCN DNSリゾルバ（169.254.169.254）を使用してVCN内でのみ解決できます。このIPアドレス（169.254.169.254）は、VCN内のインスタンスからのみ到達可能です。
オンプレミスのデータセンターが（VPNまたはFastConnectを介して）VCNに接続されている場合、オンプレミスのクライアントからのVCNインスタンスとその逆のインスタンスのDNS名の解決を可能にするために、VCN側にオンプレミスのDNSと同期するDNSキャッシュサーバーを配置します。


#■Network構成
<img width="1341" alt="構成図01.png" src="https://qiita-image-store.s3.amazonaws.com/0/109087/36403156-6553-0521-638a-1cb34f1b2105.png">

##●1. オンプレミスからVCNへのDNS Resolutionフロー

     ①クライアント(onp-inst)は、オンプレミスのDNSサーバー（192.168.0.2）へのDNSクエリ（oci-inst.ap.testvcn.oraclevcn.com）を開始
     ②オンプレミスDNSサーバーは、要求をプライベート接続（VPNまたはFastConnect）経由でVCNのDNS VM（10.0.0.2）に転送
     ③DNSクエリをVCN DNSリゾルバ（169.254.169.254）に転送
     ④DNS VM（10.0.0.2）はFQDNのIPアドレスを取得し、それをオンプレミスDNSサーバー（192.168.0.2）に戻す
     ⑤オンプレミスDNSサーバーがIPアドレスを取得し、クライアンに返します

##●2. VCNからオンプレミスへのDNS Resolutionフロー

	①VCNのインスタンス(oci-inst)がDNSクエリ開始（onp-inst.customer.net）
	②VCN内のサブネットで使用されるDHCPオプションで構成されたDNSサーバーは、DNS要求を受信します。 この場合、要求はVCNのDNS VMによって受信されます
	③DNSクエリはプライベート接続（VPNのFastconnect）でオンプレミスDNSサーバー（192.168.0.2）に転送
	④DNS VMは応答を取得し、それをクライアントに返します


#■OCI側DNSサーバー作成手順
OCIにDNSサーバー用のSecurity ListとDHCPオプション、Subnetを作成して、DNSサーバーを作成します

##●1. Security List 作成
	DNS用 udp 53 Portを設定して作成
<img width="465" alt="SecList01.png" src="https://qiita-image-store.s3.amazonaws.com/0/109087/707bd189-cbc0-3e79-9305-e55e42fd8ee5.png">


##●2. DHCPオプション作成
DNS type を "Internet and VCN resolver"として設定して作成

<img width="475" alt="DHCP01.png" src="https://qiita-image-store.s3.amazonaws.com/0/109087/df06cdbf-b2d3-4d3c-8b1a-7ccbe6525a51.png">

##●3. Subnet作成
作成したSecurity ListとDNS type を追加して作成
<img width="473" alt="subnet01.png" src="https://qiita-image-store.s3.amazonaws.com/0/109087/456f1ffd-3ec9-6bce-ba30-1db3e07b4fe1.png">


##●4. DNSサーバー用 VMインスタンス作成
Oracle Linux7.6のOC で VM インスタンスを 作成

##●5. Named(bind)インストールと設定
作成したVM インスタンスへ bindをインストール

①install bind
yum でbindをインストール

```shell-session
[root@customer-dns ~]# yum install bind
	Loaded plugins: langpacks, ulninfo
	ksplice-uptrack                                          |  951 B     00:00
	ol7_UEKR5                                                | 1.2 kB     00:00
	ol7_addons                                               | 1.2 kB     00:00
	ol7_developer                                            | 1.2 kB     00:00
	ol7_developer_EPEL                                       | 1.2 kB     00:00
	ol7_latest                                               | 1.4 kB     00:00
	ol7_optional_latest                                      | 1.2 kB     00:00
	ol7_software_collections                                 | 1.2 kB     00:00
	(1/16): ol7_addons/x86_64/updateinfo                       |  46 kB   00:00
	(2/16): ol7_developer/x86_64/updateinfo                    |  134 B   00:00
	(3/16): ol7_developer/x86_64/primary                       | 185 kB   00:00
	(4/16): ol7_developer_EPEL/x86_64/updateinfo               | 2.4 kB   00:00
	(5/16): ol7_UEKR5/x86_64/updateinfo                        |  11 kB   00:00
	(6/16): ol7_developer_EPEL/x86_64/primary                  | 8.0 MB   00:00
	(7/16): ol7_latest/x86_64/updateinfo                       | 755 kB   00:00
	(8/16): ol7_UEKR5/x86_64/primary                           | 2.4 MB   00:00
	(9/16): ol7_optional_latest/x86_64/updateinfo              | 585 kB   00:00
	(10/16): ol7_optional_latest/x86_64/primary                | 2.7 MB   00:00
	(11/16): ol7_latest/x86_64/primary                         |  11 MB   00:00
	(12/16): ol7_latest/x86_64/group                           | 659 kB   00:00
	(13/16): ol7_addons/x86_64/primary                         |  65 kB   00:00
	(14/16): ol7_software_collections/updateinfo               | 8.7 kB   00:00
	(15/16): ksplice-uptrack/7Server/x86_64/primary            | 2.7 kB   00:00
	(16/16): ol7_software_collections/primary                  | 3.7 MB   00:00
	ksplice-uptrack                                                           12/12
	ol7_UEKR5                                                               108/108
	ol7_addons                                                              247/247
	ol7_developer                                                           482/482
	ol7_developer_EPEL                                                  24124/24124
	ol7_latest                                                          11684/11684
	ol7_optional_latest                                                   9234/9234
	ol7_software_collections                                            12604/12604
	Resolving Dependencies
	--> Running transaction check
	---> Package bind.x86_64 32:9.9.4-72.el7 will be installed
	--> Finished Dependency Resolution

	Dependencies Resolved

	================================================================================
	 Package      Arch           Version                   Repository          Size
	================================================================================
	Installing:
	 bind         x86_64         32:9.9.4-72.el7           ol7_latest         1.8 M

	Transaction Summary
	================================================================================
	Install  1 Package

	Total download size: 1.8 M
	Installed size: 4.5 M
	Is this ok [y/d/N]: y
	Downloading packages:
	bind-9.9.4-72.el7.x86_64.rpm                               | 1.8 MB   00:05
	Running transaction check
	Running transaction test
	Transaction test succeeded
	Running transaction
	  Installing : 32:bind-9.9.4-72.el7.x86_64                                  1/1
	  Verifying  : 32:bind-9.9.4-72.el7.x86_64                                  1/1

	Installed:
	  bind.x86_64 32:9.9.4-72.el7

	Complete!
```

②firewalld設定
DNS使用Port 53を通すように設定

```shell-session

[root@customer-dns ~]# firewall-cmd --permanent --add-port=53/udp
	success
[root@customer-dns ~]# firewall-cmd --permanent --add-port=53/tcp
	success
[root@customer-dns ~]# systemctl restart firewalld
```

③/etc/named.conf設定
・デフォルトの/etc/named.confをバックアップ

```shell-session
[root@customer-dns ~]# mv /etc/named.conf /etc/named.conf.org
```

・DNS設定
オンプレミスDNSサーバー(192.168.0.2)のキャッシュDNSとなるよう設定

```shell-session
[root@customer-dns ~]# vi /etc/named.conf
	options {
	        listen-on port 53 { any; };
	        allow-query    { localhost; 10.0.0.0/16; 192.168.0.0/16; };
	        forward        only;
	        forwarders     { 169.254.169.254; };
	        recursion yes;
	};

	zone "customer.net" {
	        type       forward;
	        forward    only;
	        forwarders { 192.168.0.2; };
	};
```

④named起動

```shell-session
[root@customer-dns ~]# service named restart
	Redirecting to /bin/systemctl restart named.service
```

#■OCI側インスタンスのDNSサーバー指定設定
OCI内のインスタンスが作成したDNSサーバーにアクセスするためには、VCNのSubnetに付与されているDHCP Optionsを設定します

##●1. DHCP Options作成
ここでは、AP-Subnet用のDHCP Optionを作成し以下項目を設定して[Create DHCP Option]をクリックして作成

　　・Options：Custom Resolver
　　・Search Domain：オンプレミスのドメイン(customer.net)を設定

<img width="485" alt="AP-DHCP.png" src="https://qiita-image-store.s3.amazonaws.com/0/109087/76e4bc2e-555c-35e6-e5e1-65942982ff69.png">

##●2. OCIインスタンスのVCN Subnet設定
作成したDHCP Option をSubnetに付与
<img width="489" alt="AP-Subnet.png" src="https://qiita-image-store.s3.amazonaws.com/0/109087/b3731e7c-6fbd-268e-400c-83f304f1b7c0.png">


##●3. OCIインスタンスの設定確認
OCIインスタンスを再起動することによって、設定したDHCP OptionのDNSサーバーにアクセスするようにOS設定がされます

①OCIインスタンス再起動
oci-instを [Reboot]ボタンで再起動
<img width="323" alt="reboot.png" src="https://qiita-image-store.s3.amazonaws.com/0/109087/054e1350-95f0-0e39-4a19-d538913e6e2e.png">

②設定反映確認
再起動したインスタンスにログインして、/etc/resolv.confを読み、オンプレミスのドメインが付与され、作成したDNS(nameserver)のIPが設定されていることを確認

```shell-session
[opc@oci-inst ~]$ cat /etc/resolv.conf
	; generated by /usr/sbin/dhclient-script
	search customer.net ap.testvcn.oraclevcn.com testvcn.oraclevcn.com
	nameserver 10.0.0.2
```

#■DNS名前解決確認

##●1. OCI-->オンプレミス確認
OCIのインスタンス(oci-inst)からオンプレミスのインスタンス(onp-inst)のDNS名前解決できることを確認

① nslookupで名前解決確認
ホスト名でnslookupを実行し、ドメイン名とIPアドレス、DNSサーバーのIPアドレスを確認

```shell-session
[opc@oci-inst ~]$ nslookup onp-inst
	Server:         10.0.0.2
	Address:        10.0.0.2#53

	Non-authoritative answer:
	Name:   onp-inst.customer.net
	Address: 192.168.1.11
```

② ホスト名でssh接続できることを確認
sshを実行して接続先のホスト名を確認

```shell-session
[opc@oci-inst ~]$ ssh -i id_rsa opc@onp-inst hostname
	onp-inst
```

##●2. オンプレミス-->OCI確認
・オンプレミスのインスタンス(onp-inst)からOCIのインスタンス(oci-inst)のDNS名前解決できることを確認

① nslookupで名前解決確認
ホスト名でnslookupを実行し、ドメイン名とIPアドレス、DNSサーバーのIPアドレスを確認

```shell-session
[root@onp-inst ~]# nslookup oci-inst
	Server:         192.168.0.2
	Address:        192.168.0.2#53

	Non-authoritative answer:
	Name:   oci-inst.ap.testvcn.oraclevcn.com
	Address: 10.0.2.11
```

② ホスト名でssh接続できることを確認
sshを実行して接続先のホスト名を確認

```shell-session
[root@onp-inst ~]# ssh -i id_rsa opc@oci-inst hostname
oci-inst
```