グルーレコード(Glue Record)
概要
グルーレコード(Glue Record) は、DNS のゾーン委任において、委任先ネームサーバーのホスト名が委任先ゾーン自身の配下にある場合に生じる循環参照を解決するため、親ゾーンに直接登録する A レコードまたは AAAA レコードです。RFC 1034(1987年)で定義されています。
ドメインの NS レコードが ns1.example.com を指している場合、ns1.example.com の IP アドレスを知るには example.com ゾーンに問い合わせる必要があります。しかし example.com ゾーンにたどり着くには ns1.example.com の IP アドレスが必要で、循環参照に陥ります。グルーレコードは、親ゾーン(.com TLD)に ns1.example.com の IP アドレスを事前に登録することでこの依存を断ち切り、DNS の名前解決を完結させます。
DNS プロバイダーの移行時にグルーレコードの更新を忘れると、ドメイン全体の名前解決が停止するため、運用上の影響が大きい設定項目です。
仕組み
グルーレコードは、ゾーン委任における循環参照という DNS 特有の問題を解決する仕組みです。
循環参照の発生
DNS の名前解決は、ルートサーバーから TLD ネームサーバー、権威ネームサーバーへと委任を辿る階層的な構造を持っています。あるドメインの NS レコードが、そのドメイン自身の配下にあるホスト名を指している場合、次のような循環が発生します。
1. 「ns1.example.com の IP アドレスは?」
2. 「example.com の NS を確認する」
3. 「ns1.example.com が権威ネームサーバーだ」
4. 「ns1.example.com の IP アドレスは?」→ 1 に戻る
この循環参照は、委任先ネームサーバーのホスト名が委任先ゾーン内(in-bailiwick)にある場合に発生します。RFC 1034 はこの問題を解決する手法として、親ゾーンにグルーレコードを含めることを規定しています。
グルーレコードの付与
親ゾーンは、委任応答の ADDITIONAL セクションにグルーレコードを含めて返します。これにより再帰リゾルバーは追加の問い合わせなしで委任先ネームサーバーの IP アドレスを取得できます。
; .com TLD ネームサーバーからの委任応答
;; AUTHORITY SECTION:
example.com. 172800 IN NS ns1.example.com.
example.com. 172800 IN NS ns2.example.com.
;; ADDITIONAL SECTION:
ns1.example.com. 172800 IN A 198.51.100.1
ns2.example.com. 172800 IN A 198.51.100.2
AUTHORITY セクションの NS レコードと ADDITIONAL セクションの A レコードがペアで返ることで、再帰リゾルバーは ns1.example.com の IP アドレスを直ちに取得できます。
in-bailiwick と out-of-bailiwick
グルーレコードが必要になるのは、委任先ネームサーバーのホスト名が委任先ゾーン内(in-bailiwick)にある場合のみです。
in-bailiwick の例では、example.com の NS レコードが ns1.example.com を指している場合、委任先ゾーン内のホスト名であるためグルーレコードが必要です。
out-of-bailiwick の例では、example.com の NS レコードが ns1.cloudflare.com を指している場合、委任先ゾーン外のホスト名であるためグルーレコードは不要です。再帰リゾルバーは cloudflare.com の権威ネームサーバーに別途問い合わせて ns1.cloudflare.com の IP アドレスを取得できます。
レジストラでの管理
グルーレコードは、ドメインレジストラの管理画面でネームサーバーを登録する際に IP アドレスの入力を求められる形で設定されます。ゾーンファイルには直接記述されず、TLD レジストリのデータベースに保存されます。
Cloudflare や AWS Route 53 のような DNS プロバイダーを使う場合、ネームサーバーのホスト名はプロバイダーのドメイン配下(ns1.cloudflare.com など)であるため、out-of-bailiwick となりグルーレコードは不要です。独自のネームサーバーをホスト名ごと自ドメイン配下に置く場合にのみグルーレコードの管理が必要になります。
設定例
グルーレコードが必要なケースと不要なケースを示します。
独自ネームサーバーを使用する場合(グルーレコード必要)
example.com のネームサーバーとして ns1.example.com と ns2.example.com を使用する場合、レジストラの管理画面でネームサーバー名と IP アドレスの両方を登録します。
; レジストラに登録する内容
; ネームサーバー: ns1.example.com → 198.51.100.1
; ネームサーバー: ns2.example.com → 198.51.100.2
この IP アドレスが TLD レジストリのグルーレコードとして登録されます。ゾーンファイル側では、これらのネームサーバーの A レコードと NS レコードも定義します。
; example.com ゾーンファイル
@ IN NS ns1.example.com.
@ IN NS ns2.example.com.
ns1 IN A 198.51.100.1
ns2 IN A 198.51.100.2
外部 DNS プロバイダーを使用する場合(グルーレコード不要)
Cloudflare を DNS プロバイダーとして使う場合の設定です。
; レジストラに登録する内容(IP アドレスの入力は不要)
; ネームサーバー: ns1.cloudflare.com
; ネームサーバー: ns2.cloudflare.com
cloudflare.com ゾーン内で ns1.cloudflare.com と ns2.cloudflare.com の IP アドレスが解決できるため、グルーレコードは不要です。レジストラの管理画面で IP アドレスの入力を求められない場合、out-of-bailiwick のネームサーバーであることを意味します。
IPv6 ネームサーバーの AAAA グルーレコード
ネームサーバーに IPv6 アドレスを使用する場合、A レコードに加えて AAAA レコードもグルーレコードとして登録します。
; レジストラに登録する内容
; ネームサーバー: ns1.example.com → 198.51.100.1, 2001:db8::1
; ネームサーバー: ns2.example.com → 198.51.100.2, 2001:db8::2
RFC 3901(2004年)は、DNS インフラが IPv4 と IPv6 の両方で利用可能であることを推奨しており、ネームサーバーには IPv4 と IPv6 の両方のグルーレコードを登録することが望ましいとされています。
確認方法
グルーレコードの存在を確認するには、TLD ネームサーバーに直接問い合わせます。
dig NS example.com @a.gtld-servers.net
;; AUTHORITY SECTION:
example.com. 172800 IN NS ns1.example.com.
example.com. 172800 IN NS ns2.example.com.
;; ADDITIONAL SECTION:
ns1.example.com. 172800 IN A 198.51.100.1
ns2.example.com. 172800 IN A 198.51.100.2
ADDITIONAL セクションに A レコード(または AAAA レコード)が含まれていれば、グルーレコードが正しく登録されています。ADDITIONAL セクションが空の場合、out-of-bailiwick のネームサーバーを使っているか、グルーレコードの登録に問題があります。
+trace オプションを使うと、ルートからの委任チェーン全体を追跡できます。
dig A ns1.example.com +trace
外部の視点からも確認したい場合は、Labee Dev Toolbox の DNS API を使うと、外部の視点から見た結果を取得できます。
curl "https://labee.dev/api/dns?domain=example.com&type=NS,A"
{
"success": true,
"data": {
"domain": "example.com",
"records": {
"NS": ["ns1.example.com", "ns2.example.com"],
"A": [
{ "address": "198.51.100.1", "ttl": 172800 }
]
}
},
"error": null,
"meta": { "responseTime": 35 }
}
records.NS に自ドメイン配下のネームサーバーが含まれている場合、グルーレコードの整合性を確認する必要があります。ネームサーバーの IP アドレスが変わった場合は、グルーレコードも更新しなければなりません。
よくある問題
グルーレコードに関連するトラブルは、IP アドレスの更新忘れとレジストラ設定の不整合が大半を占めます。
DNS プロバイダー移行後にグルーレコードが古いまま
DNS プロバイダーを移行してネームサーバーの IP アドレスが変わった場合、レジストラに登録したグルーレコードも更新する必要があります。グルーレコードが古い IP アドレスを指したままだと、再帰リゾルバーが委任先ネームサーバーに到達できず、ドメイン全体の名前解決が停止します。
TLD ネームサーバーのキャッシュ TTL は通常 172800 秒(48 時間) であるため、グルーレコードの更新が世界中に伝播するまでに最大 48 時間かかります。移行期間中は新旧両方の IP アドレスでネームサーバーを稼働させ、伝播完了後に旧サーバーを停止する手順を取ります。
out-of-bailiwick にグルーレコードを設定してしまう
ns1.cloudflare.com のように委任先ゾーン外のネームサーバーに対してグルーレコードを設定すると、TLD レジストリがそのレコードを無視するか、古い IP アドレスがキャッシュされて実態と乖離する原因になります。out-of-bailiwick のネームサーバーにはグルーレコードを設定しません。
IPv6 のみのグルーレコードで IPv4 から到達できない
AAAA レコードのグルーレコードのみを登録し、A レコードのグルーレコードを登録していない場合、IPv4 しか利用できない再帰リゾルバーからネームサーバーに到達できません。RFC 3901 は DNS インフラにおける IPv4 と IPv6 のデュアルスタック運用を推奨しており、グルーレコードにも A と AAAA の両方を登録します。
ネームサーバーのホスト名を変更したのにグルーレコードを更新しない
ns1.example.com から ns1.newname.example.com のようにネームサーバーのホスト名自体を変更した場合、古いホスト名のグルーレコードが TLD レジストリに残り続けます。レジストラ管理画面で古いネームサーバーのホスト名を削除し、新しいホスト名と IP アドレスを登録し直します。