🌐

EVPN/VXLAN -実践編-

に公開

構成概要

NW構成図

今回の環境はContanerlabを使用して構築しています。

構成したネットワークは以下のようになっています。
card

データセンターXとデータセンターYのマルチサイト構成としており、全てのRouterとServerにはFRRがインストールしています。(本当はこんなに大掛かりにする必要はないですがロマンです。あとマルチサイトとマルチテナントの違いもよくわかっていません)
データセンター内のServerにはVNI1010:VLAN10を割り当てた192.168.10.240/28とVNI1020:VLAN20を割り当てた192.168.20.240/28のセグメントが用意しています。
L2VNIとしてVNI1010, VNI1020があり、L3VNIとしてVNI3000を用意しています。

アンダーレイNW

アンダーレイNWは、昨今のデータセンターネットワークの流行に合わせてIP CLOS構成とBGPを利用し、VTEPとなるloインターフェイスのIPアドレスの経路情報の交換が行われているようです。
また、IPv6リンクローカルアドレスを利用したBGP UnnumberdによるBGP接続も行っています。

オーバーレイNW

オーバーレイNWは、同じデータセンター内ではBGWのloインターフェイスとLEAFのVTEP(loインターフェイス)との間でMP-BGP EVPNによるピアを張っています。異なるデータセンター間での経路情報の交換は、BGW同士でEVPNのピアを張ってやり取りしています。

設定例

コンフィグが大量にあるため、すべてのコンフィグを見たい場合はGithub:c9lab/EVPN/VXLANをご覧ください。
ここでは一部の機器を抜粋しながら説明していきます。詳細な説明は動作と交えながらご紹介できればといいと思います。

LinuxでのEVPN/VXLANを使えるようにするための下準備

以下の作業はVTEPを作成するLEAFで行っています。
設定内容としては、L2VPNのためのL2VNIのVXLANインターフェイスとVLANインターフェイスの作成、およびL3VPNのためのL3VNIのVXLANインターフェイスとVRFの作成をしています。
addrgenmode none はIPv6アドレスの自動設定の無効化を意図しており、nolearningによりVTEPインターフェイスの動的学習を無効化し、BridgeのスレーブとしARP suppressの有効化を行うことでMACアドレスの動的学習を無効化しています。
VTEPのアドレスはFRRの方で設定しているloインターフェイスのアドレスを割り当てています。
Linuxの内部ではVRF:l3vni-3000にVXLANインターフェイスのvni1010とvni3000がつながる構成となっています。加えてvni1010に繋がっているbr10が接続され、さらにbr10に繋がっているeth3.10も同様に接続される形となっていると想像してもらえればいいと思います。

config
        ### ip-vrf l3vni-3000 L3vni 3000 ###
        - ip link add l3vni-3000 type vrf table 3000
        - ip link set up l3vni-3000
        - ip link add br3000 type bridge
        - ip link set br3000 mtu 9500
        - ip link set br3000 master l3vni-3000 addrgenmode none
        - ip link set br3000 addr aa:bb:cc:10:30:21
        - ip link add vni3000 type vxlan local 10.1.254.21 dstport 4789 id 3000 nolearning
        - ip link set vni3000 mtu 9500
        - ip link set vni3000 master br3000 addrgenmode none
        - ip link set vni3000 type bridge_slave neigh_suppress on learning off
        - ip link set up br3000
        - ip link set up vni3000
        ### l2vni 1010 ###
        - ip link add br10 type bridge
        - ip link set br10 master l3vni-3000
        - ip link set br10 mtu 9500
        - ip link set br10 addr aa:bb:cc:10:11:21
        - ip addr add 192.168.10.251/28 dev br10
        - ip link add vni1010 type vxlan local 10.1.254.21 dstport 4789 id 1010 nolearning
        - ip link set vni1010 mtu 9500
        - ip link set vni1010 master br10 addrgenmode none
        - ip link set vni1010 type bridge_slave neigh_suppress on learning off
        - ip link set vni1010 up
        - ip link set up br10
        - ip link set br10 type bridge vlan_filtering 1
        - ip link add link eth3 name eth3.10 type vlan id 10
        - ip link set eth3.10 master br10
        - ip link set up eth3.10

BGWの設定

DCIのBGPルータとSPINEとのBGPピア、LEAFのVTEPとのEVPNピアの設定を行っています。
BGPに関するピアの設定手順などの説明は省略しますが、私が参考にしたサイトを貼っておきます。
BGP in The Data Centerを読みました

BGWのコンフィグとしては、自サイトのloインターフェイスのアドレスを異サイトに広報する際にアドレス集約を行う構成としています。しかしアドレス集約を行うと自分のloインターフェイスのアドレスが抑制されてしまうため、route-mapによってフィルターをかけて調整をしています。

RT-BGW-01
!
frr version 8.4.1_git
frr defaults datacenter
hostname RT-BGW-01
no ipv6 forwarding
!
interface eth1
 ip address 172.16.93.10/30
