AAAA レコード
概要
AAAA レコード(Quad-A Record) は、ドメイン名を 128 ビットの IPv6 アドレスに対応付ける DNS レコードです。RFC 3596(2003年)で定義されており、example.com に対して 2606:2800:21f:cb07:6820:80da:af6b:8b2c のような IPv6 アドレスを返します。A レコードが 32 ビットの IPv4 アドレスを格納するのに対し、AAAA レコードは 4 倍の 128 ビットを使うことから「Quad-A」と呼ばれています。
IPv4 アドレスの枯渇に伴い、IPv6 への移行は着実に進んでいます。Google の統計によると、2024 年時点で世界のトラフィックの約 45% が IPv6 経由です。モバイルキャリアでは IPv6 のみの接続を提供する事業者も増えており、AAAA レコードを設定していないドメインはこれらの環境からアクセスできなくなるリスクがあります。A レコードと AAAA レコードの両方を設定するデュアルスタック構成が、現代のインフラ運用における標準です。
仕組み
AAAA レコードのフィールド構成、IPv6 アドレスの表記ルール、Happy Eyeballs による接続選択の仕組みを順に見ていきます。
レコードの構造
AAAA レコードは次のフィールドで構成されます。
example.com. IN AAAA 2606:2800:21f:cb07:6820:80da:af6b:8b2c
| フィールド | 説明 |
|---|---|
| NAME | レコードの所有者名。ゾーンの頂点(example.com.)やサブドメイン(www.example.com.)を指定する |
| TTL | キャッシュの有効秒数。省略時はゾーンの $TTL が適用される |
| CLASS | 通常は IN(Internet) |
| TYPE | AAAA(レコードタイプ番号 28) |
| RDATA | 128 ビットの IPv6 アドレス(コロン区切り 16 進表記) |
IPv6 アドレスの表記
IPv6 アドレスは 128 ビットを 16 ビットずつ 8 グループに分け、各グループをコロン区切りの 16 進数で表します。
2001:0db8:85a3:0000:0000:8a2e:0370:7334
連続するゼロのグループは :: で省略できます。この省略は 1 つのアドレス内で 1 回だけ使えます。
2001:db8:85a3::8a2e:370:7334
各グループの先頭のゼロも省略可能です。0db8 は db8 と書けます。
クエリの流れ
ブラウザーが example.com にアクセスするとき、OS のリゾルバーは A レコード(IPv4)と AAAA レコード(IPv6)の両方を問い合わせます。RFC 8305(Happy Eyeballs v2、2017年)のアルゴリズムにより、IPv6 の接続を先に試み、250 ミリ秒以内に応答がなければ IPv4 にフォールバックします。
具体的な流れは次のとおりです。
- リゾルバーが AAAA クエリと A クエリを同時に送信する
- AAAA の応答が先に返れば IPv6 で接続を開始する
- 250 ミリ秒経過しても IPv6 接続が確立しなければ、IPv4 での接続を並行して開始する
- 先に確立した方の接続を使い、もう一方を破棄する
この仕組みにより、AAAA レコードを設定しても IPv6 の到達性に問題があるネットワークでユーザー体験が劣化するリスクは低く抑えられています。
A レコードとの共存
1 つのドメインに A レコードと AAAA レコードの両方を設定することをデュアルスタック構成と呼びます。クライアントがどちらのプロトコルを使うかは、RFC 6724 の宛先アドレス選択ルールと Happy Eyeballs アルゴリズムによって決まります。一般的なクライアントは IPv6 を優先します。
DNS の名前解決レベルでは、A クエリと AAAA クエリは独立した問い合わせです。AAAA レコードが存在しない場合、AAAA クエリに対して NODATA 応答(RCODE=0、Answer セクション空)が返ります。これはエラーではなく「そのタイプのレコードは存在しない」という正常な応答です。
設定例
AAAA レコードの基本設定からデュアルスタック構成まで、代表的な設定パターンを示します。
基本的な AAAA レコード
example.com. IN AAAA 2001:db8::1
www.example.com. IN AAAA 2001:db8::1
デュアルスタック構成(A + AAAA)
example.com. IN A 93.184.216.34
example.com. IN AAAA 2606:2800:21f:cb07:6820:80da:af6b:8b2c
A レコードと AAAA レコードの TTL は同じ値に揃えるのが推奨されます。異なる TTL を設定すると、キャッシュの有効期間にずれが生じ、一方のプロトコルだけが古いアドレスを参照し続ける状態になります。
複数の AAAA レコード
example.com. IN AAAA 2001:db8::1
example.com. IN AAAA 2001:db8::2
A レコードと同様に、1 つのドメインに複数の AAAA レコードを設定できます。DNS ラウンドロビンによる負荷分散が可能ですが、ヘルスチェック機能はありません。
ゾーンファイルでの記述
$TTL 3600
@ IN AAAA 2001:db8::1
@ はゾーンの頂点(Apex ドメイン)を表します。AAAA レコードでも A レコードと同じく @ でルートドメインを指定できます。
確認方法
dig でドメインの AAAA レコードを確認するには次のコマンドを使います。
dig AAAA example.com
出力の ANSWER SECTION に IPv6 アドレスが表示されます。
;; ANSWER SECTION:
example.com. 86400 IN AAAA 2606:2800:21f:cb07:6820:80da:af6b:8b2c
A レコードと AAAA レコードの両方を一度に確認したい場合は ANY を使います。ただし、一部のリゾルバー(Cloudflare の 1.1.1.1 など)は ANY クエリに対して全レコードを返さないことがあります。
dig A example.com
dig AAAA example.com
個別に問い合わせるほうが確実です。
特定のネームサーバーに直接問い合わせるには @ でサーバーを指定します。
dig AAAA example.com @8.8.8.8
外部の視点からも確認したい場合は、Labee Dev Toolbox の DNS API を使うと、外部の視点から見た結果を取得できます。
curl "https://labee.dev/api/dns?domain=example.com&type=AAAA"
レスポンスは次の形式で返ります。
{
"success": true,
"data": {
"domain": "example.com",
"records": {
"AAAA": [
{ "address": "2606:2800:21f:cb07:6820:80da:af6b:8b2c", "ttl": 86400 }
]
}
},
"error": null,
"meta": { "responseTime": 38 }
}
records.AAAA が配列で返るため、複数の IPv6 アドレスが設定されている場合は複数エントリが含まれます。A レコードも同時に取得するにはタイプ指定なしで問い合わせます。
curl "https://labee.dev/api/dns?domain=example.com"
レスポンスには records.A と records.AAAA の両方が含まれます。
{
"success": true,
"data": {
"domain": "example.com",
"records": {
"A": [
{ "address": "93.184.216.34", "ttl": 86400 }
],
"AAAA": [
{ "address": "2606:2800:21f:cb07:6820:80da:af6b:8b2c", "ttl": 86400 }
],
"MX": null,
"TXT": null,
"NS": null,
"CNAME": null,
"SOA": null,
"CAA": null
}
},
"error": null,
"meta": { "responseTime": 45 }
}
よくある問題
AAAA レコードの設定・運用で発生しやすいトラブルと、その原因・対処法を整理します。
AAAA レコードを設定したが IPv6 で接続できない
AAAA レコードの設定だけでは IPv6 接続は完結しません。ウェブサーバー、ロードバランサー、ファイアウォールが IPv6 トラフィックを受け入れる設定になっている必要があります。Nginx の場合、listen ディレクティブに IPv6 アドレスを追加します。
server {
listen 80;
listen [::]:80;
listen 443 ssl;
listen [::]:443 ssl;
server_name example.com;
}
[::] は全ての IPv6 アドレスでリッスンすることを意味します。この設定がなければ、AAAA レコードで IPv6 アドレスが返っても、サーバーが接続を受け付けません。
IPv6 アドレスを変更したのに古いアドレスに接続される
A レコードと同じく、TTL の影響を受けます。AAAA レコードの TTL が長い場合(例: 86400 秒 = 24 時間)、変更後もキャッシュが残り続けます。IP アドレスの変更を計画する場合は、変更の 24〜48 時間前に TTL を 300 秒に下げておき、移行完了後に元の値に戻します。
PTR レコード(逆引き)を設定していない
AAAA レコードで正引き(ドメイン → IPv6 アドレス)を設定したら、対応する PTR レコード(IPv6 アドレス → ドメイン)も設定することが推奨されます。メールサーバーの IPv6 アドレスに PTR レコードが設定されていない場合、受信側がメールを拒否することがあります。IPv6 の PTR レコードは ip6.arpa ゾーンに設定します。
c.2.b.8.b.6.a.f.a.d.0.8.0.2.8.6.7.0.b.c.f.1.2.0.0.0.8.2.6.0.6.2.ip6.arpa. IN PTR example.com.
IPv6 の逆引きゾーンは各ニブル(4 ビット)ごとにドットで区切るため、アドレスが長くなります。
CDN やクラウドサービスで AAAA が自動的に追加されない
一部の CDN やクラウドプロバイダーは、IPv6 対応を有効にする設定を別途行う必要があります。Cloudflare は自動的に AAAA レコードを生成しますが、AWS CloudFront や Azure CDN では IPv6 対応を明示的に有効化する設定が必要です。CDN のドキュメントで IPv6 対応の手順を確認してください。
A レコードのみの環境で IPv6 クライアントからアクセスできない
AAAA レコードが存在しないドメインには、IPv6 のみの環境からアクセスできません。ただし、多くのモバイルキャリアは NAT64/DNS64 という変換技術を提供しており、DNS64 リゾルバーが A レコードの応答を合成 AAAA レコードに変換します。この場合、AAAA レコードを設定していなくても IPv6 クライアントからのアクセスが可能になることがあります。ただし NAT64/DNS64 はキャリアの設備に依存するため、自ドメインの IPv6 対応を NAT64 に頼るのは推奨されません。