高速通信計算研究所

slankdevの報告

SRv6 コントロールプレーン調査 (I-D,RFC読書メモ)

概要と目的

この記事は下書き中なので, 書きかけの文章を含むことがあります. また情報の過不足や要望に関してなにかあれば私までTwitterかなにかで こっそり教えていただけるととても参考になりありがたいです. (twitter; slankdev)

私はSRv6のVPNv4を実装したい. そのために必要なコントロールプレーン周りの 知識をある程度網羅的に理解することがこの調査の目標. まずはよく説明される I-Dを流し読みする. 間違った情報を含んでいる可能性が高い. 参照は自己責任でお願いします. 2019.10時点でのSRv6 dataplaneの挙動に関しては理解しているという前提ですすめる. 勉強をしながらこれは修正していけたらよいと思っている... 基本的に僕がサラッと目を通したのは, network-prog, service-prog,のみだった気がするが... srhの定義と, T.hoge, End.hogeが理解出来ていたらよいと思う.

IANA's Border Gateway Protocol Parameters definition

www.iana.org

IANA(Internet assigned numbers authority)で定義されるBGPに関する番号 に関しての原本情報. たとえ実装がなくとも,提案と定義がされてればここに番号 が記録されているので, わからなくなったらこれを確認するとよい. (SSHのポート番号はなに? とかの答えの正確なソースはこれ)

Multiprotocol Extensions for BGP-4

tools.ietf.org

MP-BGPのRFC. これに対応するBGPをBGP4+と呼ぶこともあるようだ. 通常BGPはIPv4 prefixの情報のみを送るためのものだったが, MP-BGPではそれ以外の情報も通知できるためのメッセージフォーマットの 定義をしている. 新たにAddress familyという識別子を定義して, それを用いることによって, IPv4, IPv6の識別や, それ上のVPN等の情報を伝播できるようにした. 現代ではL3VPNやEVPN, BGP flowspecなど様々な技術で活用されている.

BGP/MPLS IP Virtual Private Networks (VPNs)関連 (RFC4364, RFC4659)

tools.ietf.org

そもそもSRv6のVPNv4を考えるときはベースとなるMPLSのVPNv4について復習が必要. RFC4364ではIPバックボーンを使用してIP-VPNを提供する方法について書かれている. RFC4364のIPv6 VPN版がRFC4659である.今回はVPNv6は対象外なので一旦放置. このRFCでは新たに以下を定義している.

  • Route Distingisher
  • Route Traget
  • VPNv4 Address-Family
  • VPNv6 Address-Family

Segment Routing Prefix SID extensions for BGP (draft-ietf-idr-bgp-prefix-sid-27)

tools.ietf.org

このI-Dでは以下を定義 - BGP Path Attribute, Type40 (https://www.iana.org/assignments/bgp-parameters/bgp-parameters.xhtml#bgp-parameters-2)

  • BGP Prefix SID TLV --> BGPでSRの情報を通知するメッセージフォーマットの基本

    • Type0: reserved
    • Type1: label index tlv
    • Type2: ipv6 sid
    • Type3: originator SRGB tlv
    • Type 4-254: unassigned (後のdraftですでに定義されているものあり.)
    • Type: 255: reserved
  • SR-MPLS SIDs. のための仕様

要するに, SR-MPLSを使って, IP-VPNをどのように実現するかのための 基本的な情報を定義している. このI-DではSRv6は範囲外だねと議論されている.

BGP Signaling for SRv6 based Services (draft-dawra-idr-srv6-vpn-05)

tools.ietf.org

このI-DではSR policyをVPNに適用する方法やEVPNへの適用に関しても かかれているが,その部分はこの記事ではすべて省略している.

このI-DではSRv6でl3vpn/evpnを行うための, 手順と必要なメッセージタイプ の定義を行っている. RFC7432(BGP MPLS-Based Ethernet VPN)をベースに どのようにSRv6をそれにアプライするかが主眼であるようだ.

アンダーレイの到達正やそこでのTEは別に記述されていて, VPNで使われるprefixの伝搬をBGPでやるよという話. それらをSRv6 Net-progの考えで抽象化して広告するよという話.

以下のBGPで使われるTLVが定義される. 各PEルータは, VPNプレフィックに合わせたSRv6 SID(IPv6 address prefix)を 広告してそのVPNプレフィックに対する処理を各PEルータ間でやり取りする. (実際は裏でEnd.DXとかEnd.DTとかになっている.) このdraftでは前で説明したdraftのbgp-prefix-sidのBGP-prefix SIDの新しい Type5,6を定義している.

VPNで利用されるSIDはRFC4364(BGP/MPLS IP Virtual Private Networks (VPNs)) と同様の方法で広告される. SID広告のフォーマットはI-D.ietf-idr-bgp-prefix-sidと 同様の形式で広告される. それぞれ以下のようなAFI/SAFIペアになる.

  • VPNv4 o-SRv6: AFI/SAFI = 1/128
  • VPNv6 o-SRv6: AFI/SAFI = 2/128
  • Global IPv4 o-SRv6: AFI/SAFI = 1/1
  • Global IPv6 o-SRv6: AFI/SAFI = 2/1
  • 参考: AFI{1:IPv4, 2:IPv6}, SAFI{1:Ucast, 128:UNDEFINED-yet new...?}

基本的にMPLS-VPNv4のMP_REACH_NLRIをそのまま同じフォーマットで流用する. SID情報に関しては別のTLV(SRv6 Service TLV)で情報通知をするようだ.

開発時のBGP動作のDebugger

WiresharkはBGPをよく解析してくれる. そしてWiresharkはBGP-Prefix-SID path attr を理解しているらしいので, BGPdを拡張してその通信をwiresharkに食わせればおそらく 解析できるはずだ. sourceにもdissectorの情報があった. ただし, TLV typeは1-3までじか実装されていないので, 5,6は実装しないと解析出来ない. まあこれでええやろと思うが, BGPdが出来たあかつきにはそういうのも手を出してみたい.

github.com

参考文献

このメモを作るために参考にしたスライド等を示す.