exit
!
interface lo
 ip address 10.1.254.1/32
exit
!
router bgp 65100
 bgp router-id 10.1.254.1
 no bgp default ipv4-unicast
 bgp bestpath as-path multipath-relax
 neighbor AS65930 peer-group
 neighbor AS65930 remote-as external
 neighbor EVPN peer-group
 neighbor EVPN remote-as external
 neighbor EVPN ebgp-multihop 5
 neighbor EVPN update-source lo
 neighbor SPINE peer-group
 neighbor SPINE remote-as external
 neighbor SPINE bfd
 neighbor SPINE timers connect 5
 neighbor 172.16.93.9 peer-group AS65930
 neighbor 10.1.254.21 peer-group EVPN
 neighbor 10.1.254.22 peer-group EVPN
 neighbor 10.1.254.23 peer-group EVPN
 neighbor 10.1.254.24 peer-group EVPN
 neighbor 10.2.254.1 peer-group EVPN
 neighbor eth2 interface peer-group SPINE
 neighbor eth3 interface peer-group SPINE
 !
 address-family ipv4 unicast
  network 10.1.254.1/32
  aggregate-address 10.1.254.0/24 suppress-map ACCEPT_SUPRESS
  neighbor AS65930 activate
  neighbor AS65930 soft-reconfiguration inbound
  neighbor AS65930 route-map IMPORT_AS65930 in
  neighbor AS65930 route-map EXPORT_AS65930 out
  neighbor SPINE activate
  neighbor SPINE route-map EXPORT_SPINE out
 exit-address-family
 !
 address-family l2vpn evpn
  neighbor EVPN activate
 exit-address-family
exit
!
ip prefix-list DC_X_LOCAL_SUBNET seq 5 deny 10.1.254.1/32
ip prefix-list DC_X_LOCAL_SUBNET seq 10 permit 10.1.254.0/24 ge 24
ip prefix-list DC_Y_LOCAL_SUBNET seq 5 deny 10.2.254.1/32
ip prefix-list DC_Y_LOCAL_SUBNET seq 10 permit 10.2.254.0/24 ge 24
ip prefix-list SUPRESS_SUBNET seq 5 deny 10.1.254.1/32
ip prefix-list SUPRESS_SUBNET seq 10 permit 10.1.254.0/26 ge 32
ip prefix-list EXPORT_SPINE_SUBNET seq 5 permit 10.1.254.1/32
ip prefix-list EXPORT_SPINE_SUBNET seq 10 permit 10.2.254.0/24
!
route-map ADV_LO permit 5
 match interface lo
 set origin igp
exit
!
route-map EXPORT_AS65930 permit 5
 match ip address prefix-list DC_X_LOCAL_SUBNET
exit
!
route-map IMPORT_AS65930 permit 5
 match ip address prefix-list DC_Y_LOCAL_SUBNET
exit
!
route-map ACCEPT_SUPRESS permit 5
 match ip address prefix-list SUPRESS_SUBNET
exit
!
route-map EXPORT_SPINE permit 5
 match ip address prefix-list DC_Y_LOCAL_SUBNET
exit
!
route-map EXPORT_SPINE permit 10
 match ip address prefix-list EXPORT_SPINE_SUBNET
exit
!
end

SPINEの設定

BGWおよびLEAFとBGPでアンダーレイNWを構成するためのloインターフェイスのアドレスの経路情報の交換を行っているのみです。

RT-S-X-01
!
frr version 8.4.1_git
frr defaults datacenter
hostname RT-S-X-01
log syslog informational
no ipv6 forwarding
service integrated-vtysh-config
!
interface lo
 ip address 10.1.254.11/32
exit
!
router bgp 65110
 bgp router-id 10.1.254.11
 no bgp default ipv4-unicast
 bgp bestpath as-path multipath-relax
 neighbor LEAF peer-group
 neighbor LEAF remote-as external
 neighbor LEAF bfd
 neighbor LEAF timers connect 5
 neighbor BGW peer-group
 neighbor BGW remote-as external
 neighbor BGW bfd
 neighbor BGW timers connect 5
 neighbor eth1 interface peer-group LEAF
 neighbor eth2 interface peer-group LEAF
 neighbor eth3 interface peer-group LEAF
 neighbor eth4 interface peer-group LEAF
 neighbor eth5 interface peer-group BGW
 !
 address-family ipv4 unicast
  network 10.1.254.11/32
  neighbor LEAF activate
  neighbor BGW activate
  neighbor BGW route-map ACCEPT_DC_LOCAL in
  neighbor BGW route-map ACCEPT_DC_LOCAL out
  maximum-paths 64
 exit-address-family
