LGTM

Looks Good To Me

EVPN - VLAN Based と VLAN Aware Bundle の相互接続

TL; DR

EVPN は仕様が標準化され、Control / Data Plane が分離されているにも関わらず、Service Interface が異なる場合 ふつうは相互接続できません。 これがマルチベンダー EVPN を困難にする一因になっています。

この記事では Juniper vQFX (VLAN Aware Bundle) と vEOS (VLAN Based) 間で EVPN 接続し、実際に MAC 学習できないことを確認します。

それから、両者を橋渡しできるような Route Reflector を書くことで MAC 学習させ、通信させてみます。

EVPN とは

L2VPN を実現するプロトコルのひとつで、RFC7209 ( *1 ) で要件整理され、RFC7432 ( *2 ) で仕様策定されました。簡単に言うと、

Control Plane

EthernetMAC 情報をMP-BGP を使って伝搬させ、MAC 学習する

Data Plane

データであるEthernet フレームは、いろいろなトンネリングプロトコルによってカプセル (encapsulate) し、伝送する

というプロトコルです。 トンネリングプロトコルとセットにして、EVPN / MPLS や EVPN / VXLAN などと記載されることが多いと思います。

RFC7432 策定当時は EVPN / MPLS を前提としていて、VPLS の代替と位置付けられていましたが、オーバーレイの encapsulation は MPLS でなくても構いません。 RFC8365 ( *3 ) には、いくつかの encapsulation に関する記述があります。MPLS 同様よく使われているであろう VXLAN ( *4 ) を使う場合についてもこちらに定義されています。

マルチベンダーで EVPN 使いたい!

そもそも本当にマルチベンダーにしたいのかについては一考の余地があります。

  • ベンダーを統一するとできることが増えるのでは?
  • 単一API で機能を呼べることで、開発コストが減るのでは?
  • スイッチとしてのハードウェアのふるまい、ソフトウェアのデザインが一致していることで運用コストが減るのでは?
  • ...

いろんな理屈があって どれもそれはそうなんですが、「マルチベンダー」という選択肢が減るのは悪だと思っています。比較のうえ捨てるのは OK ですが、比較すらできないのはよくない。

さて、「マルチベンダーを考えましょう」という立場にたったとき、EVPN が標準化され Control / Data Plane が綺麗に分離されているにも関わらず、相互接続性に問題があります。

もっとも大きい問題が「Service Interface の相互接続性」です。

