書いて覚えるDHCPv6-PD

 書いて覚えるDHCPv6-PD

IPv6初体験の素人がDHCPv6-PDでPrefix取得するコード書いて勉強してみました記録です.

E2711ba2cc396ba8e10cc37a7e00a657?s=128

jitomesky

June 29, 2015
Tweet

Transcript

  1. 書いて覚えるDHCPv6-PD 朝倉由夢 が 嫁 の ⼈人

  2. ⽂文明開化 u いままで u CATV回線 u モデムにLANケーブルつなぐとDHCPでIPv4アドレスが降降ってきた u これから u

    フレッツ光回線(プロバイダはIIJ mio 光) u IPv6が使える! IPv6を使いたい!
  3. ⽴立立ちはだかる壁 u vyatta系ルーター⽤用OS(VyOS, EdgeOS) のバグ u IPv6しか降降ってこないPPPoEデバイスを扱えない u 最低限の知識識すらない u

    IPv6のプレフィックスって何……? u DHCPv6-PDって何? dhcpv6-pdってデーモン⽴立立てろってこと? コードを書いて覚えよう
  4. 事前知識識

  5. 最低限必要っぽいこと u IPv6の構造 u PPPoE接続後,IPv6を払いだしてもらうまでの流流れ u DHCPv6-PDの通信 u DHCPv6-PDパケットの構造

  6. IPv6アドレスの構造 u ISPからプレフィックスをもらい,下位は⾃自分で決めてIPv6アドレスを作る u IPv6アドレスは⼤大量量にもらえるので,NAT使って節約する必要はない u LAN内すべてのマシンにグローバルアドレスが振られることになる = フィルタ(FW)の設定ちゃんとしないとだめ. プレフィックス

    n - bit サブネット識識別⼦子 m - bit インターフェース識識別⼦子 (128-(n+m)) - bit ISPからもらう ⾃自分で勝⼿手に決める 全128bit
  7. IPv6アドレスを得るまで(PPPoE⽅方式) 図はNGN IPv6 ISP接続<トンネル⽅方式> UNI仕様書より (http://www.ntt-east.co.jp/info-st/mutial/ngn/110601tunnel_uni.pdf)

  8. IPv6アドレスを得るまで(PPPoE⽅方式) 1. ISPのPPPoEサーバーに接続する 2. ICMPv6を使ってリンクローカルアドレスを決定. ルーターと接続できるようにする 3. DHCPv6-PDでIPv6のプレフィックスアドレスをもらう 4. プレフィックス以下のアドレスを⾃自分で決めて使⽤用する

  9. DHCPv6とは? u IPv6⽤用のDHCP.IPv4の時のDHCPとは別物. u DHCPv6メッセージのオプションを⽤用いて,以下の様なことができる u DNSサーバーの通知 u プレフィックスオプションの通知(DHCPv6-PD(後述) u

    IPv6アドレスの付与 u IPv6は接続時にリンクローカルアドレスでIP通信ができるので, DHCPv6の通信 は全てIP(UDP/IP)で通信する. u クライアント : 546/UDP u サーバー : 547/UDP
  10. DHCPv6-PD(Prefix Delegation)とは u IPv6アドレスのプレフィックスを委任(Delegation)してもらう⼿手続き u 「プレフィックス+⾃自分の決めたアドレス」をグローバルアドレスとして通信する u DHCPv6メッセージのオプション部に空の「PDオプション」を加えて送ると, DHCPv6サーバーがプレフィックスアドレスを返してくれる.

  11. DHCPv6-PDの流流れ(通常) client server Solicit: ドーモ,クライアントです port:546 547 547 Advertise:ドーモ,クライアント=サン,サーバーです 546

    546 547 546 Request: Prefixを渡してもらおう Reply: ドウゾ,Prefixデス
  12. DHCPv6メッセージの構造 タイプ ⻑⾧長さ トランザクションID オプション(n個) (可変⻑⾧長) 8 0 16 32(bit)

    メッセージ (今回は出てこない)
  13. DHCPv6オプションの構造 オプションコード オプション⻑⾧長 オプション内容 (可変⻑⾧長) 8 0 16 32(bit)

  14. Solicitメッセージの構造 Solicit: (1) ⻑⾧長さ トランザクションID 8 0 16 32(bit) クライアント識識別⼦子:

    (1) オプション⻑⾧長 クライアントのDUID DUID: DHCP固有識識別⼦子.リンク層アドレスなどから⼀一意に決定される オプション部
  15. Advertiseメッセージの構造 Advertise: (2) ⻑⾧長さ トランザクションID 8 0 16 32(bit) クライアント識識別⼦子:

    (1) オプション⻑⾧長 クライアントのDUID サーバー識識別⼦子: (2) オプション⻑⾧長 サーバーのDUID オプション1 オプション2
  16. ここで⼀一旦,パケットキャプチャ ???

  17. アイエエエ Solicit,PDオプション ナンデ u RFC3633に「SolicitにPDオプション⼊入れて,Advertiseで返していいよ」と書い てある. u The requesting router

    then transmits a Solicit message containing an IA_PD option describing the IA_PD. Delegating routers that can delegate prefixes to the IA_PD respond to the requesting router with an Advertise message. u ルーターを選ぶとき参考にするために使⽤用するとのこと u The requesting router may include prefixes in the IA_PDs as a hint to the delegating router about specific prefixes for which the requesting router has a preference. u プレフィックスがほしいだけならAdvertiseについてるPD取得すれば良良さそう u Request, Replyパケット書くのめんどくさい(⼩小声)
  18. Tips: Rapid-Commit u SolicitにRapid Commitオプション(オプションコード0x000e,length=0)をつけ て送ると,即Replyが返ってくる. client server Solicit: ドーモ,クライアント

    です PrefixをRapid-Commitで渡してもらおう port:546 547 547 Reply: ドウゾ,Prefixデス 546
  19. PDオプションの付いたSolicitメッセージ Solicit: (1) ⻑⾧長さ トランザクションID 8 0 16 32(bit) クライアント識識別⼦子オプション

    IAID(Zero-fill) プレフィックス: (26) オプション⻑⾧長: (12) プレフィックス オプション T1(Zero-fill) T2(Zero-fill)
  20. PDオプションの付いたAdvertiseメッセージ Advertise: (2) ⻑⾧長さ トランザクションID 8 0 16 32(bit) クライアント識識別⼦子オプション

    プレフィックス: (26) オプション⻑⾧長 プレフィックス オプション サーバー識識別⼦子オプション IAID T1 T2 IA_Prefix (次スライド参照)
  21. IA_Prefix IA_Prefix: (26) ⻑⾧長さ 8 0 16 32(bit) Preferred lifetime:

    infinity(0xffffffff) プレフィックス ⻑⾧長 プレフィックスアドレス(0-23bit) Valid lifetime: infinity(0xffffffff) プレフィックスアドレス(24-119bit) プレフィックス (120-127bit)
  22. 実装

  23. DHCPv6クライアントの実装 u 機能はDHCPv6-PDのみ u SolicitにIA_PDオプションをつけて送り,Advertiseで返ってきたプレフィック スを表⽰示する u ⾔言語はPython3(Cでやるのめんどい)

  24. DHCPv6サーバーの設定 u OSはDebian 8.0を使⽤用 u DHCPv6サーバーはwide-dhcpv6-serverを使⽤用 u sudo aptitude –y

    install wide-dhcpv6-server u /etc/wide-dhcpv6/dhcp6s.confに以下を記述して起動する. interface eth1{ allow rapid-commit; }; host hoge{ duid 00:01:00:01:1c:fb:53:ac:08:00:27:42:a9:d9; prefix 2001:db8:1111::/48 infinity; }; u sudo dhcp6s –Df eth1 サーバーが使うNIC クライアントのDUID プレフィックス
  25. コード と デモ u コード; https://gist.github.com/jitomesky/a3204946092bacef1993 u プレフィックス 2001:0db8:111::/48 が得られた

    u ※サーバーのDUIDをクライアントに流流⽤用したので,DUIDが⼀一致している(普通はダメ)
  26. 発表時は未解決だった疑問(解決済み) u SolicitにPDオプション乗っけるのはどの規格に書かれている? u 2メッセージで終了了するRapid-CommitはRapid-Commitオプション送らないと有効に ならないはずでは……? u Wide-DHCPv6だけの仕様? (要⽐比較) u

    私がRFCを読めてないだけ...…? 優しい⽅方「RFC3633を読みましょう」
  27. 参考⽂文献 u マスタリングTCP/IP IPv6編 u IPv6の基礎について知るならまずこれを読むと良良さそう u 但しDHCPv6の詳しい解説は少ない u http://ja.wikipedia.org/wiki/DHCPv6

    u RFC3315(IPv6関連全般の話) u https://www.ietf.org/rfc/rfc3315.txt u RFC3633(DHCPv6-PD関連の話) u https://www.ietf.org/rfc/rfc3633.txt