exit
!
ip prefix-list DC_LOCAL_SUBNET seq 5 permit 10.1.254.0/24 ge 24
ip prefix-list DC_LOCAL_SUBNET seq 10 permit 10.2.254.0/24 ge 24
!
route-map ACCEPT_DC_LOCAL permit 5
 match ip address prefix-list DC_LOCAL_SUBNET
exit
!
end

LEAFの設定

SPINEとはloインターフェイスのアドレスの交換を行い、SERVERにはデフォルトルートを送る設定となっています。
BGWとはloインターフェイス間でEVPNによる経路情報の交換を行っています。

vni1010を収容するVXLANセグメントをEVPNで交換する設定となっています。advertise-all-vniはEVPNを有効化するために必要とされるコマンドです。
また、advertise-svi-ipにより、Route Type2でローカルVTEPに関連づけられたSVIのMAC/IPペアを広報できるようになっています。
VNI1010で広報される経路にはRoute Targetに65100:1010が付与され、受け入れる経路としては65100:101065200:1010が設定されています。

router bgp 65121
 address-family l2vpn evpn
  neighbor EVPN activate
  advertise-all-vni
  vni 1010
   route-target import 65100:1010
   route-target import 65200:1010
   route-target export 65100:1010
  exit-vni
  advertise-svi-ip
 exit-address-family

advertise ipv4 unicastはRoute Type 5でEVPNピアに対して広報を行うことができます。

router bgp 65121 vrf l3vni-3000
 address-family l2vpn evpn
  advertise ipv4 unicast
  route-target import 65100:3000
  route-target import 65200:3000
  route-target export 65100:3000
 exit-address-family
RT-L-X-01
!
frr version 8.4.1_git
frr defaults datacenter
hostname RT-L-X-01
log syslog informational
no ipv6 forwarding
!
vrf l3vni-3000
 vni 3000
exit-vrf
!
interface lo
 ip address 10.1.254.21/32
exit
!
router bgp 65121
 bgp router-id 10.1.254.21
 no bgp default ipv4-unicast
 bgp bestpath as-path multipath-relax
 neighbor EVPN peer-group
 neighbor EVPN remote-as external
 neighbor EVPN ebgp-multihop 3
 neighbor EVPN update-source lo
 neighbor SPINE peer-group
 neighbor SPINE remote-as external
 neighbor SPINE bfd
 neighbor SPINE timers connect 5
 neighbor SPINE capability extended-nexthop
 neighbor 10.1.254.1 peer-group EVPN
 neighbor eth1 interface peer-group SPINE
 neighbor eth2 interface peer-group SPINE
 !
 address-family ipv4 unicast
  network 10.1.254.21/32
  neighbor SPINE activate
 exit-address-family
 !
 address-family l2vpn evpn
  neighbor EVPN activate
  advertise-all-vni
  vni 1010
   route-target import 65100:1010
   route-target import 65200:1010
   route-target export 65100:1010
  exit-vni
  advertise-svi-ip
 exit-address-family
exit
!
router bgp 65121 vrf l3vni-3000
 bgp router-id 10.1.254.21
 neighbor SERVERS peer-group
 neighbor SERVERS remote-as external
 bgp listen limit 20
 bgp listen range 192.168.10.240/28 peer-group SERVERS
 !
 address-family ipv4 unicast
  redistribute connected
  neighbor SERVERS default-originate
  neighbor SERVERS route-map ADVERTISE_DEFONLY out
 exit-address-family
 !
 address-family l2vpn evpn
  advertise ipv4 unicast
  route-target import 65100:3000
  route-target import 65200:3000
  route-target export 65100:3000
 exit-address-family
exit
!
ip prefix-list DEFONLY seq 5 permit 0.0.0.0/0
!
route-map ADVERTISE_DEFONLY permit 5
 match ip address prefix-list DEFONLY
exit
!
end

Serverの設定

LEAFとBGPピアを張り、デフォルトルートを受け取る構成となっています。

SV-01
!
frr version 8.4.1_git
frr defaults datacenter
hostname SV-01
log syslog informational
no ipv6 forwarding
service integrated-vtysh-config
!
router bgp 65131
 bgp router-id 192.168.10.241
 no bgp default ipv4-unicast
 neighbor LEAF peer-group
 neighbor LEAF remote-as external
 neighbor 192.168.10.251 peer-group LEAF
 !
 address-family ipv4 unicast
  neighbor LEAF activate
 exit-address-family
exit
!
end

確認内容

すべてRT-L-X-01を対象としてコマンドやキャプチャを行った結果から動作を確認していきます。

EVPNから受け取っている経路

RT-L-X-02から受け取っているEVPNの経路について詳しく見ていきたいと思います。
Route Type2, 3, 5が広報されていることが確認できると思います。
Route Type2で広報されているのは、RT-L-X-02のSVIのMAC/IPアドレスとぶら下がっているServerのMACアドレスです。
Route Type3で広報されているのは、BUMの転送先としてのリモートVTEPのIPアドレスです。
Route Type5で広報されているのは、192.168.10.240/28の経路を広報しています。