( 抜粋: マルチベンダ環境におけるEVPN構築のノウハウ~Interop Tokyo 2016 ShowNetでの相互接続検証を元に~ https://www.nic.ad.jp/ja/materials/iw/2016/proceedings/t05/t5-ohkubo.pdf )

Service Interface については、こちらもInternet Week 2016 スライドがわかりやすいので抜粋しますが、

「ひとつの EVPN Instance (EVI) が何個のBridge Domain / Broadcast Domain (VLAN) をカバーするか」の分類を表します。

( 抜粋: EVPN 技術紹介 https://www.nic.ad.jp/ja/materials/iw/2016/proceedings/t05/t5-kamitani-2.pdf )

Arista、Juniper MX など一部プラットフォームを除き、多くの機器でService Interfaceは実質固定です。 これは各NOSのEPVN Instance がどのようなテーブルを持っているか、ASIC / チップがどのような制約を持っているかによりますが、Service Interface が違うと相互接続できない点がマルチベンダーを困難にしています。

わたしが触る範囲では VLAN Based なプラットフォームが多いですが、そんなに多種多様な機器を触っているわけではないので…偏っているかもしれません。Juniper QFX など、よくみるプラットフォームで VLAN Aware Bundle なものはあります。 個人的には、VLAN Bundle に触れたことはありません。

ほんとうに相互接続できないか試す

  • EVPN / VXLAN
  • Juniper vQFX (VLAN Aware Bundle)
  • Arista vEOS (VLAN Based 設定)
    • Arista 自体は VLAN Aware Bundle いけますが、ここでは VLAN Based で設定

を 👇 のように接続し、Route Reflector 経由で EVPN BGP を張ります。
( わざわざ Control / Data Place を分けた理由は後述 )

  • IP アドレス記載のあるポートはL3、それ以外はL2 ポート
  • vQFX xe-0/0/0 と vEOS Et1 は VLAN100 (VNI 1100) に所属
  • vQFX xe-0/0/1 と vEOS Et2 は VLAN200 (VNI 1200) に所属
  • vQFX config
  • vEOS config

やはり通信できない

いくつかのコマンド結果を記載します。

vQFX 側は対向からの EVPN route type 2 ( MAC/IP )、route type 3 ( IMET ) を受信・解釈し、MAC 学習できているのに対し、vEOS 側は受信できているものの解釈・MAC 学習できていません。

vQFX
koji@vqfx1-re> show ethernet-switching table

MAC flags (S - static MAC, D - dynamic MAC, L - locally learned, P - Persistent static
           SE - statistics enabled, NM - non configured MAC, R - remote PE MAC, O - ovsdb MAC)


Ethernet switching table : 4 entries, 4 learned
Routing instance : default-switch
   Vlan                MAC                 MAC      Logical                Active
   name                address             flags    interface              source
   vlan100             00:0c:29:88:49:aa   D        vtep.32769             10.0.0.2  # ← vEOS
   vlan100             00:0c:29:fa:ac:f7   D        xe-0/0/0.0
   vlan200             00:0c:29:88:49:b4   D        vtep.32769             10.0.0.2  # ← vEOS
   vlan200             00:0c:29:fa:ac:01   D        xe-0/0/1.0
koji@vqfx1-re> show route table default-switch.evpn.0 detail

default-switch.evpn.0: 8 destinations, 8 routes (8 active, 0 holddown, 0 hidden)
2:10.0.0.1:1::1100::00:0c:29:fa:ac:f7/304 MAC/IP (1 entry, 1 announced)
        *EVPN   Preference: 170
                Next hop type: Indirect, Next hop index: 0
                Address: 0xb4d8570
                Next-hop reference count: 6
                Protocol next hop: 10.0.0.1
                Indirect next hop: 0x0 - INH Session ID: 0x0
                State: <Active Int Ext>
                Age: 6:36:18
                Validation State: unverified
                Task: default-switch-evpn
                Announcement bits (1): 1-BGP_RT_Background
                AS path: I
                Communities: encapsulation:vxlan(0x8)
                Route Label: 1100
                ESI: 00:00:00:00:00:00:00:00:00:00

2:10.0.0.1:1::1200::00:0c:29:fa:ac:01/304 MAC/IP (1 entry, 1 announced)
        *EVPN   Preference: 170
                Next hop type: Indirect, Next hop index: 0
                Address: 0xb4d8570
                Next-hop reference count: 6
                Protocol next hop: 10.0.0.1
                Indirect next hop: 0x0 - INH Session ID: 0x0
                State: <Active Int Ext>
                Age: 6:36:16
                Validation State: unverified
                Task: default-switch-evpn
                Announcement bits (1): 1-BGP_RT_Background
                AS path: I
                Communities: encapsulation:vxlan(0x8)
                Route Label: 1200
                ESI: 00:00:00:00:00:00:00:00:00:00

2:10.0.0.2:1100::0::00:0c:29:88:49:aa/304 MAC/IP (1 entry, 1 announced)
        *BGP    Preference: 170/-101
                Route Distinguisher: 10.0.0.2:1100
                Next hop type: Indirect, Next hop index: 0
                Address: 0xb4d8690
                Next-hop reference count: 8
                Source: 192.168.10.3
                Protocol next hop: 10.0.0.2
                Indirect next hop: 0x2 no-forward INH Session ID: 0x0
                State: <Secondary Active Int Ext>
                Local AS: 65000 Peer AS: 65000
                Age: 2:13       Metric2: 11
                Validation State: unverified
                Task: BGP_65000.192.168.10.3
                Announcement bits (1): 0-default-switch-evpn
                AS path: I (Originator)
                Cluster list:  192.168.10.3
                Originator ID: 10.0.0.2
                Communities: target:65000:1100 encapsulation:vxlan(0x8)
                Import Accepted
                Route Label: 1100
                ESI: 00:00:00:00:00:00:00:00:00:00
                Localpref: 100
                Router ID: 192.168.10.3
                Primary Routing Table bgp.evpn.0

2:10.0.0.2:1200::0::00:0c:29:88:49:b4/304 MAC/IP (1 entry, 1 announced)
        *BGP    Preference: 170/-101
                Route Distinguisher: 10.0.0.2:1200
                Next hop type: Indirect, Next hop index: 0
                Address: 0xb4d8690
                Next-hop reference count: 8
                Source: 192.168.10.3
                Protocol next hop: 10.0.0.2
                Indirect next hop: 0x2 no-forward INH Session ID: 0x0
                State: <Secondary Active Int Ext>
                Local AS: 65000 Peer AS: 65000
                Age: 2:02       Metric2: 11
                Validation State: unverified
                Task: BGP_65000.192.168.10.3
                Announcement bits (1): 0-default-switch-evpn
                AS path: I (Originator)
                Cluster list:  192.168.10.3
                Originator ID: 10.0.0.2
                Communities: target:65000:1200 encapsulation:vxlan(0x8)
                Import Accepted
                Route Label: 1200
                ESI: 00:00:00:00:00:00:00:00:00:00
                Localpref: 100
                Router ID: 192.168.10.3
                Primary Routing Table bgp.evpn.0

3:10.0.0.1:1::1100::10.0.0.1/248 IM (1 entry, 1 announced)
        *EVPN   Preference: 170
                Next hop type: Indirect, Next hop index: 0
                Address: 0xb4d8570
                Next-hop reference count: 6
                Protocol next hop: 10.0.0.1
                Indirect next hop: 0x0 - INH Session ID: 0x0
                State: <Active Int Ext>
                Age: 6:40:17
                Validation State: unverified
                Task: default-switch-evpn
                Announcement bits (1): 1-BGP_RT_Background
                AS path: I
                Communities: encapsulation:vxlan(0x8)
                Route Label: 1100
                PMSI: Flags 0x0: Label 1100: Type INGRESS-REPLICATION 10.0.0.1

3:10.0.0.1:1::1200::10.0.0.1/248 IM (1 entry, 1 announced)
        *EVPN   Preference: 170
                Next hop type: Indirect, Next hop index: 0
                Address: 0xb4d8570
                Next-hop reference count: 6
                Protocol next hop: 10.0.0.1
                Indirect next hop: 0x0 - INH Session ID: 0x0
                State: <Active Int Ext>
                Age: 6:40:17
                Validation State: unverified
                Task: default-switch-evpn
                Announcement bits (1): 1-BGP_RT_Background
                AS path: I
                Communities: encapsulation:vxlan(0x8)
                Route Label: 1200
                PMSI: Flags 0x0: Label 1200: Type INGRESS-REPLICATION 10.0.0.1

3:10.0.0.2:1100::0::10.0.0.2/248 IM (1 entry, 1 announced)
        *BGP    Preference: 170/-101
                Route Distinguisher: 10.0.0.2:1100
                PMSI: Flags 0x0: Label 68: Type INGRESS-REPLICATION 10.0.0.2
                Next hop type: Indirect, Next hop index: 0
                Address: 0xb4d8690
                Next-hop reference count: 8
                Source: 192.168.10.3
                Protocol next hop: 10.0.0.2
                Indirect next hop: 0x2 no-forward INH Session ID: 0x0
                State: <Secondary Active Int Ext>
                Local AS: 65000 Peer AS: 65000
                Age: 3:53       Metric2: 11
                Validation State: unverified
                Task: BGP_65000.192.168.10.3
                Announcement bits (1): 0-default-switch-evpn
                AS path: I (Originator)
                Cluster list:  192.168.10.3
                Originator ID: 10.0.0.2
                Communities: target:65000:1100 encapsulation:vxlan(0x8)
                Import Accepted
                Localpref: 100
                Router ID: 192.168.10.3
                Primary Routing Table bgp.evpn.0

3:10.0.0.2:1200::0::10.0.0.2/248 IM (1 entry, 1 announced)
        *BGP    Preference: 170/-101
                Route Distinguisher: 10.0.0.2:1200
                PMSI: Flags 0x0: Label 75: Type INGRESS-REPLICATION 10.0.0.2
                Next hop type: Indirect, Next hop index: 0
                Address: 0xb4d8690
                Next-hop reference count: 8
                Source: 192.168.10.3
                Protocol next hop: 10.0.0.2
                Indirect next hop: 0x2 no-forward INH Session ID: 0x0
                State: <Secondary Active Int Ext>
                Local AS: 65000 Peer AS: 65000
                Age: 3:53       Metric2: 11
                Validation State: unverified
                Task: BGP_65000.192.168.10.3
                Announcement bits (1): 0-default-switch-evpn
                AS path: I (Originator)
                Cluster list:  192.168.10.3
                Originator ID: 10.0.0.2
                Communities: target:65000:1200 encapsulation:vxlan(0x8)
                Import Accepted
                Localpref: 100
                Router ID: 192.168.10.3
                Primary Routing Table bgp.evpn.0
vEOS
veos2#sh mac address-table
          Mac Address Table
------------------------------------------------------------------

Vlan    Mac Address       Type        Ports      Moves   Last Move
----    -----------       ----        -----      -----   ---------
 100    000c.2988.49aa    DYNAMIC     Et1        1       0:00:44 ago
 200    000c.2988.49b4    DYNAMIC     Et2        1       0:00:33 ago
Total Mac Addresses for this criterion: 2

          Multicast Mac Address Table
------------------------------------------------------------------

Vlan    Mac Address       Type        Ports
----    -----------       ----        -----
Total Mac Addresses for this criterion: 0
veos2#sh bgp evpn detail
BGP routing table information for VRF default
Router identifier 10.0.0.2, local AS number 65000
BGP routing table entry for mac-ip 000c.2988.49aa, Route Distinguisher: 10.0.0.2:1100
 Paths: 1 available
  Local
    - from - (0.0.0.0)
      Origin IGP, metric -, localpref -, weight 0, valid, local, best
      Extended Community: Route-Target-AS:65000:1100 TunnelEncap:tunnelTypeVxlan
      VNI: 1100 ESI: 0000:0000:0000:0000:0000
BGP routing table entry for mac-ip 000c.2988.49b4, Route Distinguisher: 10.0.0.2:1200
 Paths: 1 available
  Local
    - from - (0.0.0.0)
      Origin IGP, metric -, localpref -, weight 0, valid, local, best
      Extended Community: Route-Target-AS:65000:1200 TunnelEncap:tunnelTypeVxlan
      VNI: 1200 ESI: 0000:0000:0000:0000:0000
BGP routing table entry for mac-ip 1100 000c.29fa.acf7, Route Distinguisher: 10.0.0.1:1
 Paths: 1 available
  Local
    10.0.0.1 from 192.168.10.3 (192.168.10.3)
      Origin IGP, metric -, localpref 100, weight 0, valid, internal, best
      Originator: 10.0.0.1, Cluster list: 192.168.10.3
      Extended Community: Route-Target-AS:65000:1100 TunnelEncap:tunnelTypeVxlan
      VNI: 1100 ESI: 0000:0000:0000:0000:0000
BGP routing table entry for mac-ip 1200 000c.29fa.ac01, Route Distinguisher: 10.0.0.1:1
 Paths: 1 available
  Local
    10.0.0.1 from 192.168.10.3 (192.168.10.3)
      Origin IGP, metric -, localpref 100, weight 0, valid, internal, best
      Originator: 10.0.0.1, Cluster list: 192.168.10.3
      Extended Community: Route-Target-AS:65000:1200 TunnelEncap:tunnelTypeVxlan
      VNI: 1200 ESI: 0000:0000:0000:0000:0000
BGP routing table entry for imet 10.0.0.2, Route Distinguisher: 10.0.0.2:1100
 Paths: 1 available
  Local
    - from - (0.0.0.0)
      Origin IGP, metric -, localpref -, weight 0, valid, local, best
      Extended Community: Route-Target-AS:65000:1100 TunnelEncap:tunnelTypeVxlan
      VNI: 1100
BGP routing table entry for imet 10.0.0.2, Route Distinguisher: 10.0.0.2:1200
 Paths: 1 available
  Local
    - from - (0.0.0.0)
      Origin IGP, metric -, localpref -, weight 0, valid, local, best
      Extended Community: Route-Target-AS:65000:1200 TunnelEncap:tunnelTypeVxlan
      VNI: 1200
BGP routing table entry for imet 1100 10.0.0.1, Route Distinguisher: 10.0.0.1:1
 Paths: 1 available
  Local
    10.0.0.1 from 192.168.10.3 (192.168.10.3)
      Origin IGP, metric -, localpref 100, weight 0, valid, internal, best
      Originator: 10.0.0.1, Cluster list: 192.168.10.3
      Extended Community: Route-Target-AS:65000:1100 TunnelEncap:tunnelTypeVxlan
      VNI: 1100
BGP routing table entry for imet 1200 10.0.0.1, Route Distinguisher: 10.0.0.1:1
 Paths: 1 available
  Local
    10.0.0.1 from 192.168.10.3 (192.168.10.3)
      Origin IGP, metric -, localpref 100, weight 0, valid, internal, best
      Originator: 10.0.0.1, Cluster list: 192.168.10.3
      Extended Community: Route-Target-AS:65000:1200 TunnelEncap:tunnelTypeVxlan
      VNI: 1200

BGP Update Message を覗く

それぞれの type 2 route のサンプルです。

EVPN route はすべて MP_REACH_NLRI にエンコードされます。

の値が微妙に違うのがわかるでしょうか。 両方 VNI 1100 の経路です。

vQFX (VLAN Aware Bundle) → vEOS (VLAN Based)

設定:

  • VLAN Aware Bundle なので、 RD は VLAN (VNI) によらず 10.0.0.1:1 (固定値)

vQFX (VLAN Aware Bundle) ← vEOS (VLAN Based)

設定:

  • VLAN Based なので、RD を区別して
    • VLAN 100 ( VNI 1100) → 10.0.0.2:1100
    • VLAN 200 ( VNI 1200) → 10.0.0.2:1200

MAC 学習させるには

今回の RD / VNI 番号設計に限った話ではありますが、

Service Interface RD E-Tag ID
VLAN Aware Bundle <VTEP endpoint address>:1 <VNI>
VLAN Based <VTEP endpoint address>:<VNI> 0

を相互に変換すればよさそうです。

RFC7432 によれば、

6.1. VLAN-Based Service Interface

... The Ethernet Tag ID in all EVPN routes MUST be set to 0.

6.3. VLAN-Aware Bundle Service Interface

... The Ethernet Tag ID in all EVPN routes MUST be set to the normalized Ethernet Tag ID assigned by the EVPN provider.

あるいは RFC8365 には、

For the VLAN-Aware Bundle Service (multiple VNIs per MAC-VRF with each VNI associated with its own bridge table), the Ethernet Tag field in the MAC Advertisement, Ethernet A-D per EVI, and IMET route MUST identify a bridge table within a MAC-VRF; the set of Ethernet Tags for that EVI needs to be configured consistently on all PEs within that EVI. For locally assigned VNIs, the value advertised in the Ethernet Tag field MUST be set to a VID just as in the VLAN-aware bundle service in [RFC7432]. Such setting must be done consistently on all PE devices participating in that EVI within a given domain. For global VNIs, the value advertised in the Ethernet Tag field SHOULD be set to a VNI as long as it matches the existing semantics of the Ethernet Tag, i.e., it identifies a bridge table within a MAC-VRF and the set of VNIs are configured consistently on each PE in that EVI.

という記述があり、確かにそれでよさそう。

経路変換するにあたり、RD、E-Tag ID は MP_REACH_NLRI なため、一般的な経路フィルターでは操作できません。 Route Reflector を書く必要がありそうです。

例として gobgpd ( *5 ) をカスタマイズし、

  • BGP Neighbor ごとに VLAN Aware Bundle / VLAN Based の別を設定できる
  • RIB には VLAN Aware Bundle の形で保持し、VLAN Based ピアには変換して広告する

ようにしてみます。

VXLAN Header 自体は 変数としてVNI しか持たないため、Control Plane だけの変換ですむはず。

通信できた 🎉

パッチを一部 掲載しますが、

# pkg/server/server.go

1022 func (s *BgpServer) processOutgoingPaths(peer *peer, paths, olds []*table.Path) []*table.Path {
...
1029         for idx, path := range paths {
1030                 var old *table.Path
1031                 if olds != nil {
1032                         old = olds[idx]
1033                 }
1034                 if p := s.filterpath(peer, path, old); p != nil {
1035                         // Hack
1036                         if !peer.fsm.pConf.Config.VlanAwareBundle {
1037                                 if p != nil && p.GetRouteFamily() == bgp.RF_EVPN {
1038                                         nlri := p.GetNlri().(*bgp.EVPNNLRI)
1039
1040                                         switch nlri.RouteType {
...
1057                                         case bgp.EVPN_ROUTE_TYPE_MAC_IP_ADVERTISEMENT:
1058                                                 route := nlri.RouteTypeData.(*bgp.EVPNMacIPAdvertisementRoute)
1059
1060                                                 // For VLAN based router, RD needs to vary, otherwise only one route will be active per RD
1061                                                 rd := route.RD.(*bgp.RouteDistinguisherIPAddressAS)
1062                                                 rd.Assigned = uint16(route.ETag)  // E-Tag ID をRD 下位16bit にコピー
1063
1064                                                 new := &bgp.EVPNMacIPAdvertisementRoute{
1065                                                         RD:               rd,
1066                                                         ESI:              route.ESI,
1067                                                         ETag:             0,  // 0 で上書き
1068                                                         MacAddressLength: route.MacAddressLength,
1069                                                         MacAddress:       route.MacAddress,
1070                                                         IPAddressLength:  route.IPAddressLength,
1071                                                         IPAddress:        route.IPAddress,
1072                                                         Labels:           route.Labels,
1073                                                 }
1074
1075                                                 p = table.NewPath(p.GetSource(), bgp.NewEVPNNLRI(nlri.RouteType,      new),
...
1154 func (s *BgpServer) propagateUpdate(peer *peer, pathList []*table.Path) {
...
1263                 if path.GetRouteFamily() == bgp.RF_EVPN {
1264                         nlri := path.GetNlri().(*bgp.EVPNNLRI)
1265                         switch nlri.RouteType {
...
1269                         case bgp.EVPN_ROUTE_TYPE_MAC_IP_ADVERTISEMENT:
1270                                 evpnRoute := nlri.RouteTypeData.(*bgp.EVPNMacIPAdvertisementRoute)
1271                                 if len(evpnRoute.Labels) > 0 {
1272                                         evpnRoute.ETag = evpnRoute.Labels[0]  # MPLS Labels1 から転記
1273                                 }

さほど複雑ではありません。 これを使うと…さきほど MAC学習できていなかった vEOS 側で無事 MAC 学習できました!!

veos2#sh mac address-table
          Mac Address Table
------------------------------------------------------------------

Vlan    Mac Address       Type        Ports      Moves   Last Move
----    -----------       ----        -----      -----   ---------
 100    000c.2988.49aa    DYNAMIC     Et1        1       0:05:17 ago
 100    000c.29fa.acf7    DYNAMIC     Vx1        1       0:00:21 ago
 200    000c.2988.49b4    DYNAMIC     Et2        1       0:05:06 ago
 200    000c.29fa.ac01    DYNAMIC     Vx1        1       0:00:21 ago
Total Mac Addresses for this criterion: 4

          Multicast Mac Address Table
------------------------------------------------------------------

Vlan    Mac Address       Type        Ports
----    -----------       ----        -----
Total Mac Addresses for this criterion: 0

EVPN Table のほうは、vEOS から見た diff です。

@@ -15,7 +15,7 @@
       Origin IGP, metric -, localpref -, weight 0, valid, local, best
       Extended Community: Route-Target-AS:65000:1200 TunnelEncap:tunnelTypeVxlan
       VNI: 1200 ESI: 0000:0000:0000:0000:0000
-BGP routing table entry for mac-ip 1100 000c.29fa.acf7, Route Distinguisher: 10.0.0.1:1
+BGP routing table entry for mac-ip 000c.29fa.acf7, Route Distinguisher: 10.0.0.1:1100
  Paths: 1 available
   Local
     10.0.0.1 from 192.168.10.3 (192.168.10.3)
@@ -23,7 +23,7 @@
       Originator: 10.0.0.1, Cluster list: 192.168.10.3
       Extended Community: Route-Target-AS:65000:1100 TunnelEncap:tunnelTypeVxlan
       VNI: 1100 ESI: 0000:0000:0000:0000:0000
-BGP routing table entry for mac-ip 1200 000c.29fa.ac01, Route Distinguisher: 10.0.0.1:1
+BGP routing table entry for mac-ip 000c.29fa.ac01, Route Distinguisher: 10.0.0.1:1200
  Paths: 1 available
   Local
     10.0.0.1 from 192.168.10.3 (192.168.10.3)
@@ -45,7 +45,7 @@
       Origin IGP, metric -, localpref -, weight 0, valid, local, best
       Extended Community: Route-Target-AS:65000:1200 TunnelEncap:tunnelTypeVxlan
       VNI: 1200
-BGP routing table entry for imet 1100 10.0.0.1, Route Distinguisher: 10.0.0.1:1
+BGP routing table entry for imet 10.0.0.1, Route Distinguisher: 10.0.0.1:1100
  Paths: 1 available
   Local
     10.0.0.1 from 192.168.10.3 (192.168.10.3)
@@ -53,7 +53,7 @@
       Originator: 10.0.0.1, Cluster list: 192.168.10.3
       Extended Community: Route-Target-AS:65000:1100 TunnelEncap:tunnelTypeVxlan
       VNI: 1100
-BGP routing table entry for imet 1200 10.0.0.1, Route Distinguisher: 10.0.0.1:1
+BGP routing table entry for imet 10.0.0.1, Route Distinguisher: 10.0.0.1:1200
  Paths: 1 available
   Local
     10.0.0.1 from 192.168.10.3 (192.168.10.3)

まとめ & 考察

  • EVPN Service Interface 間の相互接続は、Control Plane に手を加えるだけで達成できそうです。ただし、
    • 確認したのは Single Home のみ
    • ビジネスロジック = RD / VNI 番号設計 を前提にする必要があります。汎用的な変換をするのは難しそう
  • SDN コントローラーのような、Route Reflector としてふるまうコンポーネントでは、経路変換は実装・運用可能に見えます
    • 一方、Spine-Leaf BGP EVPN な設計のところで Spine に手を入れられるかというと…難しい場合が多そう
  • 単純なしくみで Control Plane を作れます。「相互接続は難しい」とされる理由について、他に何かありそうと感じます。
    • なんだろう? Multihoming?
  • そもそもマルチベンダーしたいかという点について、もちろん各社の方針はあるでしょう

EVPN、さほど詳しくありません。間違いがありましたら、バンバンご指摘いただけると嬉しいです!