2336 文字
12 分
IPv6を勉強し直す
2026-03-21
2026-03-21

IPv6を勉強し直す#

IPv6を気分で使い、設定方法もわからず運用していたので、IPv6を基礎から学び直し、自分でLANの設計を行えるようにする。

IPアドレス体系#

IPv6はIPv4が枯渇する問題に対応するべく、新しく仕様策定されたIPアドレス帯。

IPv6はv4とそもそも思想設計が違く、「用途ごとにアドレスを使い分ける」ことを前提として仕様が決まっている。

1. 到達範囲(スコープ)を明示する#

このアドレスはどこまで届くべきか、がprefixで自ずと定まる。

  • 同一L2だけで使う→リンクローカル
  • LANだけで使う→ユニークローカル
  • インターネットまで届く→グローバルユニキャスト

2. プライバシーを守る#

インターネットに出るとき、同じアドレスを毎回使うと追跡される。なので、外向き通信用に一時アドレスを所有する。

3. NATなしで動かしたい#

全デバイスがグローバルアドレスを持つことができるので、どこまで届くかをアドレス種別で表現することができる。

Prefixの読み方#

IPv6アドレスは128bitで構成される。 16進数16bitを1グループとし、8グループ並べる = 合計128bit

2001:0db8:85a3:0000:0000:8a2e:0370:7334 を例に、

  • グループ先頭の0は省略可能(0db8 -> db8)
  • 連続するゼログループは1箇所のみ ::で省略可能(2001:0db8:0000:0000:0000:0000:0370:7334 -> 2001::370:7334)

アドレスはPrefix+インターフェースIDで構成される。 prefixは「このアドレスがどのネットワークに属するか」を表現するもの。 SLAACのRFCの前提があるため、/64をprefixの基本としている。

アドレス種別#

先頭bitをみるだけで種別がわかる。

fe80::/10 → LLA リンクローカル
fd00::/8 → ULA ユニークローカル(fdで始まる)
fc00::/8 → ULA ユニークローカル(fcで始まる、ほぼ未使用)
それ以外 → GUA グローバルユニキャスト

LLA (fe80::/10)#

Link Local Address

特徴

  • 必ず全てのIpv6対応NICに自動生成される
  • 同一L2でしか使えない
  • ルーターを越えられない

用途

  • RAの送受信
  • NDP(Neighbor Discovery Protocol)
    • IPV6版ARP+ルーター発見+アドレス重複確認をまとめたプロトコル(後述)

ULA(fc00::/7 実質fd00::/8)#

Unique Local Address

IPv4で例えると192.168.0.0/16 や10.0.0.0/8 のようなプライベートアドレス相当

特徴

  • インターネットにルーティングされない
  • LAN内だけで使うプライベートアドレス的な存在
  • 自分でprefixを決められる(NGNから降ってくるGUAとは完全に別で、好きに管理できる)
  • ISPが変わってGUA Prefixが変わっても、LANのアドレス空間が壊れない

用途

  • LAN内サービスのアドレス設定
  • インターネットに露出させたくないサービスなど
    • LLA,ULAのみを設定しておくことで外部公開してないことが一発で分かる

GUA(それ以外)#

Global Unicast Address

特徴

  • インターネット接続性がある
  • ISPや上位機関から割り当てられる

GUAアドレスの設定#

  1. RA(Router Advertisement)でGUA prefixが配布される
  2. SLAACアドレスを自分で作成(安定アドレス)
  3. プライバシー拡張1(RFC4941)が有効な場合一時アドレスを作成する
  4. 一時アドレスもSLAACアドレスもGUAアドレスとなる

安定アドレスはinbound(マシンへの通信)を使い、一時アドレスはoutbound(マシンから外部への通信)で使われる。 一時アドレスの使用が優先されるため、外部サーバー目線ではlifecycle時間ごとに見えるIPv6アドレスが変わる。

ステートレス自動設定(SLAAC)による安定アドレスの割り当て#

ステートレス自動設定(Stateless Address Autoconfiguration) という仕組みを用いて、IPv4 DHCPサーバーみたいにステートを持たなくてもアドレスを発行する仕組み。

作成方法は昔と今で違う生成方法だった。

昔(EUI-64)#

NICのMacアドレスをベースに機械的に作成されるので、macアドレスが変わらない限り同じアドレスが作成される。 macアドレスが逆算できてしまうためプライバシーが終わる。

今(RFC7217 安定プライバシーアドレス)#

今は以下の方法でインターフェースIDが作成される。

HASH(プレフィックス + NIC識別子 + 秘密鍵 + カウンター)
インターフェースID(乱数っぽいが再起動しても変わらない)

秘密鍵が最初に作成する乱数。OS再インストールで変わる。 カウンター: 自動生成されたアドレスが重複していた場合にカウントを増やして衝突を回避する仕組み。DAD(Duplicate Address Detection) の仕組みと連動している。通常は0のまま。

違うIPv6ネットワークに接続するとPrefixが変わるため、hashもかわりSLAACも変わる。トラッキングされないようになる。

一時アドレスの割り当て#

ステートレス自動設定(SLAAC)で付与されたアドレスに対して、プライバシー拡張が一時アドレスを追加作成する RFC4941の拡張。

割り当てタイミング#

  • NICがRAを受け取ったとき(起動時、ネットワーク接続時)
  • 既存の一時アドレスが期限切れに近づいたとき
    • 事前に新しい一時アドレスを作成する

ローテーションタイミング#

  • preffered lifetime
    • デフォルト24h
    • これをすぎると、「使用されていません」扱い(新規接続には使われない。既存通信があるので保持はする)
  • valid lifetime
    • デフォルト7d
    • これをすぎると完全削除

