Private Hosted Zone と Resolver Rule を併用した場合の名前解決について整理してみた
こんにちは、大前です。
同じドメインに対してプライベートホストゾーンと Route 53 Resolver Rule の設定が一つの VPC に関連付けられている場合、発生した DNS クエリが解決される優先順位がどうなるのか理解が曖昧だった為、調べた内容をブログとして残したいと思います。
前提とする構成
今回想定する構成は以下の通りです。
- VPC 内に DNS クエリを発行する EC2 を用意
- pasuta.local を管理するプライベートホストゾーンを作成し、VPC に関連付け
- web.pasuta.local に対して A レコード(10.0.0.61)を返却できる様に設定
- pasuta.local を対象のドメインとして転送を行う Resolver Rule を作成し VPC に関連付け
- 合わせて Resolver Outbound Endpoint も作成
- Resolver Rule に合致した際の DNS クエリの転送先となる仮の DNS サーバを EC2 で用意
- Unbound をインストールし、web.pasuta.local に対して A レコード(10.0.0.51)を返却できる様に設定
この構成において、Resolver Rule やプライベートホストゾーンのレコード設定等を変化させながら、名前解決のパターンを調べていきたいと思います。
今回仮の DNS サーバとして Unbound を用意するための手順は、以下ブログを参考にしました。
先に結論
- プライベートホストゾーンと Resolver Rule で対象となるドメインが被っている場合、常に Resolver Rule に従って DNS クエリが転送される
- Resolver Rule でシステムルールを設定する事で、対象のドメイン/サブドメインは転送対象外となりプライベートホストゾーンで名前解決される
- Resolver Rule の転送対象のドメインに .(ドット) を指定した場合のみ、他に該当する Resolver Rule がなければプライベートホストゾーンでの名前解決が優先される
やってみた
パターン 1 Resolver Rule 無し
プライベートホストゾーンにはレコードが存在するが、Resolver Rule は無い状態で、web.pasuta.local に対して名前解決を試みると、当然紐づいているプライベートホストゾーンの合致するレコードの結果が返却されます。
10.0.0.61(プライベートホストゾーンに設定している値)が返却される事が確認できます。
パターン 2 Resolver Rule 有り
続いて、pasuta.local を転送する Resolver Rule を設定します。ターゲットは EC2 で立てている DNS サーバのプライベート IP を指定します。
その他、同じく web.pasuta.local に対して名前解決を試みると、仮で立てている DNS サーバからの結果が返却されます。※DNS クエリの TTL が切れてから再試行しています。
10.0.0.51(EC2 の Unbound に設定している値)が返却される事が確認できます。
この動作については以下ドキュメントに記載があります。
プライベートホストゾーン (example.com) があり、ドメイン名が同じであるトラフィックをネットワークにルーティングする Resolver ルールがある場合、Resolver はルールを優先します。
つまり、今回でいえば pasuta.local をドメインとする転送ルールを Resolver Rule に設定しているため、プライベートホストゾーンにどんなレコードがあっても、pasuta.local とそのサブドメインについての DNS クエリは常に Resolver Rule の動作に従って転送される事になります。
パターン 3 Resolver Rule システムルールの利用
パターン 2 の結果より、プライベートホストゾーンと Resolver Rule で対象ドメインが被っている場合は Resolver Rule が優先される事はわかりましたが、例えば「転送設定は行いつつ、web.pasuta.local はプライベートホストゾーンで名前解決したい」といった例外を設定したい場合もあるかと思います。
その場合には、Resolver Rule のシステムルールを利用する事で転送対象外のドメインを設定する事ができます。
ルールタイプ
System – 転送ルールで定義されている動作を、Resolver で選択的に上書きさせる場合は、このオプションを選択します。システムルールを作成すると、Resolver はルールで指定されたサブドメインの DNS クエリを解決します (システムルールを使わない場合は、ネットワークの DNS リゾルバーで解決されます)。
今回は、web.pasuta.local に関するシステムルールを追加してみます。
この状態で同じく web.pasuta.local に対して名前解決を行うと、今度はプライベートホストゾーンで設定しているレコードの結果が返却されます。
10.0.0.61(プライベートホストゾーンに設定している値)が返却される事が確認できます。
パターン 4 Resolver Rule のドメインに ".(ドット)" を指定
Resolver Rule の転送ルールの対象とするドメインには ".(ドット)" を指定する事が可能です。
".(ドット)" は "全てのドメイン" を表すため、".(ドット)" を指定した転送ルールを作成した場合は全てのクエリが転送対象となります。一方で、ドキュメントには以下記載が存在します。
ドットルールは、プライベートホストゾーンの AWS 内部ドメイン名とレコード名を除いて、すべてのドメイン名に適用されます。
つまり、".(ドット)" を指定した転送ルールの場合のみ、システムルールなしでもプライベートホストゾーンを参照してくれるとも読み取れます。
実際に ".(ドット)" を指定した転送ルールを作成して試してみます。ここまでのパターンで作成した転送ルールやシステムルールは削除しておきます。
ドットルールのみが Resolver Rule に存在する状態で同じく web.pasuta.local に対して問い合わせを行うと、ドキュメントから読み取れた通り、システムルールなしでプライベートホストゾーンのレコード結果が返却されました。
10.0.0.61(プライベートホストゾーンに設定している値)が返却される事が確認できます。
パターン 5 ドットルールを利用した上でドメインを明示した転送ルールを作成
パターン 4 でドットルールのみが存在している状態から、再度 pasuta.local をドメインとして指定した転送ルールを作成します。
以下の状態で web.pasuta.local に対して問い合わせを行うと、追加した pasuta.local に対する転送ルールがドットルールよりも先に合致するため、DNS サーバ側にクエリが転送されました。
10.0.0.51(EC2 の Unbound に設定している値)が返却される事が確認できます。
複数の Resolver Rule が存在する場合、最も具体的なドメインに一致するルールが適用されるという仕様は、ドットルール利用時にも適用される様です。
クエリ内のドメイン名が複数のルール内のドメイン名 (example.com と www.example.com など) と一致した場合、Resolver は、最も具体的なドメイン名 (www.example.com) が含まれているルールを使用して、アウトバウンド DNS クエリをルーティングします。
おわりに
プライベートホストゾーンと Resolver Rule を併用している環境における名前解決の優先度を調べてみました。システムルールの具体的な用途や、ドットルールの存在など、新たな発見が有り非常に勉強になりました。
以上、AWS 事業本部の大前でした。