Private Hosted Zone と Resolver Rule を併用した場合の名前解決について整理してみた

プライベートホストゾーンと Resolver Rule が一つの VPC に関連付けられている場合の名前解決のパターンを整理してみました。
2021.11.02

こんにちは、大前です。

同じドメインに対してプライベートホストゾーンと 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 事業本部の大前でした。

参考