RT-L-X-01# show bgp l2vpn evpn         
BGP table version is 2, local router ID is 10.1.254.21
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal
Origin codes: i - IGP, e - EGP, ? - incomplete
EVPN type-1 prefix: [1]:[EthTag]:[ESI]:[IPlen]:[VTEP-IP]:[Frag-id]
EVPN type-2 prefix: [2]:[EthTag]:[MAClen]:[MAC]:[IPlen]:[IP]
EVPN type-3 prefix: [3]:[EthTag]:[IPlen]:[OrigIP]
EVPN type-4 prefix: [4]:[ESI]:[IPlen]:[OrigIP]
EVPN type-5 prefix: [5]:[EthTag]:[IPlen]:[IP]

   Network          Next Hop            Metric LocPrf Weight Path
Route Distinguisher: 10.1.254.22:2
*> [2]:[0]:[48]:[aa:bb:cc:10:11:22]:[32]:[192.168.10.252]
                    10.1.254.22(RT-BGW-01)
                                                           0 65100 65122 i
                    RT:65100:1010 RT:65100:3000 ET:8 Rmac:aa:bb:cc:10:30:22
*> [2]:[0]:[48]:[aa:bb:cc:10:11:32]
                    10.1.254.22(RT-BGW-01)
                                                           0 65100 65122 i
                    RT:65100:1010 ET:8
*> [3]:[0]:[32]:[10.1.254.22]
                    10.1.254.22(RT-BGW-01)
                                                           0 65100 65122 i
                    RT:65100:1010 ET:8
Route Distinguisher: 10.1.254.22:3
*> [5]:[0]:[28]:[192.168.10.240]
                    10.1.254.22(RT-BGW-01)
                                                           0 65100 65122 ?
                    RT:65100:3000 ET:8 Rmac:aa:bb:cc:10:30:22
EVPN All Route
RT-L-X-01# show bgp l2vpn evpn route 
BGP table version is 2, local router ID is 10.1.254.21
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal
Origin codes: i - IGP, e - EGP, ? - incomplete
EVPN type-1 prefix: [1]:[EthTag]:[ESI]:[IPlen]:[VTEP-IP]:[Frag-id]
EVPN type-2 prefix: [2]:[EthTag]:[MAClen]:[MAC]:[IPlen]:[IP]
EVPN type-3 prefix: [3]:[EthTag]:[IPlen]:[OrigIP]
EVPN type-4 prefix: [4]:[ESI]:[IPlen]:[OrigIP]
EVPN type-5 prefix: [5]:[EthTag]:[IPlen]:[IP]

   Network          Next Hop            Metric LocPrf Weight Path
                    Extended Community
Route Distinguisher: 10.1.254.21:2
*> [2]:[0]:[48]:[aa:bb:cc:10:11:31]
                    10.1.254.21(RT-L-X-01)
                                                       32768 i
                    ET:8 RT:65100:1010
*> [3]:[0]:[32]:[10.1.254.21]
                    10.1.254.21(RT-L-X-01)
                                                       32768 i
                    ET:8 RT:65100:1010
Route Distinguisher: 10.1.254.21:3
*> [5]:[0]:[28]:[192.168.10.240]
                    10.1.254.21(RT-L-X-01)
                                             0         32768 ?
                    ET:8 RT:65100:3000 Rmac:aa:bb:cc:10:30:21
Route Distinguisher: 10.1.254.22:2
*> [2]:[0]:[48]:[aa:bb:cc:10:11:22]:[32]:[192.168.10.252]
                    10.1.254.22(RT-BGW-01)
                                                           0 65100 65122 i
                    RT:65100:1010 RT:65100:3000 ET:8 Rmac:aa:bb:cc:10:30:22
*> [2]:[0]:[48]:[aa:bb:cc:10:11:32]
                    10.1.254.22(RT-BGW-01)
                                                           0 65100 65122 i
                    RT:65100:1010 ET:8
*> [3]:[0]:[32]:[10.1.254.22]
                    10.1.254.22(RT-BGW-01)
                                                           0 65100 65122 i
                    RT:65100:1010 ET:8
Route Distinguisher: 10.1.254.22:3
*> [5]:[0]:[28]:[192.168.10.240]
                    10.1.254.22(RT-BGW-01)
                                                           0 65100 65122 ?
                    RT:65100:3000 ET:8 Rmac:aa:bb:cc:10:30:22
Route Distinguisher: 10.1.254.23:2
*> [2]:[0]:[48]:[aa:bb:cc:10:22:33]
                    10.1.254.23(RT-BGW-01)
                                                           0 65100 65123 i
                    RT:65100:1020 ET:8
*> [3]:[0]:[32]:[10.1.254.23]
                    10.1.254.23(RT-BGW-01)
                                                           0 65100 65123 i
                    RT:65100:1020 ET:8
