IPv6(Internet Protocol version 6)
概要
IPv6(Internet Protocol version 6) は、128 ビットのアドレス空間を持つインターネットプロトコルです。RFC 8200(2017年)で定義されており、約 3.4 x 10^38 個(340 澗)のアドレスを割り当てられます。32 ビットで約 43 億個のアドレスしか提供できない IPv4 の枯渇問題を根本的に解決するために設計されました。
IPv4 のグローバルアドレス在庫は、IANA が 2011 年 2 月に最後のブロックを各 RIR に分配した時点で枯渇しています。APNIC(アジア太平洋地域)は 2011 年 4 月に通常割り当てを終了し、以降は /22(1,024 アドレス)の最終在庫ポリシーで運用しています。Google の統計によると、2024 年時点で世界のトラフィックの約 45% が IPv6 経由です。
IPv6 はコロン区切りの 16 進数表記を使います。2001:0db8:85a3:0000:0000:8a2e:0370:7334 のように 16 ビットずつ 8 グループに分けて表現します。NAT を使わずに各デバイスにグローバルアドレスを直接割り当てるエンドツーエンド通信を前提としており、IPsec を標準でサポートします。
仕組み
IPv6 は 128 ビットのアドレスをコロン区切りの 16 進数で表記し、NAT 不要のエンドツーエンド通信を前提に設計されています。
アドレスの構造
IPv6 アドレスは 128 ビットを 16 ビットずつ 8 グループに分け、各グループをコロンで区切った 16 進数で表記します。
2001:0db8:85a3:0000:0000:8a2e:0370:7334
表記を簡略化するルールが 2 つあります。
各グループの先頭のゼロは省略できます。0db8 は db8、0370 は 370 と書けます。
2001:db8:85a3:0:0:8a2e:370:7334
連続するゼロのグループは :: で 1 回だけ省略できます。
2001:db8:85a3::8a2e:370:7334
:: を 2 回以上使うと、省略されたゼロの数が一意に決まらなくなるため禁止されています。
アドレスの種類
IPv6 アドレスは用途によって 3 つのタイプに分かれます。
| タイプ | プレフィックス | 用途 |
|---|---|---|
| グローバルユニキャスト | 2000::/3 | インターネット上で一意に識別されるアドレス。IPv4 のグローバルアドレスに相当する |
| リンクローカル | fe80::/10 | 同一リンク(LAN セグメント)内でのみ有効。自動設定される |
| ユニークローカル(ULA) | fc00::/7 | プライベートネットワーク内で使用。IPv4 の 10.0.0.0/8 や 192.168.0.0/16 に相当する |
ループバックアドレスは ::1 です。IPv4 の 127.0.0.1 に相当します。
ドキュメント用の予約プレフィックスは 2001:db8::/32 で、RFC 3849 で定義されています。実際のネットワークには割り当てられないため、技術文書やサンプル設定に安全に使えます。
IPv4 との主な違い
IPv6 は IPv4 のアドレス拡張にとどまらず、プロトコル自体を再設計しています。
IPv4 ヘッダーは可変長で最大 60 バイトですが、IPv6 の基本ヘッダーは 40 バイト固定です。オプション情報は拡張ヘッダーとして基本ヘッダーの後ろに連結する方式を採用しており、ルーターの処理効率が向上しています。
IPv4 ではルーター間でパケットを分割(フラグメント)する機能がありましたが、IPv6 ではフラグメントを送信元ホストのみが行います。経路上のルーターはフラグメントしません。送信元は Path MTU Discovery(RFC 8201)でパスの MTU を検出し、その MTU 以下のサイズでパケットを送信します。IPv6 の最小 MTU は 1,280 バイトです。
IPv4 ではブロードキャスト(ネットワーク全体への一斉送信)が使えましたが、IPv6 にはブロードキャストがありません。代わりにマルチキャストを使います。「ネットワーク上の全ノード」に送る場合は ff02::1、「全ルーター」に送る場合は ff02::2 を宛先にします。
NAT の不要化
IPv4 では、グローバルアドレスの不足を補うために NAT(Network Address Translation)が広く使われてきました。家庭やオフィスのルーターが 1 つのグローバルアドレスを共有し、内部のプライベートアドレスと変換する仕組みです。
IPv6 では各デバイスにグローバルユニキャストアドレスを直接割り当てられるため、NAT は原則不要です。端末間で直接通信するエンドツーエンドの原則が復活し、P2P アプリケーションや VoIP の NAT 越え問題が解消されます。
アドレスの自動設定
IPv6 には SLAAC(Stateless Address Autoconfiguration、RFC 4862)という仕組みがあります。ルーターがネットワークプレフィックスを RA(Router Advertisement)で通知し、ホストはそのプレフィックスと自身の MAC アドレスから導出したインターフェース ID を組み合わせてアドレスを自動生成します。DHCP サーバーなしでアドレスが決まるため、小規模ネットワークの導入が容易です。
大規模ネットワークでは DHCPv6(RFC 8415)を併用し、DNS サーバーや NTP サーバーの情報を配布します。
IPsec の標準サポート
IPv6 は IPsec を仕様レベルでサポートしています。IPv4 でも IPsec は利用できましたがオプション扱いでした。IPv6 では拡張ヘッダーとして AH(Authentication Header)と ESP(Encapsulating Security Payload)が定義されており、暗号化とデータ完全性の検証をネットワーク層で実現できます。
DNS との関係
IPv6 アドレスを DNS で名前解決するには AAAA レコード(RFC 3596)を使います。A レコードが IPv4 アドレスを返すのに対し、AAAA レコードは IPv6 アドレスを返します。
逆引き(IPv6 アドレスからドメイン名を取得)は ip6.arpa ゾーンに PTR レコードを設定して行います。128 ビットを 4 ビットずつのニブルに分け、逆順にドットで連結した名前を使います。
4.3.3.7.0.7.3.0.e.2.a.8.0.0.0.0.0.0.0.0.3.a.5.8.8.b.d.0.1.0.0.2.ip6.arpa. IN PTR example.com.
具体例
IPv6 アドレスの省略表記パターン、代表的なアドレス、デュアルスタック構成の DNS 設定を示します。
IPv6 アドレスの表記パターン
完全表記: 2001:0db8:85a3:0000:0000:8a2e:0370:7334
先頭ゼロ省略: 2001:db8:85a3:0:0:8a2e:370:7334
ゼロ圧縮: 2001:db8:85a3::8a2e:370:7334
代表的なアドレス
::1 ループバック(IPv4 の 127.0.0.1)
:: 全ゼロ(未指定アドレス)
fe80::1 リンクローカルアドレス
2001:db8::1 ドキュメント用アドレス
2001:4860:4860::8888 Google Public DNS
2606:4700:4700::1111 Cloudflare DNS
デュアルスタック構成の DNS 設定
IPv4 と IPv6 の両方で到達可能にするには、A レコードと AAAA レコードを並行して設定します。
example.com. IN A 93.184.216.34
example.com. IN AAAA 2606:2800:21f:cb07:6820:80da:af6b:8b2c
確認方法
自分の接続が IPv4 と IPv6 のどちらを使っているかを確認するには、curl でアクセスしている IP アドレスを取得します。
curl -6 ifconfig.me
-6 オプションで IPv6 接続を強制します。IPv6 接続が利用できない場合はエラーになります。
外部の視点からも確認したい場合は、Labee Dev Toolbox の IP API を使うと、外部の視点から見た結果を取得できます。
curl "https://labee.dev/api/ip?ip=2001:4860:4860::8888"
レスポンスは次の形式で返ります。
{
"success": true,
"data": {
"ip": "2001:4860:4860::8888",
"type": "IPv6",
"isPrivate": false,
"ptr": "dns.google"
},
"error": null,
"meta": { "responseTime": 52 }
}
type フィールドが IPv4 または IPv6 を返し、アドレスの種別を判別できます。isPrivate はリンクローカル(fe80::/10)やユニークローカル(fc00::/7)、ドキュメント用(2001:db8::/32)のアドレスに対して true を返します。ptr は逆引き DNS の結果です。
自分のグローバル IP を確認するだけなら、パラメーターなしで IP API にアクセスします。
curl "https://labee.dev/api/ip"
data.ip にクライアントの IP アドレスが、data.type にその種別が含まれます。IPv6 で接続していれば type は IPv6 です。
ドメインに AAAA レコードが設定されているかを確認するには dig を使います。
dig AAAA example.com
;; ANSWER SECTION:
example.com. 86400 IN AAAA 2606:2800:21f:cb07:6820:80da:af6b:8b2c
ANSWER SECTION が空の場合、そのドメインには AAAA レコードが設定されていません。
IPv6 アドレスからの逆引きを確認するには、PTR レコードを問い合わせます。
dig -x 2001:4860:4860::8888
-x オプションは指定したアドレスの ip6.arpa 名を自動生成して PTR クエリを送信します。
よくある問題
IPv6 の運用トラブルは、経路上の機器の未対応、URL 中の記法ミス、メールサーバーの PTR レコード未設定に集中しています。
IPv6 アドレスが割り当てられているのに通信できない
AAAA レコードや IPv6 アドレスの設定だけでは通信は成立しません。経路上のすべての機器(ルーター、ファイアウォール、ロードバランサー)が IPv6 をサポートし、ルーティングが設定されている必要があります。
ファイアウォールで IPv6 のトラフィックがブロックされていないか確認します。IPv4 用のルールしか定義していない場合、IPv6 の通信は暗黙的に拒否されることがあります。ip6tables(Linux)や OS のファイアウォール設定を確認してください。
URL 中の IPv6 アドレスの書き方
ブラウザーや curl で IPv6 アドレスを直接指定する場合、角括弧 [] で囲む必要があります。
curl http://[2001:db8::1]:8080/
角括弧なしで記述すると、コロンがポート番号の区切りと誤認されます。
デュアルスタック環境で IPv6 の遅延が大きい
RFC 8305(Happy Eyeballs v2)により、IPv6 接続を先に試み、250 ミリ秒以内に応答がなければ IPv4 で並行して接続を開始します。IPv6 の経路に問題がある場合、この 250 ミリ秒の遅延がユーザー体験に影響します。IPv6 の到達性に問題があるなら、AAAA レコードを一時的に削除して IPv4 のみで運用することも選択肢です。
メールサーバーの IPv6 対応で拒否される
IPv6 でメールを送信する場合、送信元 IPv6 アドレスの PTR レコード(逆引き)が設定されていないと、受信サーバーが接続を拒否することがあります。Gmail は IPv6 送信元に対して PTR レコードの存在を要求しています。SPF レコードにも IPv6 の送信元を ip6: メカニズムで追加する必要があります。
v=spf1 ip4:93.184.216.34 ip6:2001:db8::/32 -all
プライベートアドレスとリンクローカルの混同
fe80::/10(リンクローカル)はインターフェースごとに自動生成されるアドレスで、同一 LAN セグメント内でのみ到達可能です。fc00::/7(ユニークローカル)は組織内のプライベートネットワーク用で、ルーティングすれば拠点間でも通信できます。用途が異なるため、サーバー設定やファイアウォールルールで混同しないようにしてください。