【Route53】スプリットビューDNSの名前解決順序を整理してみた
こんにちは!AWS事業本部コンサルティング部のたかくに(@takakuni_)です!
今回は、パブリック/プライベートホストゾーンの両方に同じドメインを使用するスプリットビューDNSについてまとめてみようと思います。
スプリットビューDNSとは
公式ドキュメントによると以下のように記載があります。
スプリットビュー DNS
Route 53 を使用して、スプリットビュー DNS (別名、スプリットホライズン DNS) を設定できます。スプリットビュー DNS では、内部使用 (accounting.example.com) とパブリックウェブサイト (www.example.com) などの外部使用で同じドメイン名 (example.com) を使用します。内部および外部で同じサブドメイン名を使用したいが、内部ユーザーと外部ユーザーに対して、異なるコンテンツを供給したり、異なる認証を要求したりする場合もあります。
図解すると以下のイメージです。
ドキュメントにもある通り以下の用途で使用されます。
- 内部および外部で同じサブドメイン名を使用したい
- 内部ユーザーと外部ユーザーに対して、異なるコンテンツを供給したい
- 内部ユーザーと外部ユーザーに対して、異なる認証を要求したい
加えて、VPC内部のリソースはインターネットに出て、名前解決する必要がなくなります。
スプリットビュー DNSはとても便利な機能ですが、名前解決の順番にルールがあるみたいなのでまとめてみようと思います。
名前解決の順番
VPC内部では、「Route 53 Resolver ルール」を設定しない限り、プライベートホストゾーンの後にパブリックホストゾーンへ名前解決が行われます。
VPC内部から見た名前解決の順序は以下の通りです。
- リクエストが完全一致するドメインのプライベートホストゾーンを探す。
- 完全一致した場合は、一致したレコードを返す。
- 完全一致しない場合は、リクエストのサブドメインを左から順に切り離し、一致するプライベートホストゾーンを探す。
- ドメインが一致した場合は、一致したホストゾーン内のレコードを返す。
- ドメインが一致しない場合は、パブリック 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)が返されます。
先程の手順に当てはめると以下の通りです。
- リクエストが完全一致するドメインのプライベートホストゾーンを探す。
- 「example.com」と完全一致するプライベートホストゾーンは見つからない
- 完全一致した場合は、一致したレコードを返す。
- 一致しなかったためスキップ
- 完全一致しない場合は、リクエストのサブドメインを左から順に切り離し、一致するプライベートホストゾーンを探す。
- 「example.com」と一致するプライベートホストゾーンは見つからない
- ドメインが一致した場合は、一致したホストゾーン内のレコードを返す。
- 一致しなかったためスキップ
- ドメインが一致しない場合は、パブリック DNS リゾルバーに転送する。
- パブリックホストゾーンでAレコードが返される
2. 「internal.example.com」の名前解決
プライベートホストゾーンのAレコード(192.168.1.100)が返されます。
先程の手順に当てはめると以下の通りです。
- リクエストが完全一致するドメインのプライベートホストゾーンを探す。
- 「internal.example.com」と完全一致するプライベートホストゾーンが見つかる
- 完全一致した場合は、一致したレコードを返す。
- 一致したためホストゾーン内のAレコードを返す
- 完全一致しない場合は、リクエストのサブドメインを左から順に切り離し、一致するプライベートホストゾーンを探す。
- 手順2で一致したためスキップ
- ドメインが一致した場合は、一致したホストゾーン内のレコードを返す。
- 手順2で一致したためスキップ
- ドメインが一致しない場合は、パブリック 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)が優先して拾われるため解決できない状態になります。
先程の手順に当てはめると以下の通りです。
- リクエストが完全一致するドメインのプライベートホストゾーンを探す。
- 「web.internal.example.com」と完全一致するプライベートホストゾーンが見つかる
- 完全一致した場合は、一致したレコードを返す。
- 一致したが返すAレコードがホストゾーンで定義されていない
- 完全一致しない場合は、リクエストのサブドメインを左から順に切り離し、一致するプライベートホストゾーンを探す。
- 手順2で一致したためスキップ
- ドメインが一致した場合は、一致したホストゾーン内のレコードを返す。
- 手順2で一致したためスキップ
- ドメインが一致しない場合は、パブリック DNS リゾルバーに転送する。
- 手順2で一致したためスキップ
4. 「site.internal.example.com」の名前解決
プライベートホストゾーンのAレコード(192.168.1.100)が返されます。
先程の手順に当てはめると以下の通りです。
- リクエストが完全一致するドメインのプライベートホストゾーンを探す。
- 「site.internal.example.com」と完全一致するプライベートホストゾーンは見つからない。
- 完全一致した場合は、一致したレコードを返す。
- 一致しないためスキップ
- 完全一致しない場合は、リクエストのサブドメインを左から順に切り離し、一致するプライベートホストゾーンを探す。
- リクエストの「site」を切り離し、「internal.example.com」でプライベートホストゾーンと一致する
- ドメインが一致した場合は、一致したホストゾーン内のレコードを返す。
- 「internal.example.com」の「site.internal.example.com」レコードを返す
- ドメインが一致しない場合は、パブリック DNS リゾルバーに転送する。
- 手順3で一致したためスキップ
5. 「renew.site.internal.example.com」の名前解決
プライベートホストゾーンのAレコード(192.168.1.100)が返されます。
先程の手順に当てはめると以下の通りです。
- リクエストが完全一致するドメインのプライベートホストゾーンを探す。
- 「renew.site.internal.example.com」と完全一致するプライベートホストゾーンは見つからない。
- 完全一致した場合は、一致したレコードを返す。
- 一致しないためスキップ
- 完全一致しない場合は、リクエストのサブドメインを左から順に切り離し、一致するプライベートホストゾーンを探す。
- リクエストの「renew」を切り離し、「site.internal.example.com」でプライベートホストゾーンを検索する
- 見つからないため、リクエストの「site」を切り離し、「internal.example.com」で検索しプライベートホストゾーンと一致する
- ドメインが一致した場合は、一致したホストゾーン内のレコードを返す。
- 「internal.example.com」の「renew.site.internal.example.com」レコードを返す
- ドメインが一致しない場合は、パブリック DNS リゾルバーに転送する。
- 手順3で一致したためスキップ
6. 「nxdomain.internal.example.com」の名前解決
結論、名前解決はできません。(NXDOMAIN)
Private Host Zone (internal.example.com, web.internal.example.com)で、定義されていないレコードですが、プライベートホストゾーン「internal.example.com」で拾われて、「NXDOMAIN」を返します。
先程の手順に当てはめると以下の通りです。
- リクエストが完全一致するドメインのプライベートホストゾーンを探す。
- 「nxdomain.internal.example.com」と完全一致するプライベートホストゾーンは見つからない。
- 完全一致した場合は、一致したレコードを返す。
- 一致しないためスキップ
- 完全一致しない場合は、リクエストのサブドメインを左から順に切り離し、一致するプライベートホストゾーンを探す。
- リクエストの「nxdomain」を切り離し、「internal.example.com」でプライベートホストゾーンと一致する
- ドメインが一致した場合は、一致したホストゾーン内のレコードを返す。
- ホストゾーン内に「nxdomain.internal.example.com」レコードが無いため、NXDOMAINが返される。
- ドメインが一致しない場合は、パブリック DNS リゾルバーに転送する。
- 手順3で一致したためスキップ
まとめ
今回は、スプリットビューDNSの名前解決の順番を整理してみました。
パブリックホストゾーンとプライベートホストゾーンの名前を同じにすると、プライベートホストゾーンで完結されるため注意が必要ですね。
この記事が参考になれば幸いです。
以上、AWS事業本部コンサルティング部のたかくに(@takakuni_)でした!