Route Distinguisher: 10.1.254.23:3
*> [5]:[0]:[28]:[192.168.20.240]
                    10.1.254.23(RT-BGW-01)
                                                           0 65100 65123 ?
                    RT:65100:3000 ET:8 Rmac:aa:bb:cc:10:30:23
Route Distinguisher: 10.1.254.24:2
*> [2]:[0]:[48]:[aa:bb:cc:10:12:24]:[32]:[192.168.20.252]
                    10.1.254.24(RT-BGW-01)
                                                           0 65100 65124 i
                    RT:65100:1020 RT:65100:3000 ET:8 Rmac:aa:bb:cc:10:30:24
*> [2]:[0]:[48]:[aa:bb:cc:10:22:34]
                    10.1.254.24(RT-BGW-01)
                                                           0 65100 65124 i
                    RT:65100:1020 ET:8
*> [2]:[0]:[48]:[aa:c1:ab:b7:03:2a]
                    10.1.254.24(RT-BGW-01)
                                                           0 65100 65124 i
                    RT:65100:1020 ET:8
*> [3]:[0]:[32]:[10.1.254.24]
                    10.1.254.24(RT-BGW-01)
                                                           0 65100 65124 i
                    RT:65100:1020 ET:8
Route Distinguisher: 10.1.254.24:3
*> [5]:[0]:[28]:[192.168.20.240]
                    10.1.254.24(RT-BGW-01)
                                                           0 65100 65124 ?
                    RT:65100:3000 ET:8 Rmac:aa:bb:cc:10:30:24
Route Distinguisher: 10.2.254.21:2
*> [2]:[0]:[48]:[aa:bb:cc:20:11:21]:[32]:[192.168.10.253]
                    10.2.254.21(RT-BGW-01)
                                                           0 65100 65200 65221 i
                    RT:65200:1010 RT:65200:3000 ET:8 Rmac:aa:bb:cc:20:30:21
*> [2]:[0]:[48]:[aa:bb:cc:20:11:35]
                    10.2.254.21(RT-BGW-01)
                                                           0 65100 65200 65221 i
                    RT:65200:1010 ET:8
*> [3]:[0]:[32]:[10.2.254.21]
                    10.2.254.21(RT-BGW-01)
                                                           0 65100 65200 65221 i
                    RT:65200:1010 ET:8
Route Distinguisher: 10.2.254.21:3
*> [5]:[0]:[28]:[192.168.10.240]
                    10.2.254.21(RT-BGW-01)
                                                           0 65100 65200 65221 ?
                    RT:65200:3000 ET:8 Rmac:aa:bb:cc:20:30:21
Route Distinguisher: 10.2.254.22:2
*> [2]:[0]:[48]:[aa:bb:cc:20:11:22]:[32]:[192.168.10.254]
                    10.2.254.22(RT-BGW-01)
                                                           0 65100 65200 65222 i
                    RT:65100:1010 RT:65100:3000 ET:8 Rmac:aa:bb:cc:20:30:22
*> [2]:[0]:[48]:[aa:bb:cc:20:11:36]
                    10.2.254.22(RT-BGW-01)
                                                           0 65100 65200 65222 i
                    RT:65100:1010 ET:8
*> [3]:[0]:[32]:[10.2.254.22]
                    10.2.254.22(RT-BGW-01)
                                                           0 65100 65200 65222 i
                    RT:65100:1010 ET:8
Route Distinguisher: 10.2.254.23:2
*> [2]:[0]:[48]:[aa:bb:cc:20:12:23]:[32]:[192.168.20.253]
                    10.2.254.23(RT-BGW-01)
                                                           0 65100 65200 65223 i
                    RT:65200:1020 RT:65200:3000 ET:8 Rmac:aa:bb:cc:20:30:23
*> [2]:[0]:[48]:[aa:bb:cc:20:22:37]
                    10.2.254.23(RT-BGW-01)
                                                           0 65100 65200 65223 i
                    RT:65200:1020 ET:8
*> [3]:[0]:[32]:[10.2.254.23]
                    10.2.254.23(RT-BGW-01)
                                                           0 65100 65200 65223 i
                    RT:65200:1020 ET:8
Route Distinguisher: 10.2.254.24:2
*> [2]:[0]:[48]:[aa:bb:cc:20:12:24]:[32]:[192.168.20.254]
                    10.2.254.24(RT-BGW-01)
                                                           0 65100 65200 65224 i
                    RT:65200:1020 RT:65200:3000 ET:8 Rmac:aa:bb:cc:20:30:24
*> [2]:[0]:[48]:[aa:bb:cc:20:22:38]
                    10.2.254.24(RT-BGW-01)
                                                           0 65100 65200 65224 i
                    RT:65200:1020 ET:8
*> [3]:[0]:[32]:[10.2.254.24]
                    10.2.254.24(RT-BGW-01)
                                                           0 65100 65200 65224 i
                    RT:65200:1020 ET:8