一時アドレス生成ロジック#

  1. OS起動時に乱数シードを作成
  2. sha1(乱数シード + EUI-64 or NIC識別子)でhash作成
    1. 上位64bitが次の乱数シード
    2. 下位64bitが一時アドレスのインターフェースID
  3. ローテーション時は、sha1(前回の乱数シード + EUI-64 or NIC識別子)でhashを作成し、上位64bit、下位64bitを取り扱う。移行ループ

ULAの設計、使い所#

RFC4193で定義されたアドレス。IPv4のプライベートアドレスに相当するが、設計思想が少し違う。

IPv4プライベートアドレス
10.0.0.0/8
172.16.0.0/12
192.168.0.0/16
→ IANAが「ここをプライベート用に予約」と決めた
IPv6 ULA
fc00::/7(実質fd00::/8)
→ 各自が自分でランダムなプレフィックスを生成して使う

ULA Prefix構造#

1. グローバルIDを決める#

fd xx:xxxx:xxxx:: /48

fdは固定、xxの40bitを自分で好きに決める。

RFC4193ではランダム生成を推奨している

  • sha1(現在時刻 + NICのEUI-64) → 下位40bitを使う
  • ただし実用上は好きな数字を自分で決めてもOK
  • 他拠点とVPNでつなげるなどある場合はグローバルIDを避ける必要がある
    • 複数拠点間でULAが被らないようにするため

2. サブネットを決める#

fd xx:xxxx:xxxx: yyyy:: /64

yyyyのサブネットIDも自由に決めて良い。

例えば:

fd00:cafe::/48 ← 自分で決めたグローバルID部分
├── fd00:cafe:1::/64 ← メインLAN
├── fd00:cafe:2::/64 ← infraVLAN
├── fd00:cafe:3::/64 ← 将来用
└── ...最大65536サブネット

NDP(Neighbor Discovery Protocol)#

IPv6版ARP+ルーター発見+アドレス重複確認をまとめたプロトコル NDPを使うことで、ブロードキャストなし・サーバーなしでネットワーク内の基本的な通信が成立する。

アドレス解決(ARPの代替)#

「fd10:2020::20 のMACアドレスを教えて」
↓ マルチキャスト(ブロードキャストではない)
「私がfd10:2020::20です、MACはxx:xx:xx:xx:xx:xxです」

使うメッセージ

NS(Neighbor Solicitation) → 「誰がこのIPv6持ってる?」
NA(Neighbor Advertisement) → 「私が持ってます」

ルーター発見#

クライアント起動
RS(Router Solicitation)送信 → 「ルーターいますか?」
ルーターが RA(Router Advertisement)で応答
→ 「プレフィックスはこれ、デフォルトGWは私」

RAで受け取ったprefixを元にGUA(SLLAC,一時アドレス)を作成する。

DAD(Duplicate Address Detection)#

自分でアドレスを生成したあと
NS送信「このアドレス誰か使ってる?」
応答なし → 使ってOK
応答あり → 衝突!別のアドレスを生成し直す

ここでSLAACのhashで使われるカウンターが+1される

ルーターへの到達性確認#

デフォルトGWとして使っているルーターがまだ生きているかを定期的に確認する

RAとDHCPv6の役割分担#

IPv6でクライアントがネットワーク情報を取得する方法は3つある

  • RA(Router Advertisement) -> SLAAC
  • RA + DHCPv6 -> 併用
  • DHCPv6のみ -> ルーターによるステートフル

RAのフラグ#

2つの重要なフラグがある

Mフラグ(Managed)

  • 0: SLAACで自分で作れ(RA配信者=ルーターはManagedしない)
  • 1: IPアドレスをDHCPv6から取得しろ(RA配信者=ルーターが管理する)

Oフラグ(Other)

  • 0: アドレス以外の情報(DNSなど)を取得しなくて良い
  • 1: アドレス以外の情報(DNSなど)をDHCPv6から取得しろ

組み合わせパターン

M=0, O=0 → SLAACのみ。DNSもRAのRDNSSオプションで取得
M=0, O=1 → アドレスはSLAAC、DNSなどはDHCPv6から取得
M=1, O=1 → アドレスもDNSも全部DHCPv6から取得

RAとDHCPv6の担当範囲#

RAが担当するもの

  • Prefix配信
  • デフォルトゲートウェイ(RA送信元のLLAが使われる)
  • ルーターの生存確認間隔
  • MTU

DHCPv6が担当するもの(o_flag=1のとき)

  • DNSサーバーアドレス
  • DNSサーチドメイン
  • その他オプション情報

DHCPv6が担当するもの(m_flag=1のとき)

  • IPアドレス自体

デフォルトゲートウェイをDHCPv6で配れない。あくまでも付随情報やIPアドレス自体を配布する。 GWはRAからのみ送信される。

RFC6724 ソースアドレス選択ルール#

一つのNICでLLA,ULA,GUAが共存する。 何処かに通信する際、送信元とするアドレスを決めるルールがRFC6724となる。 OSがRFC6724に従って送信元Ipv6アドレスを決める。

基本原則として、送信先と同じスコープのアドレスを使う。スコープは「小→大」の順番で評価する。

  1. リンクローカル(fe80::)
  2. ユニークローカル(fd00::)
  3. グローバル(240b::)
送信先がfe80::(LLA)
→ 送信元もfe80::を使う
送信先がfd00:cafe::(ULA)
→ 送信元もfd00:cafe::を使う
送信先が240b::(GUA)
→ 送信元も240b::を使う

一旦ここまで。 LUAを使ってLANのIPv6設計ができるまでの最低限の知識を叩き込むことはできた。基礎の仕組みを知れたので、あとは日々の作業で向き合っていくだけ。