【Route53】スプリットビューDNSの名前解決順序を整理してみた

2022.03.31

こんにちは!AWS事業本部コンサルティング部のたかくにです!

今回は、パブリック/プライベートホストゾーンの両方に同じドメインを使用するスプリットビューDNSについてまとめてみようと思います。

スプリットビューDNSとは

公式ドキュメントによると以下のように記載があります。

スプリットビュー DNS

Route 53 を使用して、スプリットビュー DNS (別名、スプリットホライズン DNS) を設定できます。スプリットビュー DNS では、内部使用 (accounting.example.com) とパブリックウェブサイト (www.example.com) などの外部使用で同じドメイン名 (example.com) を使用します。内部および外部で同じサブドメイン名を使用したいが、内部ユーザーと外部ユーザーに対して、異なるコンテンツを供給したり、異なる認証を要求したりする場合もあります。

プライベートホストゾーンを使用する場合の考慮事項

図解すると以下のイメージです。

ドキュメントにもある通り以下の用途で使用されます。

  • 内部および外部で同じサブドメイン名を使用したい
  • 内部ユーザーと外部ユーザーに対して、異なるコンテンツを供給したい
  • 内部ユーザーと外部ユーザーに対して、異なる認証を要求したい

加えて、VPC内部のリソースはインターネットに出て、名前解決する必要がなくなります。

スプリットビュー DNSはとても便利な機能ですが、名前解決の順番にルールがあるみたいなのでまとめてみようと思います。

名前解決の順番

VPC内部では、「Route 53 Resolver ルール」を設定しない限り、プライベートホストゾーンの後にパブリックホストゾーンへ名前解決が行われます。

VPC内部から見た名前解決の順序は以下の通りです。

  1. リクエストが完全一致するドメインのプライベートホストゾーンを探す。
  2. 完全一致した場合は、一致したレコードを返す。
  3. 完全一致しない場合は、リクエストのサブドメインを左から順に切り離し、一致するプライベートホストゾーンを探す。
  4. ドメインが一致した場合は、一致したホストゾーン内のレコードを返す。
  5. ドメインが一致しない場合は、パブリック DNS リゾルバーに転送する。

注意点として、4番でドメインが一致したが対応するレコードが存在しない場合、NXDOMAINが返されます。

ケース別に、順番を解説してみようと思います。

想定する環境

今回は以下の想定で、どのように名前解決されるかをまとめてみようと思います。

各ホストゾーンのレコードは、以下を想定します。

Public Host Zone (example.com)

レコード名 タイプ
example.com A 203.0.113.100 (Webサーバーのパブリック IP)
example.com SOA ns-1234.awsdns-XX.co.uk. awsdns-hostmaster.amazon.com
example.com NS Amazonのネームサーバー

Private Host Zone (internal.example.com)

レコード名 タイプ
internal.example.com A 192.168.1.100 (Webサーバーのプライベート IP)
web.internal.example.com A 192.168.1.100 (Webサーバーのプライベート IP)
site.internal.example.com A 192.168.1.100 (Webサーバーのプライベート IP)
renew.site.internal.example.com A 192.168.1.100 (Webサーバーのプライベート IP)
internal.example.com SOA ns-1234.awsdns-XX.co.uk. awsdns-hostmaster.amazon.com
internal.example.com NS Amazonのネームサーバー

Private Host Zone (web.internal.example.com)

レコード名 タイプ
web.internal.example.com SOA ns-1234.awsdns-XX.co.uk. awsdns-hostmaster.amazon.com
web.internal.example.com NS Amazonのネームサーバー

1. 「example.com」の名前解決

パブリックホストゾーンのAレコード(203.0.113.100)が返されます。

先程の手順に当てはめると以下の通りです。

  1. リクエストが完全一致するドメインのプライベートホストゾーンを探す。
    • 「example.com」と完全一致するプライベートホストゾーンは見つからない
  2. 完全一致した場合は、一致したレコードを返す。
    • 一致しなかったためスキップ
  3. 完全一致しない場合は、リクエストのサブドメインを左から順に切り離し、一致するプライベートホストゾーンを探す。
    • 「example.com」と一致するプライベートホストゾーンは見つからない
  4. ドメインが一致した場合は、一致したホストゾーン内のレコードを返す。
    • 一致しなかったためスキップ
  5. ドメインが一致しない場合は、パブリック DNS リゾルバーに転送する。
    • パブリックホストゾーンでAレコードが返される

2. 「internal.example.com」の名前解決

プライベートホストゾーンのAレコード(192.168.1.100)が返されます。

先程の手順に当てはめると以下の通りです。

  1. リクエストが完全一致するドメインのプライベートホストゾーンを探す。
    • 「internal.example.com」と完全一致するプライベートホストゾーンが見つかる
  2. 完全一致した場合は、一致したレコードを返す。
    • 一致したためホストゾーン内のAレコードを返す
  3. 完全一致しない場合は、リクエストのサブドメインを左から順に切り離し、一致するプライベートホストゾーンを探す。
    • 手順2で一致したためスキップ
  4. ドメインが一致した場合は、一致したホストゾーン内のレコードを返す。
    • 手順2で一致したためスキップ
  5. ドメインが一致しない場合は、パブリック DNS リゾルバーに転送する。
    • 手順2で一致したためスキップ