Route Distinguisher: 10.2.254.24:3
*> [5]:[0]:[28]:[192.168.20.240]
                    10.2.254.24(RT-BGW-01)
                                                           0 65100 65200 65224 ?
                    RT:65200:3000 ET:8 Rmac:aa:bb:cc:20:30:24
Route Distinguisher: 192.168.10.254:3
*> [5]:[0]:[28]:[192.168.10.240]
                    10.2.254.22(RT-BGW-01)
                                                           0 65100 65200 65222 ?
                    RT:65100:3000 ET:8 Rmac:aa:bb:cc:20:30:22
Route Distinguisher: 192.168.20.253:3
*> [5]:[0]:[28]:[192.168.20.240]
                    10.2.254.23(RT-BGW-01)
                                                           0 65100 65200 65223 ?
                    RT:65200:3000 ET:8 Rmac:aa:bb:cc:20:30:23

Displayed 31 prefixes (31 paths)

EVPNでのBGP UPDATEメッセージ

Route Type 2

このUPDATEメッセージではL2VNI1010に所属しているMACアドレスaa:bb:cc:10:11:32についてNexhop10.1.254.22に転送を行うようにするものです。
aa:bb:cc:10:11:32はSV-02のMACアドレスであり、SV-02が接続しているLEAFはRT-L-X-02のため10.1.254.22になります。
このメッセージがEVPNにおけるMACアドレスの広報にあたり、L2VPNのための重要な情報になります
card

このUPDATEメッセージではL2VNI1010とL3VNI3000に所属しているVTEPのMACアドレスaa:bb:cc:10:11:22とIPアドレス192.168.10.252についてのメッセージです。
これはIRB(またはSVI)についているMACアドレスとIPアドレスを広報することを目的としています。これは、VXLANルーティングを行うL3VPNのゲートウェイに必要であったり、MACアドレスとIPアドレスのテーブルを持てることにより、ARP-Suppressionを行うことができARP RequestのBroadcastを抑制することができます。

card

Route Type 3

VTEP10.1.254.22にVNI1010があることを表す
BUMトラフィックはTunnel Typeが示す通りIngress Replicationで各VTEP宛のユニキャストとして送信されます
card

Route Type 5

L3VNI3000でIP Prefix192.168.10.240/28を広報していることがわかります
card

フォワーディングテーブル

フォワーディングテーブルを見てるとL3VNIとL2VNIついて以下の内容があることがわかります。
L3VNIについては、VXLANインターフェイスのvni3000からそれぞれのリモートVTEPのIPアドレスに向けてMACアドレスとIPアドレスのペアができていることがわかります。
L3VNIにMACアドレスがついているのは、L3VNIで繋がっているVTEPのIRB同士を繋げるためで、VXLANカプセリングをした際のMACアドレスとして使用するためです。
L2VNIについては、VXLANインターフェイスのvni1010からそれぞれのServerのMACアドレスとVTEPアドレスのペアができていることがわかります。
MACアドレスがブロードキャストアドレスになっているのはRoute Type 3で広報されたBUM通信における転送先のVTEPアドレスとしテーブルに載っています。

bash-5.1# bridge fdb show
                              ~ 省略 ~
aa:bb:cc:10:30:24 dev vni3000 dst 10.1.254.24 self extern_learn 
aa:bb:cc:10:30:23 dev vni3000 dst 10.1.254.23 self extern_learn 
aa:bb:cc:10:30:22 dev vni3000 dst 10.1.254.22 self extern_learn 
aa:bb:cc:20:30:24 dev vni3000 dst 10.2.254.24 self extern_learn 
aa:bb:cc:20:30:23 dev vni3000 dst 10.2.254.23 self extern_learn 
aa:bb:cc:20:30:22 dev vni3000 dst 10.2.254.22 self extern_learn 
aa:bb:cc:20:30:21 dev vni3000 dst 10.2.254.21 self extern_learn 
                              ~ 省略 ~
00:00:00:00:00:00 dev vni1010 dst 10.1.254.22 self permanent
00:00:00:00:00:00 dev vni1010 dst 10.2.254.21 self permanent
00:00:00:00:00:00 dev vni1010 dst 10.2.254.22 self permanent
aa:bb:cc:10:11:32 dev vni1010 dst 10.1.254.22 self extern_learn 
aa:bb:cc:20:11:36 dev vni1010 dst 10.2.254.22 self extern_learn 
aa:bb:cc:20:11:35 dev vni1010 dst 10.2.254.21 self extern_learn 
aa:bb:cc:10:11:22 dev vni1010 dst 10.1.254.22 self extern_learn 
aa:bb:cc:20:11:22 dev vni1010 dst 10.2.254.22 self extern_learn 
aa:bb:cc:20:11:21 dev vni1010 dst 10.2.254.21 self extern_learn 
                              ~ 省略 ~

ルーティングテーブル

次にルーティングテーブルを見ていきます。

