EVPN/VXLAN -実践編-
構成概要
NW構成図
今回の環境はContanerlabを使用して構築しています。
構成したネットワークは以下のようになっています。
データセンター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:1010
と65200: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のための重要な情報になります
この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を抑制することができます。
Route Type 3
VTEP10.1.254.22
にVNI1010
があることを表す
BUMトラフィックはTunnel Typeが示す通りIngress Replication
で各VTEP宛のユニキャストとして送信されます
Route Type 5
L3VNI3000
でIP Prefix192.168.10.240/28
を広報していることがわかります
フォワーディングテーブル
フォワーディングテーブルを見てると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が付与されていることが確認できます。
異なるサイト(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
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が使用されています
SV-03につながっているRT-L-X-03のeth3のパケットキャプチャを見てみると、VNI:3000で到着したパケットはIRB(SVI)を通った後、SV-03に通信が届いていることが確認できます。
異なるサイト(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で転送されています。
しかし、RT-L-X-03に宛先のServerがぶら下がっていないので、VRFでつながっているL3VNIとL2VNI:1020の間で転送されて、目的のServerがあるRT-L-Y-03まで運ばれているのがわかる。
Discussion