3. 「web.internal.example.com」の名前解決

結論、名前解決はできません。(No answer)

Private Host Zone (internal.example.com)で、「web.internal.example.com」が定義されていますが、Private Host Zone (web.internal.example.com)が優先して拾われるため解決できない状態になります。

先程の手順に当てはめると以下の通りです。

  1. リクエストが完全一致するドメインのプライベートホストゾーンを探す。
    • 「web.internal.example.com」と完全一致するプライベートホストゾーンが見つかる
  2. 完全一致した場合は、一致したレコードを返す。
    • 一致したが返すAレコードがホストゾーンで定義されていない
  3. 完全一致しない場合は、リクエストのサブドメインを左から順に切り離し、一致するプライベートホストゾーンを探す。
    • 手順2で一致したためスキップ
  4. ドメインが一致した場合は、一致したホストゾーン内のレコードを返す。
    • 手順2で一致したためスキップ
  5. ドメインが一致しない場合は、パブリック DNS リゾルバーに転送する。
    • 手順2で一致したためスキップ

4. 「site.internal.example.com」の名前解決

プライベートホストゾーンのAレコード(192.168.1.100)が返されます。

先程の手順に当てはめると以下の通りです。

  1. リクエストが完全一致するドメインのプライベートホストゾーンを探す。
    • 「site.internal.example.com」と完全一致するプライベートホストゾーンは見つからない。
  2. 完全一致した場合は、一致したレコードを返す。
    • 一致しないためスキップ
  3. 完全一致しない場合は、リクエストのサブドメインを左から順に切り離し、一致するプライベートホストゾーンを探す。
    • リクエストの「site」を切り離し、「internal.example.com」でプライベートホストゾーンと一致する
  4. ドメインが一致した場合は、一致したホストゾーン内のレコードを返す。
    • 「internal.example.com」の「site.internal.example.com」レコードを返す
  5. ドメインが一致しない場合は、パブリック DNS リゾルバーに転送する。
    • 手順3で一致したためスキップ

5. 「renew.site.internal.example.com」の名前解決

プライベートホストゾーンのAレコード(192.168.1.100)が返されます。

先程の手順に当てはめると以下の通りです。

  1. リクエストが完全一致するドメインのプライベートホストゾーンを探す。
    • 「renew.site.internal.example.com」と完全一致するプライベートホストゾーンは見つからない。
  2. 完全一致した場合は、一致したレコードを返す。
    • 一致しないためスキップ
  3. 完全一致しない場合は、リクエストのサブドメインを左から順に切り離し、一致するプライベートホストゾーンを探す。
    • リクエストの「renew」を切り離し、「site.internal.example.com」でプライベートホストゾーンを検索する
    • 見つからないため、リクエストの「site」を切り離し、「internal.example.com」で検索しプライベートホストゾーンと一致する
  4. ドメインが一致した場合は、一致したホストゾーン内のレコードを返す。
    • 「internal.example.com」の「renew.site.internal.example.com」レコードを返す
  5. ドメインが一致しない場合は、パブリック DNS リゾルバーに転送する。
    • 手順3で一致したためスキップ

6. 「nxdomain.internal.example.com」の名前解決

結論、名前解決はできません。(NXDOMAIN)

Private Host Zone (internal.example.com, web.internal.example.com)で、定義されていないレコードですが、プライベートホストゾーン「internal.example.com」で拾われて、「NXDOMAIN」を返します。

先程の手順に当てはめると以下の通りです。

  1. リクエストが完全一致するドメインのプライベートホストゾーンを探す。
    • 「nxdomain.internal.example.com」と完全一致するプライベートホストゾーンは見つからない。
  2. 完全一致した場合は、一致したレコードを返す。
    • 一致しないためスキップ
  3. 完全一致しない場合は、リクエストのサブドメインを左から順に切り離し、一致するプライベートホストゾーンを探す。
    • リクエストの「nxdomain」を切り離し、「internal.example.com」でプライベートホストゾーンと一致する
  4. ドメインが一致した場合は、一致したホストゾーン内のレコードを返す。
    • ホストゾーン内に「nxdomain.internal.example.com」レコードが無いため、NXDOMAINが返される。
  5. ドメインが一致しない場合は、パブリック DNS リゾルバーに転送する。
    • 手順3で一致したためスキップ

まとめ

今回は、スプリットビューDNSの名前解決の順番を整理してみました。

パブリックホストゾーンとプライベートホストゾーンの名前を同じにすると、プライベートホストゾーンで完結されるため注意が必要ですね。

この記事が参考になれば幸いです。

以上、コンサルティング部のたかくにでした!