アンダーレイNWのための経路情報のやりとりを行なっているvrf defaultと、EVPNによる経路交換で得た異なるネットワークへの経路を持っているvrf l3vni-3000があります。
vrf defaultはすべての経路についてECMPを取っており、これはIP CLOS構成のデータセンターネットワークに倣っています。
別サイトの到達性の確保のため、別サイトのloインターフェイスのIPアドレスについても集約された状態で経路情報を受け取っています。
vrf l3vni-3000はEVPN/VXLANでのL2VPN, L3VPNの経路情報を保持しています。

RT-L-X-01# show ip route vrf all 
Codes: K - kernel route, C - connected, S - static, R - RIP,
       O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP,
       T - Table, v - VNC, V - VNC-Direct, A - Babel, F - PBR,
       f - OpenFabric,
       > - selected route, * - FIB route, q - queued, r - rejected, b - backup
       t - trapped, o - offload failure

VRF default:
B>* 10.1.254.1/32 [20/0] via fe80::a8c1:abff:fe0c:9cc6, eth1, weight 1, 01:01:37
  *                      via fe80::a8c1:abff:fefb:4639, eth2, weight 1, 01:01:37
B>* 10.1.254.11/32 [20/0] via fe80::a8c1:abff:fe0c:9cc6, eth1, weight 1, 01:01:37
B>* 10.1.254.12/32 [20/0] via fe80::a8c1:abff:fefb:4639, eth2, weight 1, 01:01:38
C>* 10.1.254.21/32 is directly connected, lo, 01:01:43
B>* 10.1.254.22/32 [20/0] via fe80::a8c1:abff:fe0c:9cc6, eth1, weight 1, 01:01:37
  *                       via fe80::a8c1:abff:fefb:4639, eth2, weight 1, 01:01:37
B>* 10.1.254.23/32 [20/0] via fe80::a8c1:abff:fe0c:9cc6, eth1, weight 1, 01:01:37
  *                       via fe80::a8c1:abff:fefb:4639, eth2, weight 1, 01:01:37
B>* 10.1.254.24/32 [20/0] via fe80::a8c1:abff:fe0c:9cc6, eth1, weight 1, 01:01:37
  *                       via fe80::a8c1:abff:fefb:4639, eth2, weight 1, 01:01:37
B>* 10.2.254.0/24 [20/0] via fe80::a8c1:abff:fe0c:9cc6, eth1, weight 1, 01:01:37
  *                      via fe80::a8c1:abff:fefb:4639, eth2, weight 1, 01:01:37
C>* 172.20.20.0/24 is directly connected, eth0, 01:01:43

VRF l3vni-3000:
C>* 192.168.10.240/28 is directly connected, br10, 01:01:43
B>* 192.168.10.252/32 [20/0] via 10.1.254.22, br3000 onlink, weight 1, 01:01:36
B>* 192.168.10.253/32 [20/0] via 10.2.254.21, br3000 onlink, weight 1, 01:01:36
B>* 192.168.10.254/32 [20/0] via 10.2.254.22, br3000 onlink, weight 1, 01:01:36
B>* 192.168.20.240/28 [20/0] via 10.1.254.23, br3000 onlink, weight 1, 01:01:35
  *                          via 10.1.254.24, br3000 onlink, weight 1, 01:01:35
B>* 192.168.20.252/32 [20/0] via 10.1.254.24, br3000 onlink, weight 1, 01:01:36
B>* 192.168.20.253/32 [20/0] via 10.2.254.23, br3000 onlink, weight 1, 01:01:36
B>* 192.168.20.254/32 [20/0] via 10.2.254.24, br3000 onlink, weight 1, 01:01:36

トラフィックの流れ

L2VNI

L2VNIでは、SV-01から同一サイトのSV-02宛と異サイトのSV-05宛にPingを実施し、トラフィックの流れを追ってみたいと思います。

同じサイト(SV-01〜SV-02)

Pingも正常に通っているようです。
実際はLeaf-Spine間を通ることでTTLは減少するはずですが、VXLANでカプセル化されているため内側のIPパケットのTTLが減少せず、TTLが初期値の64のままになっているようです。

bash-5.1# ping -c 5 192.168.10.242 
PING 192.168.10.242 (192.168.10.242): 56 data bytes
64 bytes from 192.168.10.242: seq=0 ttl=64 time=0.612 ms
64 bytes from 192.168.10.242: seq=1 ttl=64 time=0.707 ms
64 bytes from 192.168.10.242: seq=2 ttl=64 time=0.529 ms
64 bytes from 192.168.10.242: seq=3 ttl=64 time=0.477 ms
64 bytes from 192.168.10.242: seq=4 ttl=64 time=0.517 ms

--- 192.168.10.242 ping statistics ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max = 0.477/0.568/0.707 ms
bash-5.1# traceroute 192.168.10.242
traceroute to 192.168.10.242 (192.168.10.242), 30 hops max, 46 byte packets
 1  192.168.10.242 (192.168.10.242)  0.016 ms  0.025 ms  0.012 ms

