Route 53のPrivate DNSを試す

# はじめに
VPCで利用可能なAmazonProvidedDNSの動きが気になり、
Route 53でサポートされたVPC内のPrivate DNSとあわせて試してみる。

オンプレと組み合わせた名前解決周りの設計は、結構悩ましい事が多いので、楽になればいいなと。


# 想定した構成
DFSの構成を検証した際に考えたのは、

* 利用する名前空間内のRootゾーンにRoute 53でホスト。
* AWS上で組むシステム単位でサブドメイン的なhost名を使って利用するイメージ。

という構成。設定的にはこんな感じ。

* `dfs.local` :Route53のPrivateDSNを利用。domain.dfs.localのNSレコードを持たせる。
* `domain.dfs.local`:ActiveDirectory側で利用するDNSサーバを利用。フォワーダーにAmazonProvidedDNSを設定する。

AmazonProvidedDNSがActiveDirectory側のDNSにも問合せ可能だと色々と捗りそう。

# 環境構築

1. VPCの構築やら、Route53のHosted Zoneの設定を行う。詳細は色々な所で解説されているので、そちらを参考に。
1. 作成したhostedゾーンに以下の様なレコードを追加

|レコード名|タイプ|内容|
|:------------:|:------------:|:------------:|
|domain.dfs.local.|A|　B.B.B.B|
|domain.dfs.local.　|MX|A.A.A.A|
|domain.dfs.local.　|NS|B.B.B.B|
|domain.dfs.local.　|TXT|"TEXT"|
|dc01.domain.dfs.local.|A|C.C.C.C|
|dc02.domain.dfs.local.|A|D.D.D.D|


LinuxクライアントからAmazonProvidedDNSに対してQueryを投げる

# 検証結果
Privateゾーンの権威サーバに対して、直接のアクセスが可能かを確認してみると、`status: REFUSED`となり、アクセスできない。

```
$ dig @<権威サーバ> dfs.local soa

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.30.rc1.el6 <<>> @<権威サーバ> dfs.local soa
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: REFUSED, id: 13903
;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;dfs.local.			IN	SOA

;; Query time: 80 msec
;; SERVER: <権威サーバ>#53(<権威サーバ>)
;; WHEN: Mon Dec 22 07:46:37 2014
;; MSG SIZE  rcvd: 27

```

名前解決をするためには、AmazonProvidedDNS経由のみで問い合わせる必要があるようだ。

続いてdomain.dfs.localに関してQueryType=anyでQueryを投げると`status: SERVFAIL`となり、何処かでエラーが発生して、応答が得られない。

```
$ dig @AmazonProvidedDNS domain.dfs.local any

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.30.rc1.el6 <<>> @AmazonProvidedDNS domain.dfs.local any
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 11839
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;domain.dfs.local.		IN	ANY

;; Query time: 13 msec
;; SERVER: AmazonProvidedDNS#53(AmazonProvidedDNS)
;; WHEN: Mon Dec 22 07:52:14 2014
;; MSG SIZE  rcvd: 34

```

色々と試してみた結果、domain.dfs.localのnsレコードが悪さをしているようで、
このレコードを削除すると、きちんと引ける様になる

```
$ dig @AmazonProvidedDNS domain.dfs.local any

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.30.rc1.el6 <<>> @AmazonProvidedDNS domain.dfs.local any
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 20903
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;domain.dfs.local.		IN	ANY

;; ANSWER SECTION:
domain.dfs.local.	44	IN	TXT	"TEXT"
domain.dfs.local.	41	IN	MX	10 A.A.A.A.
domain.dfs.local.	153	IN	A	B.B.B.B

;; Query time: 0 msec
;; SERVER: AmazonProvidedDNS#53(AmazonProvidedDNS)
;; WHEN: Mon Dec 22 07:57:38 2014
;; MSG SIZE  rcvd: 94
```

続いて、サブドメイン風に作った`dc01.domain.dfs.local`のレコードが返ってくるかを確認


```
$ dig @AmazonProvidedDNS dc01.domain.dfs.local any

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.30.rc1.el6 <<>> @<AmazonProvidedDNS> dc01.domain.dfs.local any
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 28756
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;dc01.domain.dfs.local.		IN	ANY

;; ANSWER SECTION:
dc01.domain.dfs.local.	49	IN	A	C.C.C.C

;; Query time: 0 msec
;; SERVER: <AmazonProvidedDNS>#53(<AmazonProvidedDNS>)
;; WHEN: Mon Dec 22 07:59:14 2014
;; MSG SIZE  rcvd: 55

```

これも大丈夫。どうやら、Privateゾーンに関しては、

* nsレコードが設定されていると、何らかのエラーが発生する

これが本当に仕様だとしたら、ドキュメントの何処かに書いてありそうだけど、該当箇所が見つからず。


# まとめ
* nsレコードを設定した場合に、`status: SERVFAIL`になる原因は分からず。時間があるときにもう少し詳しく調べよう。
* AmazonProvidedDNSがVPC内部に建てた独自DNSに対してQueryを投げるような事はダメっぽい