- ネットワーク
IPv6とは?IPv4との違い・アドレスの読み方・確認方法をパケットで解説
結論
IPv6は、IPv4の後継のインターネットの通信規格(プロトコル)です。アドレスの長さが32ビットから128ビットに増え、約43億個だったアドレスが約3.4×10の38乗個になりました。IPv4とは互換性が無いため、今は両方を同時に使う「デュアルスタック」が一般的です。
この記事でわかること
- IPv4とIPv6の違い(アドレス・ヘッダー・ARPとNDP・設定の仕方)
- アドレスの読み方・省略ルールと、自分の環境がIPv6か確かめる方法
- IPoE・MAP-E・DS-Liteの関係と「IPv6なら速い」の本当のところ
IPv6の機器は、電源が入ると自分でアドレスを作り、同じアドレスが無いかを確かめ、ルーターから「このネットワークの番号」を教わって、インターネット用のアドレスを組み立てます。IPv4のように、手で設定したりDHCPサーバーを必ず用意したりしなくても動くのが大きな違いです。この流れを、実際にパケットを送って確かめました。
flowchart TD
A[MACアドレスから<br>リンクローカルを作る] --> B[DAD<br>同じアドレスが無いか確認]
B --> C[RS<br>ルーターを探す]
C --> D[RA<br>プレフィックスを受け取る]
D --> E[SLAAC<br>アドレスを組み立てる]
E --> F[DAD<br>もう一度確認]
F --> G[NS・NA<br>相手のMACを調べる]
G --> H[通信できる]
よく調べられることの答えを先にまとめます。
| 知りたいこと | 答え | 詳しい節 |
|---|---|---|
| IPv6とは | IPv4の後継のIP。アドレスが128ビットで、事実上足りなくならない数がある | IPv6とは |
| IPv6とIPv4の違い | アドレスの長さ・表記・ヘッダー・ARPの有無・自動設定・NATの要否 | IPv4とIPv6の違い |
| IPv6アドレスの読み方 | 16ビットずつ8つに区切って16進数で書く。0は省略できる | アドレスの読み方と省略ルール |
| fe80や fd で始まるアドレス | fe80::はリンクローカル、fd はユニークローカル(社内・家庭内用) | IPv6アドレスの種類 |
| 自分の環境がIPv6か確かめたい | ipconfig や ip -6 addr で、2 か 3 で始まるグローバルアドレスがあるかを見る | IPv6か確かめる方法 |
| IPoE・IPv4 over IPv6とは | IPoEはIPv6の接続方式。IPv4のパケットをIPv6で包んで運ぶのがMAP-E・DS-Lite | IPoE・MAP-E・DS-Lite |
| IPv6にすると速くなるか | 規格そのものより、混みにくい接続方式(IPoE)に変わる効果が大きい | IPv6のよくある誤解 |
| IPv6を無効にしてよいか | 原因が分からないまま無効にしない。DNSと経路を先に確かめる | よくあるエラーとつまずき |
確認環境:Ubuntu 24.04.5 LTS(Linux 6.18)。この環境のカーネルは起動時に ipv6.disable=1 が指定されていてIPv6を使えない(戻すには再起動が要るため変えていません)ため、ip netns の名前空間2つ(t40a・t40b)を veth でつなぎ、scapy 2.8.0(Python 3.13.18)で Ethernet フレームを直接読み書きする小さなIPv6ホストとルーターを作りました。リンクローカルの生成・DAD・RS/RA・SLAAC・NS/NA・ICMPv6 Echo を実際に送受信し、tcpdump 4.99.4 で取ったパケットを載せています。IPv6が無効なときのエラーは iproute2 6.1.0・iputils-ping 20240117・netcat-openbsd 1.226・curl 8.5.0・Node.js 22.23.4・Python の原文、アドレスの省略と種類は Python の ipaddress で確かめました。カーネルのIPv6が動く環境の ip -6・ping -6 の画面は出せないため、man ページとカーネルの公式ドキュメントの範囲で書いています。規格は RFC、IPv4枯渇は総務省・JPNIC、IPoE・MAP-E・DS-Lite は NTT東日本の解説と NEC Aterm の公式マニュアル、Windows・Mac は Microsoft・Apple の公式ドキュメントで確かめ、外部のIPv6確認サイトには問い合わせていません。図は mermaid 11.16.0 で描画を確かめています(確認日 2026年10月29日)。
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「IPv6とは?IPv4との違い・アドレスの読み方・確認方法をパケットで解説」
IPv6とは(意味と、生まれた理由)
この節では、IPv6が何で、なぜ必要になったのかが分かります。
IPv6(Internet Protocol version 6)は、インターネットでパケットを宛先まで届けるための規格「IP」の第6版です。今も広く使われているIPv4(第4版)の後継で、仕様は RFC 8200 にまとめられています。IPv4もIPv6も役目は同じで、「どの機器からどの機器へ送るか」をアドレスで示し、ルーターが順に受け渡して届けます。
IPv6が作られた一番の理由は、IPv4のアドレスが足りなくなったことです。IPv4のアドレスは32ビットで、全部で約43億個しかありません。スマートフォンや家電までインターネットにつながるようになり、新しく配れるアドレスが尽きました。
- JPNICによると、2011年2月3日に、IANA(世界のIPアドレスを管理する組織)が管理するIPv4アドレスの最後の分配が行われました。
- 総務省の発表(2011年4月15日)では、同じ日にアジア太平洋地域を管轄するAPNICが、通常の申請で分配できるIPv4アドレスの在庫が枯渇したと発表しています。以後の分配は、1つの事業者あたり合計1,024個が上限になりました。
- 総務省は同じ発表で、すでに使われているIPv4アドレスは引き続き有効で、一般の利用者に直接の影響は無いこと、事業者がIPv6を早く導入することが一層重要になったことを書いています。
アドレスの数は、Python で計算すると次のとおりです。IPv6のアドレスはIPv4の約7.9×10の28乗倍あります。家庭や会社の1つのネットワーク(/64)だけで、IPv4の全体の約43億倍のアドレスがあります。
>>> 2**32
4294967296
>>> f"{2**128:.4e}", f"{2**128/2**32:.4e}"
('3.4028e+38', '7.9228e+28')
>>> 2**64 # 1つのネットワーク(/64)の中のアドレスの数
18446744073709551616
IPアドレスそのもの(グローバルとプライベート、サブネットマスク、確認方法)は、IPアドレスの入口の記事に任せ、この記事ではIPv6に絞って書きます。IPv4とIPv6の「外から見えるIP」の確かめ方とNATの実演は、関連記事「グローバルIPの確認方法|コマンド・プライベートIPとの違いとNATを実演」で扱っています。
IPv4とIPv6の違い(一覧表)
この節では、IPv4とIPv6の違いが一覧で分かります。
違いはアドレスの長さだけではありません。ヘッダーの作り、相手の MAC アドレスの調べ方、アドレスの付き方、NAT の使い方まで変わっています。いちばん大事なのは、IPv4とIPv6には互換性が無いことです。IPv6だけの機器はIPv4だけのサーバーと直接は話せないため、両方を同時に動かすか、片方をもう片方で包んで運ぶ仕組みが使われています。
| 項目 | IPv4 | IPv6 |
|---|---|---|
| アドレスの長さ | 32ビット(約43億個) | 128ビット(約3.4×10の38乗個) |
| 書き方 | 10進数を「.」で4つに区切る(192.0.2.1) | 16進数を「:」で8つに区切る(2001:db8::1) |
| 基本ヘッダー | 20〜60バイト(オプションで変わる) | 40バイト固定。追加の情報は拡張ヘッダーへ |
| ヘッダーのチェックサム | あり(ルーターごとに計算し直す) | なし(上位の TCP・UDP が確かめる) |
| 途中での分割(フラグメント) | ルーターが分割することがある | 送信元だけが分割する。最小MTUは1,280バイト |
| 相手の MAC アドレスを調べる | ARP(ブロードキャスト) | NDP(ICMPv6 とマルチキャスト) |
| ブロードキャスト | あり | なし(マルチキャストで代わりをする) |
| アドレスの自動設定 | DHCP が必要 | SLAAC(ルーター広告だけで作れる)か DHCPv6 |
| 1つのインターフェースのアドレス | ふつうは1つ | 複数が当たり前(リンクローカル+グローバルなど) |
| NAT | 家庭・会社で広く使う | 前提にしない。機器ごとにグローバルアドレスを持てる |
| DNS のレコード | A | AAAA |
| URL でのアドレスの書き方 | http://192.0.2.1:8080/ | http://[2001:db8::1]:8080/(角かっこで囲む) |
IPv4の ARP については、関連記事「Linuxネットワークコマンド一覧|ip/ss/ncで障害切り分け」で、ip neigh などのコマンドと合わせて扱っています。
IPv6アドレスの読み方と省略ルール(::の決まり)
この節では、IPv6アドレスの書き方と、0を省略するときの決まりが、実際に変換した結果で分かります。
IPv6アドレスは128ビットを16ビットずつ8つに分け、それぞれを16進数4桁で書き、「:」でつなぎます。1つの区切りを「フィールド」や「ブロック」と呼びます。そのままでは長いので、RFC 5952 が「どう省略して書くか」を決めています。
- 1各フィールドの先頭の0を消す0db8 → db8、0000 → 0。途中や末尾の0は消さない(00ff → ff、fe12 はそのまま)
- 20だけのフィールドが2つ以上続く所を「::」にするいちばん長く続く所を選ぶ。同じ長さなら前の方
- 3「::」は1つのアドレスに1回だけ2回使うと、それぞれ何個の0か分からなくなる
- 40のフィールドが1つだけなら「::」にしない2001:db8:0:1:… の 0 はそのまま書く
- 5英字は小文字で書く2001:0DB8 → 2001:db8。入力は大文字でも同じアドレス
Python の ipaddress で、省略していない形(exploded)と省略した形(compressed)を出しました。Python 3.13.18 の結果で、RFC 5952 の決まりと一致しています。
import ipaddress as ip
for a in ["2001:0db8:0000:0000:0000:0000:0000:0001", ...]:
x = ip.IPv6Address(a)
print(f"{a:42} -> {x.compressed:28} exploded={x.exploded}")
| 入力 | 省略した形(compressed) | 決まり |
|---|---|---|
| 2001:0db8:0000:0000:0000:0000:0000:0001 | 2001:db8::1 | 先頭の0を消し、6つ続く0を::に |
| 2001:0DB8:0000:0000:0001:0000:0000:0001 | 2001:db8::1:0:0:1 | 同じ長さ(2つ)の0が2か所。前の方を::に。小文字に |
| 2001:db8:0:1:0:0:0:1 | 2001:db8:0:1::1 | 1つだけの0は残し、3つ続く方を::に |
| 2001:db8:1:0:1:0:1:0 | 2001:db8:1:0:1:0:1:0 | 0が1つずつしか無いので省略しない |
| 0000:0000:0000:0000:0000:0000:0000:0001 | ::1 | ループバック(自分自身) |
| 0:0:0:0:0:0:0:0 | :: | 未指定アドレス(全部0) |
| fe80:0000:0000:0000:5054:00ff:fe12:3456 | fe80::5054:ff:fe12:3456 | 00ff の先頭の0だけ消す |
| ::ffff:192.0.2.1 | ::ffff:192.0.2.1 | IPv4射影アドレスは末尾をIPv4の形で書ける |
間違った書き方を渡すと、Python は次のエラーを返しました。手で書いたアドレスが設定で弾かれるときの確かめ方に使えます。
2001:db8::1::1 ValueError: At most one '::' permitted in '2001:db8::1::1'
2001:db8:0:0:0:0:0:0:1 ValueError: Exactly 8 parts expected without '::' in '2001:db8:0:0:0:0:0:0:1'
2001:db8:12345::1 ValueError: At most 4 characters permitted in '12345' in '2001:db8:12345::1'
2001:db8::g ValueError: Only hex digits permitted in 'g' in '2001:db8::g'
2001:db8:::1 ValueError: At most one '::' permitted in '2001:db8:::1'
URL・ポート番号と一緒に書くとき
IPv6アドレスには「:」が入っているため、ポート番号の「:」と区別できません。URL ではアドレスを角かっこ [ ] で囲みます。Python の urllib.parse で分けると、角かっこの中がアドレス、外がポートとして読み取られました。
>>> from urllib.parse import urlsplit
>>> u = urlsplit("http://[fd52:6bf9:26d1:1::1]:8080/index.html")
>>> u.hostname, u.port
('fd52:6bf9:26d1:1::1', 8080)
リンクローカルアドレスには、どのインターフェースのものかを示す「ゾーンID」を % の後ろに付けます(例:fe80::1%eth0)。Python でも IPv6Address("fe80::1%t40-va").scope_id で t40-va が取り出せました。
IPv6アドレスの種類(リンクローカル・ユニークローカル・グローバル)
この節では、fe80・fd・2001 などで始まるアドレスが何を意味するのかと、プレフィックス(/64 など)の読み方が分かります。
IPv6アドレスは、先頭の数ビットで種類が決まります。1台の機器が、リンクローカルとグローバルなど複数のアドレスを同時に持つのが普通です。主な種類は RFC 4291 と RFC 4193 で決まっています。
| アドレス・範囲 | 名前 | 使われ方 |
|---|---|---|
| ::1 | ループバック | 自分自身。IPv4の 127.0.0.1 に当たる |
| :: | 未指定アドレス | まだアドレスが無いときの送信元。待ち受けでは「全部のアドレス」 |
| fe80::/10 | リンクローカル | 同じリンクの中だけ。NDP やルーターとのやり取りに使う |
| fc00::/7(fd00::/8) | ユニークローカル(ULA) | 組織の中だけ。IPv4のプライベートアドレスに近い |
| 2000::/3 | グローバルユニキャスト | インターネットで通じる |
| ff00::/8 | マルチキャスト | ff02::1(全ノード)・ff02::2(全ルーター)など |
| ::ffff:0:0/96 | IPv4射影アドレス | IPv4のアドレスをIPv6の形で表すときに使う |
| 2001:db8::/32 | 文書用 | 説明や本のための例。実際の通信には使わない(RFC 3849) |
| 64:ff9b::/96 | NAT64 の既定のプレフィックス | IPv6だけの機器がIPv4のサーバーと話す変換で使う(RFC 6052) |
Python の ipaddress で種類を判定した結果です(2001:4860:4860::8888 は公開の DNS サーバーのアドレスで、判定に使っただけで通信はしていません)。
::1 loop=True ll=False private=True global=False mcast=False mapped=None
fe80::5054:ff:fe12:3456 loop=False ll=True private=True global=False mcast=False mapped=None
fd52:6bf9:26d1:1::1 loop=False ll=False private=True global=False mcast=False mapped=None
2001:db8::1 loop=False ll=False private=True global=False mcast=False mapped=None
2001:4860:4860::8888 loop=False ll=False private=False global=True mcast=False mapped=None
ff02::1 loop=False ll=False private=False global=True mcast=True mapped=None
::ffff:192.0.2.1 loop=False ll=False private=True global=False mcast=False mapped=192.0.2.1
文書用の 2001:db8::1 は private と判定されました。また、ff02::1 はリンクの中だけで使うマルチキャストですが、is_global は True でした。プログラムで「インターネットに出られるアドレスか」を判定するときは、is_multicast も合わせて見ます。
プレフィックス(/64・/56・/48)の読み方
IPv6アドレスは、前半が「どのネットワークか」を示すプレフィックス、後半が「そのネットワークの中のどの機器か」を示すインターフェースIDです。家庭や会社の1つのネットワーク(サブネット)は /64 が基本です。RFC 4291 は、特別な場合を除きインターフェースIDを64ビットにするとしています。
fd52:6bf9:26d1:0001:5054:00ff:fe12:3456/64
└──── プレフィックス 64ビット ───┘└── インターフェースID 64ビット ──┘
fd │ 52:6bf9:26d1 │ 0001 │ 5054:00ff:fe12:3456
ULA グローバルID サブネットID 機器ごとの番号
(ランダム40ビット)(16ビット)
プロバイダや組織には、/48 や /56 のように /64 より短い(大きな)プレフィックスが配られ、その中を /64 に分けて使います。Python で計算すると、/48 の中には /64 が 65,536 個、/56 の中には 256 個あります。
>>> n = ip.ip_network("2001:db8:abcd:1200::/56")
>>> subnets = list(n.subnets(new_prefix=64))
>>> len(subnets), subnets[0], subnets[-1]
(256, IPv6Network('2001:db8:abcd:1200::/64'), IPv6Network('2001:db8:abcd:12ff::/64'))
>>> ip.ip_network("2001:db8:abcd:12::/56")
ValueError: 2001:db8:abcd:12::/56 has host bits set
最後の行は、/56 の境目に合っていないアドレスを渡したときのエラーです。2001:db8:abcd:12:: は省略を戻すと 2001:db8:abcd:0012:: で、/56 の範囲に収まらないビットが立っています。省略された形のまま桁を数えると間違えやすいところです。CIDR の計算そのものは、関連記事「CIDR計算・サブネット早見表|/0〜/32一覧とPython計算コード」で扱っています(IPv4の早見表ですが、考え方は同じです)。
MACアドレスからインターフェースIDを作る(EUI-64)
インターフェースIDの作り方の1つが EUI-64 です。MAC アドレス(48ビット)の真ん中に ff:fe を入れ、先頭のバイトの下から2ビット目(U/L ビット)を反転します。手元のホスト役のスクリプトで計算した結果です。
MAC 52:54:00:12:34:56 -> インターフェースID 505400fffe123456 -> リンクローカル fe80::5054:ff:fe12:3456
52(0101 0010)の U/L ビットを反転すると 50(0101 0000)になり、5054:00ff:fe12:3456 ができます。ただし、この方法ではアドレスから MAC アドレスが分かり、別のネットワークに移っても同じインターフェースIDになるため、追跡に使われるおそれがあります。RFC 8064 は、MAC アドレスを埋め込む作り方を使わないよう推奨しており、RFC 7217(ネットワークごとに変わる安定したID)や RFC 8981(一定時間で変わる一時アドレス)が使われます。実際の PC で fe80:: の後ろがランダムに見えるのはこのためです。
IPv6ヘッダーとIPv4ヘッダーの違い(実際のバイト列)
この節では、IPv6のヘッダーに何が入っていて、IPv4から何が減ったのかが、実際のパケットのバイト列で分かります。
IPv6の基本ヘッダーは40バイトの固定長で、項目は8つだけです。IPv4にあったヘッダー長・チェックサム・分割の情報はなくなり、必要なときだけ「拡張ヘッダー」を後ろにつなげます。同じ48バイトのデータを ICMP の Echo(ping)で包んだパケットを作り、大きさと先頭のバイトを比べました。
IPv4 パケット 76 バイト(IPヘッダー 20)/IPv6 パケット 96 バイト(IPヘッダー 40)
IPv4 header hex: 45 00 00 4c 00 01 00 00 40 01 f6 ac c0 00 02 01 c0 00 02 02
IPv6 header hex: 60 00 00 00 00 38 3a 40 fd 52 6b f9 26 d1 00 01 50 54 00 ff fe 12 34 56 fd 52 6b f9 26 d1 00 01 00 00 00 00 00 00 00 01
| IPv6の項目(ビット数) | 上のバイト列の値 | IPv4で近い項目 |
|---|---|---|
| Version(4) | 6(先頭の 6) | Version(4。先頭の 4) |
| Traffic Class(8) | 0 | ToS(DSCP・ECN) |
| Flow Label(20) | 0 | なし(IPv6で追加) |
| Payload Length(16) | 00 38 = 56バイト(ヘッダーを除いた長さ) | Total Length(00 4c = 76。ヘッダーを含む) |
| Next Header(8) | 3a = 58(ICMPv6) | Protocol(01 = ICMP) |
| Hop Limit(8) | 40 = 64 | TTL(40 = 64) |
| 送信元アドレス(128) | fd52:6bf9:26d1:1:5054:ff:fe12:3456 | 送信元アドレス(32) |
| 宛先アドレス(128) | fd52:6bf9:26d1:1::1 | 宛先アドレス(32) |
1チェックサムが無い
IPv4はルーターが TTL を減らすたびにチェックサムを計算し直す。IPv6はこれを無くし、誤りの検出は Ethernet や TCP・UDP に任せた。
2ルーターは分割しない
大きすぎるパケットは、ルーターが ICMPv6 の Packet Too Big を送信元へ返し、送信元が小さくして送り直す。リンクの最小MTUは1,280バイト(RFC 8200)。
3オプションは拡張ヘッダーへ
分割・経路の指定・暗号(IPsec)などは、Next Header でつないだ拡張ヘッダーに入れる。基本ヘッダーは40バイトで変わらない。
ICMPv6 の Packet Too Big を防火壁で全部止めると、大きなパケットだけが届かなくなります。「ページの一部だけ読み込めない」「SSH はつながるがファイル転送で止まる」ときは、MTU と ICMPv6 の扱いを疑います。MTU の考え方は、関連記事「ipconfigの使い方とMTUとは|/all・/flushdnsとMTUの実例」で扱っています。
NDP(近隣探索)とは:IPv6でARPの代わりをする仕組み
この節では、IPv6で相手の MAC アドレスを調べる NDP の動きが、tcpdump で取った実物のパケットで分かります。
NDP(Neighbor Discovery Protocol、近隣探索)は、IPv4の ARP の役目を ICMPv6 で行う仕組みです(RFC 4861)。ARP は「この IP アドレスの人はいますか」を全員にブロードキャストしますが、NDP は宛先のアドレスから計算した「要請ノードマルチキャスト」に送るため、関係の無い機器はほとんど受け取りません。
| NDPのメッセージ | ICMPv6の型 | 役目 |
|---|---|---|
| RS(Router Solicitation、ルーター要請) | 133 | 「ルーターはいますか」と ff02::2 に聞く |
| RA(Router Advertisement、ルーター広告) | 134 | ルーターがプレフィックスや MTU を知らせる |
| NS(Neighbor Solicitation、近隣要請) | 135 | 「このアドレスの MAC は何ですか」。重複の確認にも使う |
| NA(Neighbor Advertisement、近隣広告) | 136 | 「そのアドレスは私で、MAC はこれです」 |
| Redirect | 137 | 「その宛先なら別のルーターの方が近い」と知らせる |
ホスト役(t40a・MAC 52:54:00:12:34:56)が、ルーター役(t40b・MAC 52:54:00:00:00:01)のリンクローカルアドレス fe80::5054:ff:fe00:1 の MAC を調べたときのパケットです(tcpdump -n -e -vv。時刻を省いています)。
52:54:00:12:34:56 > 33:33:ff:00:00:01, ethertype IPv6 (0x86dd), length 86: (hlim 255, next-header ICMPv6 (58) payload length: 32) fe80::5054:ff:fe12:3456 > ff02::1:ff00:1: [icmp6 sum ok] ICMP6, neighbor solicitation, length 32, who has fe80::5054:ff:fe00:1
source link-address option (1), length 8 (1): 52:54:00:12:34:56
52:54:00:00:00:01 > 52:54:00:12:34:56, ethertype IPv6 (0x86dd), length 86: (hlim 255, next-header ICMPv6 (58) payload length: 32) fe80::5054:ff:fe00:1 > fe80::5054:ff:fe12:3456: [icmp6 sum ok] ICMP6, neighbor advertisement, length 32, tgt is fe80::5054:ff:fe00:1, Flags [router, solicited, override]
destination link-address option (2), length 8 (1): 52:54:00:00:00:01
- 宛先の
ff02::1:ff00:1が要請ノードマルチキャストです。調べたいアドレスの下位24ビット(00:0001)をff02::1:ffの後ろに付けて作ります。 - Ethernet の宛先
33:33:ff:00:00:01は、IPv6マルチキャストの下位32ビットを33:33の後ろに付けた MAC アドレスです(RFC 2464)。ネットワークカードは、自分に関係のある 33:33 だけを受け取ります。 - NA の Flags の
routerは送り主がルーターであること、solicitedは NS への返事であること、overrideは覚えている MAC を上書きしてよいことを示します。 hlim 255(Hop Limit 255)は NDP の決まりです。ルーターを越えてきたパケットは255未満になるため、受け取った側は255でない NDP を捨てます(RFC 4861)。
この返事を受けてから、ICMPv6 の Echo(ping)を4回送りました。手元のスクリプトの表示です。
NS/NA fe80::5054:ff:fe00:1 -> 52:54:00:00:00:01 6.608 ms (R=1 S=1 O=1)
56 bytes from fe80::5054:ff:fe00:1: icmp_seq=1 hlim=64 time=1.251 ms
56 bytes from fe80::5054:ff:fe00:1: icmp_seq=2 hlim=64 time=1.009 ms
56 bytes from fe80::5054:ff:fe00:1: icmp_seq=3 hlim=64 time=1.116 ms
56 bytes from fe80::5054:ff:fe00:1: icmp_seq=4 hlim=64 time=1.405 ms
min/avg/max = 1.009/1.195/1.405 ms
この時間は、Python でパケットを組み立てて解析する処理を含んだ値で、カーネルの ping より大きく出ます。比べるためではなく、「NS/NA で MAC が分かってから Echo が往復する」順番を見るための数字です。
存在しないアドレス(fd52:6bf9:26d1:1::99)に NS を送ると、返事が無く「到達不能」になりました。カーネルの IPv6 では、この状態は ip -6 neigh の表示で FAILED や INCOMPLETE として見えます(ip-neighbour の man ページ)。
52:54:00:12:34:56 > 33:33:ff:00:00:99, ethertype IPv6 (0x86dd), length 86: (hlim 255, next-header ICMPv6 (58) payload length: 32) fd52:6bf9:26d1:1:5054:ff:fe12:3456 > ff02::1:ff00:99: [icmp6 sum ok] ICMP6, neighbor solicitation, length 32, who has fd52:6bf9:26d1:1::99
NS fd52:6bf9:26d1:1::99: 応答なし(到達不能)
SLAACとDHCPv6:IPv6アドレスが自動で付く流れ
この節では、IPv6の機器がどうやって自分のアドレスを決めるのかが、RS・RA・DAD の実物で分かります。
SLAAC(ステートレスアドレス自動設定、RFC 4862)では、ルーターが広告したプレフィックスと、機器が自分で作ったインターフェースIDをつなげてアドレスにします。DHCP サーバーが無くてもアドレスが決まるのが特徴です。
流れは冒頭の図のとおりで、リンクローカルを作って DAD → RS → RA → アドレスの組み立て → もう一度 DAD の順に進みます。手元で実行したホスト役の表示です。
MAC 52:54:00:12:34:56 -> インターフェースID 505400fffe123456 -> リンクローカル fe80::5054:ff:fe12:3456
DAD fe80::5054:ff:fe12:3456 -> 重複なし NS宛先 ff02::1:ff12:3456 / 33:33:ff:12:34:56
RA from fe80::5054:ff:fe00:1 (52:54:00:00:00:01) prefix fd52:6bf9:26d1:1::/64 A=1 valid=86400s preferred=14400s routerlifetime=1800s
SLAAC で作ったアドレス fd52:6bf9:26d1:1:5054:ff:fe12:3456
DAD fd52:6bf9:26d1:1:5054:ff:fe12:3456 -> 重複なし NS宛先 ff02::1:ff12:3456 / 33:33:ff:12:34:56
同じ流れを tcpdump で見ると、DAD の NS は送信元が ::(まだアドレスが無い)になっています。RA には、送り主の MAC・MTU・プレフィックスの3つのオプションが入っていました。
52:54:00:12:34:56 > 33:33:ff:12:34:56, ethertype IPv6 (0x86dd), length 78: (hlim 255, next-header ICMPv6 (58) payload length: 24) :: > ff02::1:ff12:3456: [icmp6 sum ok] ICMP6, neighbor solicitation, length 24, who has fe80::5054:ff:fe12:3456
52:54:00:12:34:56 > 33:33:00:00:00:02, ethertype IPv6 (0x86dd), length 70: (hlim 255, next-header ICMPv6 (58) payload length: 16) fe80::5054:ff:fe12:3456 > ff02::2: [icmp6 sum ok] ICMP6, router solicitation, length 16
source link-address option (1), length 8 (1): 52:54:00:12:34:56
52:54:00:00:00:01 > 52:54:00:12:34:56, ethertype IPv6 (0x86dd), length 118: (hlim 255, next-header ICMPv6 (58) payload length: 64) fe80::5054:ff:fe00:1 > ff02::1: [icmp6 sum ok] ICMP6, router advertisement, length 64
hop limit 64, Flags [none], pref high, router lifetime 1800s, reachable time 0ms, retrans timer 0ms
source link-address option (1), length 8 (1): 52:54:00:00:00:01
mtu option (5), length 8 (1): 1500
prefix info option (3), length 32 (4): fd52:6bf9:26d1:1::/64, Flags [onlink, auto], valid time 86400s, pref. time 14400s
| RAの項目 | 上の値 | 意味 |
|---|---|---|
| Flags [none] | M=0・O=0 | DHCPv6 を使わない。SLAAC だけでアドレスを作る |
| router lifetime | 1800s | この間、送り主を既定のルーターとして使ってよい。0なら既定のルーターにしない |
| prefix info の auto | A=1 | このプレフィックスでアドレスを自動で作ってよい |
| prefix info の onlink | L=1 | このプレフィックスの相手には、ルーターを通さず直接送れる |
| valid・pref. time | 86400s・14400s | アドレスの有効期間と、新しい通信に使ってよい期間 |
重複アドレス検出(DAD)が失敗したとき
ルーター役がすでに使っている fd52:6bf9:26d1:1::2 を、ホスト役が使おうとした結果です。ルーター役から NA が返り、重複と判定されました。
DAD fd52:6bf9:26d1:1::2 -> 重複(使用中) NS宛先 ff02::1:ff00:2 / 33:33:ff:00:00:02
52:54:00:12:34:56 > 33:33:ff:00:00:02, ... :: > ff02::1:ff00:2: ICMP6, neighbor solicitation, length 24, who has fd52:6bf9:26d1:1::2
52:54:00:00:00:01 > 52:54:00:12:34:56, ... fd52:6bf9:26d1:1::2 > ff02::1: ICMP6, neighbor advertisement, length 32, tgt is fd52:6bf9:26d1:1::2, Flags [router, override]
DAD 中の相手(送信元が ::)には個別に返事ができないため、NA は ff02::1(全ノード)宛てで、solicited のフラグは付きません(RFC 4861)。Linux のカーネルでは、DAD に失敗したアドレスは使われず、ip -6 addr で dadfailed の状態として残ります(ip-address の man ページ)。IPv6アドレスを手で設定して通信できないときは、同じアドレスを別の機器に付けていないかを確かめます。
DHCPv6 との使い分け
| 方式 | RAのフラグ | アドレス | DNS サーバーの知らせ方 |
|---|---|---|---|
| SLAAC だけ | M=0・O=0 | 機器が自分で作る | RA の RDNSS オプション(RFC 8106) |
| SLAAC+ステートレス DHCPv6 | M=0・O=1 | 機器が自分で作る | DHCPv6 で受け取る |
| ステートフル DHCPv6 | M=1 | DHCPv6 サーバーが配る | DHCPv6 で受け取る |
DHCPv6 でも、既定のルーター(経路)は RA で知らせます。DHCPv6 だけでは既定のルーターが分からない点が、IPv4の DHCP と違います。プロバイダが家庭のルーターに /56 などのプレフィックスを渡すときは、DHCPv6 のプレフィックス委任(DHCPv6-PD、RFC 8415)が使われます。
ping6・ip -6・ssの使い方と、IPv6が無効なときのエラー原文
この節では、IPv6の疎通を確かめるコマンドと、IPv6が無効になっている環境で出るエラーの文言が分かります。
Linux では ping -6(以前の版の ping6)、ip -6 addr、ip -6 route、ip -6 neigh、ss -6 を使います。Windows は ping -6 と ipconfig、Mac は ping6 を使います。
| 知りたいこと | Linux | 見る所 |
|---|---|---|
| 付いているIPv6アドレス | ip -6 addr show |
inet6 の行。scope global がグローバル、scope link がリンクローカル |
| 経路(既定のルーター) | ip -6 route show |
default via fe80::… の行があるか |
| 近隣(MAC の対応) | ip -6 neigh show |
REACHABLE・STALE・FAILED などの状態 |
| IPv6で待ち受けているポート | ss -6 -tln |
Local Address が [::]:ポート の形になっている |
| 疎通 | ping -6 アドレス |
リンクローカル宛ては ping -6 fe80::1%eth0 と出口を付ける |
| IPv6が有効か | sysctl net.ipv6.conf.all.disable_ipv6 |
0なら有効、1なら全インターフェースで無効 |
リンクローカルアドレス(fe80::)は、どのインターフェースの先にいるか決まらないため、%eth0 のようなゾーンIDを付けないと送れません。
カーネルでIPv6が無効なときのエラー原文
この記事の確認環境は、カーネルの起動オプション ipv6.disable=1 でIPv6が無効になっています。ip netns の中で、ふだんのコマンドを実行したときの原文です。「Address family not supported」「Operation not supported」が出たら、まずIPv6そのものが無効になっていないかを疑います。
$ ip -6 addr add fd00:40::1/64 dev t40-va
RTNETLINK answers: Operation not supported
$ ip -6 route add default via fe80::1 dev t40-va
RTNETLINK answers: Operation not supported
$ ping -6 -c1 ::1
ping: socktype: SOCK_DGRAM
ping: socket: Address family not supported by protocol
$ ping -c1 ::1
ping: ::1: Address family for hostname not supported
$ nc -6 -l ::1 8080
nc: Address family not supported by protocol
$ curl -6 -sS http://[::1]:8080/
curl: (7) Failed to connect to ::1 port 8080 after 0 ms: Couldn't connect to server
$ sysctl net.ipv6.conf.all.disable_ipv6
sysctl: cannot stat /proc/sys/net/ipv6/conf/all/disable_ipv6: No such file or directory
$ ss -6 -tln
State Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
$ ip a show t40-va
8: t40-va@if7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 06:60:a4:70:cf:42 brd ff:ff:ff:ff:ff:ff link-netns t40b
プログラムからも同じでした。
$ python3 -c "import socket; socket.create_server(('::', 8080), family=socket.AF_INET6)"
OSError: [Errno 97] Address family not supported by protocol
$ node -e "require('net').createServer().listen(8080, '::1').on('error', e => console.log(e.code, e.message))"
EAFNOSUPPORT listen EAFNOSUPPORT: address family not supported ::1:8080
$ node -e "...listen(8080) ... console.log(JSON.stringify(this.address()))"
{"address":"0.0.0.0","family":"IPv4","port":8080}
1inet6 の行が無い
IPv6が動くカーネルなら、リンクが上がったインターフェースには fe80:: の inet6 の行が出る。ip a に1行も無いのは、IPv6が無効になっている印。
2sysctl の項目ごと無い
disable_ipv6=1 なら値が1と出る。項目そのものが無いのは、起動オプションの ipv6.disable=1 で、再起動しないと戻せない。
3Node は IPv4 に切り替えた
host を省いた listen は、IPv6が使えれば ::、使えなければ 0.0.0.0 で待ち受ける(Node.js の公式ドキュメント)。手元では 0.0.0.0 になった。
カーネルの公式ドキュメントでは、disable=1 の起動オプションでは「インターフェースにIPv6アドレスが付かず、IPv6のソケットも開けない」「有効にするには再起動が要る」と説明されています。disable_ipv6(sysctl)は、アドレスを付けないだけで、ソケットは作れる、という違いがあります。
デュアルスタックとHappy Eyeballs(IPv4とIPv6のどちらで通信するか)
この節では、IPv4とIPv6の両方が使えるとき、どちらが選ばれるのかが分かります。
デュアルスタックは、1台の機器でIPv4とIPv6を同時に動かす方式です。今の家庭や会社の多くはこの形で、IPv6に対応したサイトにはIPv6、対応していないサイトにはIPv4でつながります。
- 1DNS で AAAA(IPv6)と A(IPv4)を引くRFC 8305 は AAAA を先に問い合わせるよう勧めている
- 2宛先を並べ替えるRFC 6724 の既定の表では、IPv6 のグローバルアドレスが IPv4 より優先
- 3IPv6で接続を試す先に試すのはIPv6
- 4少し待っても成功しなければIPv4も並行して試すRFC 8305 の推奨は250ミリ秒(下限の推奨100ミリ秒・上限の推奨2秒)
- 5先に成功した方を使うIPv6が壊れていても、利用者からは少し遅いだけに見える
この仕組みを Happy Eyeballs(RFC 8305)と呼びます。A の応答が先に届いたときも、AAAA の応答を50ミリ秒待つことが推奨されています。「IPv6が使えないのにページは開ける」のは、Happy Eyeballs がIPv4に切り替えているためで、IPv6が壊れていることに気づきにくい理由でもあります。curl で -4・-6 を付けて試すと、どちらが通るかを分けて確かめられます。
この記事の環境では、名前解決もIPv4だけになりました。/etc/hosts には localhost の IPv4 しか無く、Python の getaddrinfo('localhost', 80) の結果は ('127.0.0.1', 80) の1件だけでした。AAAA レコードの役割と dig での確かめ方は、関連記事「DNSレコードの種類一覧|digの実出力で役割と設定ミスを確認」で扱っています。
IPoE・PPPoEとIPv4 over IPv6(MAP-E・DS-Lite)とは
この節では、日本の光回線で出てくる IPoE・PPPoE・MAP-E・DS-Lite が、IPv6とどう関係するのかが、公式・公的な資料で確かめた範囲で分かります。
IPoE と PPPoE は「回線事業者の網からプロバイダへのつなぎ方」の違いで、IPv6 と IPv4 の違いとは別の話です。NTT東日本の解説によると、今は IPv4 に PPPoE 接続、IPv6 に IPoE 接続が主に使われていて、網終端装置を経由しない IPoE は、PPPoE より混雑の影響を受けにくく、速度が安定しやすい傾向があります。一方、IPoE では通常 IPv4 のサイトには届かず、IPv4 だけに対応したサイトは今も存在します。
そこで、IPoE(IPv6)の上で IPv4 も使えるようにするのが「IPv4 over IPv6」で、その実装が MAP-E と DS-Lite です。どちらも IPv4 のパケットを IPv6 のパケットに包んで運びます。違いは、IPv4 のアドレス変換(NAT)をどこで行うかです。
flowchart TD
P[PC の IPv4 パケット] --> R[家庭のルーター]
R --> M{方式}
M -->|MAP-E| A[ルーターでNAT<br>IPv6で包んで送る]
M -->|DS-Lite| B[NATせず<br>IPv6で包んで送る]
A --> BR[事業者のBR<br>包みを外す]
B --> AF[事業者のAFTR<br>包みを外してNAT]
BR --> I[IPv4のインターネット]
AF --> I
MAP-E(RFC 7597)
NAT は利用者側のルーター(CE)で行う
1つの IPv4 アドレスを複数の契約者で分け合い、使えるポートの範囲が決まっている(ポートセット)
ポート開放の設定を利用者側でできるが、使えるポート番号は限られる
事業者の BR は接続ごとの状態を持たない(ステートレス)
DS-Lite(RFC 6333)
NAT は事業者側の AFTR で行う(キャリアグレード NAT)
利用者側(B4)は NAT をせず、IPv4 のパケットを包んで AFTR へ送る
利用者側で IPv4 のポート開放を設定するのは難しい
B4 と AFTR の間には 192.0.0.0/29 のアドレスが予約されている
NTT東日本の解説は、外部からのアクセスが要る機器やサービス(IPカメラなど)にはポート開放ができる MAP-E の方が向く、どちらが使えるかはプロバイダによって異なる、と書いています。NEC の Aterm の公式マニュアルでは、「v6プラス」モードは JPIX 仕様の MAP-E、「transix」モードはインターネットマルチフィード仕様の DS-Lite で IPv4 over IPv6 通信を行う動作モードと説明され、ルーターが回線の状態を見て自動で判定する機能もあります。
IPv4 を IPv6 で包んだパケットの形
MAP-E・DS-Lite の装置は手元で動かしていませんが、「IPv4 のパケットを IPv6 で包む」形そのものは作れます。IPv6 の Next Header を 4(IPv4)にして、中に IPv4 の TCP の SYN を入れたパケットを送り、tcpdump で見た結果です。
52:54:00:12:34:56 > 52:54:00:00:00:01, ethertype IPv6 (0x86dd), length 94: (hlim 64, next-header IPIP (4) payload length: 40) fd52:6bf9:26d1:1:5054:ff:fe12:3456 > fd52:6bf9:26d1:1::1: (tos 0x0, ttl 64, id 1, offset 0, flags [none], proto TCP (6), length 40)
192.168.1.10.50000 > 198.51.100.80.80: Flags [S], cksum 0xe00b (correct), seq 0, win 8192, length 0
IPv4 over IPv6: 中身 40 バイト → 全体 80 バイト(+40)
外側が IPv6(fd52…)、内側が IPv4(192.168.1.10 → 198.51.100.80)の2重のヘッダーになり、1パケットあたり40バイト増えます。包んだぶん、IPv4 として送れる大きさ(MTU)は小さくなります。
自分の環境がIPv6か確かめる方法(外部サイトを使わない)
この節では、外部の確認サイトに問い合わせずに、自分の PC や回線が IPv6 で通信できる状態かを確かめる手順が分かります。
見るのは「グローバルアドレス(2 か 3 で始まる)があるか」と「IPv6 の既定の経路があるか」の2つです。fe80:: のリンクローカルアドレスしか無いときは、IPv6 は同じネットワークの中でしか使えず、インターネットには出られません。
アドレスを表示する
Windows はコマンドプロンプトで ipconfig(Microsoft Learn によると、パラメーター無しで全アダプターの IPv4・IPv6 アドレスが出る)。Linux は ip -6 addr show。Mac は ネットワークの設定の「詳細」→「TCP/IP」で IPv6 の設定を見る(Apple)。
アドレスの種類を見分ける
fe80:: はリンクローカル、fd はユニークローカル、2・3 で始まるのがグローバル。一時アドレスなど、グローバルが複数あるのは普通のこと。
既定の経路を見る
Linux は ip -6 route show default。Windows は ipconfig の「デフォルト ゲートウェイ」に fe80:: のアドレスがあるか。
ルーターの画面で接続方式を見る
家庭用ルーターの状態表示で、IPv6 の接続状態や、v6プラス・transix などの動作モードを確かめる。表示の場所は機種のマニュアルで。
自分のサーバーへ -6 で接続する
社内や自分が管理する IPv6 のサーバーがあれば、curl -6 や ping -6 で届くかを試す。IPv4 と分けて確かめられる。
Linux で、外部に問い合わせずに状態をまとめて表示する小さなスクリプトです。この記事の環境で実行すると、カーネルで無効と判定されました。
#!/bin/sh
# 外部に問い合わせずに、この機械の IPv6 の状態を確かめる
if [ ! -e /proc/net/if_inet6 ]; then
echo "IPv6: カーネルで無効(/proc/net/if_inet6 が無い)"; grep -o 'ipv6.disable=[01]' /proc/cmdline; exit 0
fi
echo "disable_ipv6(all) = $(cat /proc/sys/net/ipv6/conf/all/disable_ipv6)"
ip -6 addr show scope global | awk '/inet6/{print "グローバル:", $2}'
ip -6 addr show scope link | awk '/inet6/{print "リンクローカル:", $2}'
ip -6 route show default | sed 's/^/既定の経路: /'
$ ./v6check.sh
IPv6: カーネルで無効(/proc/net/if_inet6 が無い)
ipv6.disable=1
IPv6 が動く環境では、グローバル・リンクローカルのアドレスと既定の経路が1行ずつ表示されます。グローバルアドレスと既定の経路の両方があれば、IPv6 でインターネットに出られる設定になっています。実際に届くかは、手順5のように自分の管理するサーバーへ -6 で接続して確かめます。Windows の ipconfig の各項目の読み方は、関連記事「ipconfigの使い方とMTUとは」でも扱っています。
IPv6のよくある誤解(IPv6なら必ず速い・NATが無いと危ない)
この節では、IPv6についてよく聞く説明のうち、正確でないものと、その理由が分かります。
「IPv6にすると必ず速くなる」
相手のサイトが IPv4 だけなら、IPv4 over IPv6 か PPPoE を通る
「IPv6 は NAT が無いから外から丸見え」
IPv4 でも、NAT は守りのための仕組みではない
「IPv6 のアドレスから MAC アドレスが分かる」
ff:fe が真ん中にあれば EUI-64 の可能性が高い
よくあるエラーとつまずき(原文つき)
この節では、IPv6 で出やすいエラーの文言と、原因・確かめ方が一覧で分かります。
| 表示・症状 | 考えられる原因 | 確かめ方・直し方 |
|---|---|---|
| ping: socket: Address family not supported by protocol | カーネルで IPv6 が無効(ipv6.disable=1) | /proc/net/if_inet6 があるか。起動オプションを直して再起動 |
| RTNETLINK answers: Operation not supported | 同上。ip -6 addr add・route add が通らない | /proc/cmdline に ipv6.disable=1 があるか |
| OSError: [Errno 97] / EAFNOSUPPORT | プログラムが IPv6 のソケットを作れない | IPv4 でも待ち受けるか、環境の IPv6 を有効にする |
| curl: (7) Failed to connect to ::1 … Couldn't connect to server | 相手が IPv6 で待ち受けていない、または IPv6 が使えない | ss -6 -tln で [::]:ポート があるか。サーバーの listen を確かめる |
| ValueError: At most one '::' permitted | アドレスに :: が2回ある | :: は1回だけ。省略していない形に戻して数える |
| ValueError: … has host bits set | プレフィックスの境目に合っていない | 省略を戻して桁を数える。strict=False で親のネットワークを求める |
| fe80:: に ping が届かない | ゾーンID(%eth0)が無い | ping -6 fe80::1%eth0 のように出口を付ける |
| 手で付けた IPv6 アドレスで通信できない | DAD で重複と判定された | ip -6 addr で dadfailed になっていないか。同じアドレスの機器を探す |
| 一部のページ・大きなファイルだけ止まる | ICMPv6 の Packet Too Big を防火壁で止めている | ICMPv6 を全部止めない。MTU を確かめる |
| IPv6 のアドレスはあるのに外に出られない | リンクローカルか ULA しか無い。既定の経路が無い | 2・3 で始まるアドレスと ip -6 route の default を確かめる |
判断表:IPv6を使うか・どこを確かめるか
場面ごとの目安です。
| 場面 | 判断の目安 | 見る所 |
|---|---|---|
| 家庭の回線が夜に遅い | プロバイダが IPoE(IPv6)と IPv4 over IPv6 に対応しているか確かめる | 契約内容・ルーターの動作モード |
| IPカメラ・自宅サーバーを外から見たい | DS-Lite では IPv4 のポート開放が難しい。MAP-E は使えるポートが限られる。IPv6 で直接届ける方法も検討 | 方式(MAP-E・DS-Lite)と防火壁 |
| Web サイトを公開する | デュアルスタックにして AAAA も登録する | サーバーが [::] で待ち受けているか・防火壁の IPv6 の規則 |
| 社内ネットワークのアドレス設計 | サブネットは /64。組織内だけなら ULA(fd+ランダム40ビット) | 重ならないグローバルIDか |
| アプリでアドレスを保存する | 文字列は最大45文字(IPv4 射影の形)を見込む。比較は ipaddress などで正規化してから | DB の列の長さ・大文字小文字 |
| IPv6 を無効にしたくなった | 先に DNS・経路・MTU を確かめる。IPoE で IPv4 over IPv6 なら IPv4 も止まりうる | curl -4 と -6 の比較 |
| サーバーのログに IPv6 アドレスが出る | 同じ利用者でも一時アドレスで変わる。/64 単位でまとめて見る | アクセス制限・集計の単位 |
よくある質問
Q. IPv4とIPv6の違いは何ですか? A. アドレスの長さ(32ビットと128ビット)、書き方(10進数と16進数)、ヘッダーの作り、相手の MAC の調べ方(ARP と NDP)、アドレスの自動設定(SLAAC)などが違います。互換性が無いため、両方を同時に使うのが一般的です。
Q. IPv6アドレスはどう読めばよいですか? A. 16ビットずつ8つの区切りに分かれた16進数です。各区切りの先頭の0は省略でき、0だけの区切りが2つ以上続く所は「::」で1回だけまとめられます。
Q. fe80 で始まるアドレスは何ですか? A. リンクローカルアドレスです。同じネットワーク(同じルーターの内側の同じリンク)の中だけで使い、インターネットには出ません。IPv6が動く機器は必ず持っています。
Q. 自分のパソコンが IPv6 を使えるか、どう確かめますか? A. Windows は ipconfig、Linux は ip -6 addr で、2 か 3 で始まるアドレスがあるかを見ます。あわせて既定のゲートウェイ(経路)があれば、IPv6 でインターネットに出られる設定です。
Q. IPv6 にすると速くなりますか? A. IPv6 という規格そのもので速くなるわけではありません。速くなったと感じる主な理由は、混雑しにくい IPoE の接続に変わることです。相手のサイトや途中の混雑によっても変わります。
Q. MAP-E と DS-Lite の違いは何ですか? A. どちらも IPv4 を IPv6 で包んで運ぶ方式で、NAT をする場所が違います。MAP-E は家庭のルーター、DS-Lite は事業者の設備で NAT をします。ポート開放の自由さが変わります。
Q. IPv6 は NAT が無くて危なくないですか? A. 外からの接続を止めるのはファイアウォールの役目です。家庭用ルーターや OS の防火壁で、外から始まる接続を許すかどうかを決めます。
Q. IPv6 を無効にしたほうがよいですか? A. 原因が分からないまま無効にするのはおすすめしません。IPv4 over IPv6 の回線では IPv4 の通信も IPv6 を通っています。DNS・経路・MTU を先に確かめます。
Q. プログラムで IPv6 のアドレスを扱うときの注意は? A. URL では [ ] で囲む、文字列で比べる前に正規化する、保存する列の長さに余裕を持たせる、リンクローカルにはゾーンIDが付くことがある、の4点です。
まとめ
- IPv6 は IPv4 の後継の IP で、アドレスは128ビット(約3.4×10の38乗個)。IPv4 とは互換性が無く、今はデュアルスタックが主流。
- アドレスは16進数を8つに区切って書き、先頭の0の省略と「::」(1回だけ)で短くする。fe80:: はリンクローカル、fd はユニークローカル、2・3 で始まるのがグローバル。
- ヘッダーは40バイト固定で、チェックサムとルーターでの分割が無い。相手の MAC は ARP ではなく NDP(NS・NA)で調べ、アドレスは RA を受けて SLAAC で自分で作る。手元のパケットでこの流れを確かめた。
- IPoE は接続方式、MAP-E・DS-Lite は IPv4 を IPv6 で包む方式。NAT の場所(家庭のルーターか事業者側か)が違い、ポート開放の自由さが変わる。
- IPv6 か確かめるには、グローバルアドレスと既定の経路があるかを見る。「Address family not supported」は IPv6 そのものが無効の印。
参考・出典
確認日はいずれも 2026年10月29日です。
- IETF「RFC 8200 Internet Protocol, Version 6 (IPv6) Specification」:https://www.rfc-editor.org/rfc/rfc8200
- IETF「RFC 4291 IP Version 6 Addressing Architecture」:https://www.rfc-editor.org/rfc/rfc4291
- IETF「RFC 5952 A Recommendation for IPv6 Address Text Representation」:https://www.rfc-editor.org/rfc/rfc5952
- IETF「RFC 4861 Neighbor Discovery for IP version 6」:https://www.rfc-editor.org/rfc/rfc4861
- IETF「RFC 4862 IPv6 Stateless Address Autoconfiguration」:https://www.rfc-editor.org/rfc/rfc4862
- IETF「RFC 4193 Unique Local IPv6 Unicast Addresses」:https://www.rfc-editor.org/rfc/rfc4193
- IETF「RFC 8064 Recommendation on Stable IPv6 Interface Identifiers」:https://www.rfc-editor.org/rfc/rfc8064
- IETF「RFC 8305 Happy Eyeballs Version 2」:https://www.rfc-editor.org/rfc/rfc8305
- IETF「RFC 6724 Default Address Selection for IPv6」:https://www.rfc-editor.org/rfc/rfc6724
- IETF「RFC 7597 Mapping of Address and Port with Encapsulation (MAP-E)」:https://www.rfc-editor.org/rfc/rfc7597
- IETF「RFC 6333 Dual-Stack Lite Broadband Deployments Following IPv4 Exhaustion」:https://www.rfc-editor.org/rfc/rfc6333
- 総務省「IPv4アドレスのアジア太平洋地域共通在庫枯渇への対応」(2011年4月15日):https://www.soumu.go.jp/menu_news/s-news/01kiban04_01000007.html
- JPNIC「IPv6」:https://www.nic.ad.jp/ja/ip/ipv6/
- NTT東日本「MAP-EとDS-Liteはどう違う?IPv4 over IPv6の実装技術を比較して解説」:https://business.ntt-east.co.jp/column/service/flets-hikari/what-is-map-e.html
- NEC Aterm 機能詳細ガイド「v6プラスモードで接続する」:https://aterm.jp/function/wx5400hp/guide/internet_map-e.html
- NEC Aterm 機能詳細ガイド「transixモードで接続する」:https://aterm.jp/function/wx3600hp/guide/internet_ds-lite.html
- Linux カーネルのドキュメント「IPv6」:https://docs.kernel.org/networking/ipv6.html
- Microsoft Learn「ipconfig」:https://learn.microsoft.com/ja-jp/windows-server/administration/windows-commands/ipconfig
- Apple「MacでIPv6を使用する」:https://support.apple.com/ja-jp/guide/mac-help/mchlp2499/mac
- Python ドキュメント「ipaddress」:https://docs.python.org/ja/3/library/ipaddress.html
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「IPv6とは?IPv4との違い・アドレスの読み方・確認方法をパケットで解説」
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。