パケットキャプチャからもVXLANでカプセル化されておりVNI:1010が付与されていることが確認できます。
card

card

異なるサイト(SV-01〜SV-05)

異なるサイトに向けてのPingでも同様の結果が得られました。

bash-5.1# ping -c 5 192.168.10.243
PING 192.168.10.243 (192.168.10.243): 56 data bytes
64 bytes from 192.168.10.243: seq=0 ttl=64 time=2.665 ms
64 bytes from 192.168.10.243: seq=1 ttl=64 time=0.568 ms
64 bytes from 192.168.10.243: seq=2 ttl=64 time=0.699 ms
64 bytes from 192.168.10.243: seq=3 ttl=64 time=0.941 ms
64 bytes from 192.168.10.243: seq=4 ttl=64 time=0.729 ms

--- 192.168.10.243 ping statistics ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max = 0.568/1.120/2.665 ms
bash-5.1# traceroute 192.168.10.243
traceroute to 192.168.10.243 (192.168.10.243), 30 hops max, 46 byte packets
 1  192.168.10.243 (192.168.10.243)  0.021 ms  0.024 ms  0.010 ms

card

L3VNI

L3VNIでは、SV-01から同一サイトのSV-03宛と異サイトのSV-07宛にPingを実施し、トラフィックの流れを追ってみたいと思います。

同じサイト(SV-01〜SV-03)

tracerouteの結果より、SV-01のデフォルトゲートウェイの192.168.10.251を経由し、SV-03と接続しているLeafのIRB(SVI)の192.168.20.251まで転送されることでSV-03に到達してます。

bash-5.1# ping -c 5 192.168.20.241
PING 192.168.20.241 (192.168.20.241): 56 data bytes
64 bytes from 192.168.20.241: seq=0 ttl=62 time=0.848 ms
64 bytes from 192.168.20.241: seq=1 ttl=62 time=0.573 ms
64 bytes from 192.168.20.241: seq=2 ttl=62 time=0.456 ms
64 bytes from 192.168.20.241: seq=3 ttl=62 time=0.803 ms
64 bytes from 192.168.20.241: seq=4 ttl=62 time=0.321 ms

--- 192.168.20.241 ping statistics ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max = 0.321/0.600/0.848 ms
bash-5.1# traceroute 192.168.20.241
traceroute to 192.168.20.241 (192.168.20.241), 30 hops max, 46 byte packets
 1  192.168.10.251 (192.168.10.251)  0.017 ms  0.015 ms  0.004 ms
 2  192.168.20.251 (192.168.20.251)  0.004 ms  0.011 ms  0.005 ms
 3  192.168.20.241 (192.168.20.241)  0.005 ms  0.030 ms  0.012 ms

RT-L-X-01が192.168.20.240/28のネットワークに対して、ルーティングテーブルからネクストホップを選択しています。その際、以下のパケットキャプチャからわかるようにL3VNI:3000が使用されています
card
SV-03につながっているRT-L-X-03のeth3のパケットキャプチャを見てみると、VNI:3000で到着したパケットはIRB(SVI)を通った後、SV-03に通信が届いていることが確認できます。
card

異なるサイト(SV-01〜SV-07)

異なるサイトでも同様につながっていることが確認できます。

bash-5.1# ping -c 5 192.168.20.243
PING 192.168.20.243 (192.168.20.243): 56 data bytes
64 bytes from 192.168.20.243: seq=0 ttl=62 time=3.973 ms
64 bytes from 192.168.20.243: seq=1 ttl=62 time=0.162 ms
64 bytes from 192.168.20.243: seq=2 ttl=62 time=0.931 ms
64 bytes from 192.168.20.243: seq=3 ttl=62 time=0.341 ms
64 bytes from 192.168.20.243: seq=4 ttl=62 time=0.708 ms

--- 192.168.20.243 ping statistics ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max = 0.162/1.223/3.973 ms
bash-5.1# traceroute 192.168.20.243
traceroute to 192.168.20.243 (192.168.20.243), 30 hops max, 46 byte packets
 1  192.168.10.251 (192.168.10.251)  0.011 ms  0.016 ms  0.004 ms
 2  192.168.20.251 (192.168.20.251)  0.006 ms  0.022 ms  0.010 ms
 3  192.168.20.243 (192.168.20.243)  0.010 ms  0.022 ms  0.020 ms

先ほどと同様に、ルーティングテーブルに従ってRT-L-X-03のVTEPまでL3VNI:3000で転送されています。
card

しかし、RT-L-X-03に宛先のServerがぶら下がっていないので、VRFでつながっているL3VNIとL2VNI:1020の間で転送されて、目的のServerがあるRT-L-Y-03まで運ばれているのがわかる。
card

Discussion