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アドレスの設定
- RA(Router Advertisement)でGUA prefixが配布される
- SLAACアドレスを自分で作成(安定アドレス)
- プライバシー拡張1(RFC4941)が有効な場合一時アドレスを作成する
- 一時アドレスもSLAACアドレスもGUAアドレスとなる
安定アドレスはinbound(マシンへの通信)を使い、一時アドレスはoutbound(マシンから外部への通信)で使われる。 一時アドレスの使用が優先されるため、外部サーバー目線ではlifecycle時間ごとに見えるIPv6アドレスが変わる。
ステートレス自動設定(SLAAC)による安定アドレスの割り当て
ステートレス自動設定(Stateless Address Autoconfiguration) という仕組みを用いて、IPv4 DHCPサーバーみたいにステートを持たなくてもアドレスを発行する仕組み。
作成方法は昔と今で違う生成方法だった。
昔(EUI-64)
NICのMacアドレスをベースに機械的に作成されるので、macアドレスが変わらない限り同じアドレスが作成される。 macアドレスが逆算できてしまうためプライバシーが終わる。
今(RFC7217 安定プライバシーアドレス)
今は以下の方法でインターフェースIDが作成される。
HASH(プレフィックス + NIC識別子 + 秘密鍵 + カウンター) ↓インターフェースID(乱数っぽいが再起動しても変わらない)秘密鍵
違うIPv6ネットワークに接続するとPrefixが変わるため、hashもかわりSLAACも変わる。トラッキングされないようになる。
一時アドレスの割り当て
ステートレス自動設定(SLAAC)で付与されたアドレスに対して、プライバシー拡張が一時アドレスを追加作成する RFC4941の拡張。
割り当てタイミング
- NICがRAを受け取ったとき(起動時、ネットワーク接続時)
- 既存の一時アドレスが期限切れに近づいたとき
- 事前に新しい一時アドレスを作成する
ローテーションタイミング
- preffered lifetime
- デフォルト24h
- これをすぎると、「使用されていません」扱い(新規接続には使われない。既存通信があるので保持はする)
- valid lifetime
- デフォルト7d
- これをすぎると完全削除
一時アドレス生成ロジック
- OS起動時に乱数シードを作成
- sha1(乱数シード + EUI-64 or NIC識別子)でhash作成
- 上位64bitが次の乱数シード
- 下位64bitが一時アドレスのインターフェースID
- ローテーション時は、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アドレスを決める。
基本原則として、送信先と同じスコープのアドレスを使う。スコープは「小→大」の順番で評価する。
- リンクローカル(fe80::)
- ユニークローカル(fd00
::) - グローバル(240b::)
送信先がfe80::(LLA) → 送信元もfe80::を使う
送信先がfd00:cafe::(ULA) → 送信元もfd00:cafe::を使う
送信先が240b::(GUA) → 送信元も240b::を使う一旦ここまで。 LUAを使ってLANのIPv6設計ができるまでの最低限の知識を叩き込むことはできた。基礎の仕組みを知れたので、あとは日々の作業で向き合っていくだけ。