在學習EVPN、VXLAN過程中遇到些問題,一直沒能解決,看視頻、啃資料也沒能解答心中的疑惑。究其原因,主要是沒有實驗環境來驗證。
前幾天和湯老師嘮嗑,他說最新版的VSR支持EVPN、VXLAN功能了。出於好奇,就搭建了個一套環境,測試了下,暫時沒發現什麼大的問題。今天我們來驗證下BGP EVPN方式部署分布式網關同子網的場景。
需求:
在分布式網關場景中,通過BGP EVPN方式動態建立VXLAN隧道,來實現同網段主機的相互訪問
拓撲環境:
原理:
首先,S1與S3之間建立BGP EVPN鄰居,然後在S1、S3分別創建二層VSI,關聯VXLAN ID,同時,配置本地的 Route-distinguisher及出方向的VPN-Target,入方向的VPN-Target。配置完成後,S1和S2會生成BGP EVPN路由發送給對端,該路由攜帶本地的VSI下的Route-distinguisher、出方向的VPN-Target和BGP EVPN協議新定義的Type3路由即Inclusive Multicast路由。
S1和S2收到對端發送過來的BGP EVPN路由後,首先檢查該路由攜帶的VSI實例下的出方向VPN-Target,如果與本端VSI實例的入方向VPN-Target相等,則接收該路由,否則丟棄該路由。在接收該路由後,Leaf1和Leaf2將獲取其中攜帶的對端VTEP IP位址和二層VNI,如果對端VTEP IP位址是三層路由可達的,則建立一條到對端的VXLAN隧道;同時,如果對端二層VNI與本端相同,則創建一個頭端複製表,用於後續BUM(Broadcast&Unknown-unicast&Multicast)報文轉發。
BGP EVPN type 3路由格式如下:
由前綴和PMSI屬性組成
抓包信息:
主要配置:
S1配置
#
ip vpn-instance vpna
route-distinguisher 1:2
#
address-family ipv4
vpn-target 5000:1 1000:1 import-extcommunity
vpn-target 5000:1 1000:1 export-extcommunity
#
address-family evpn
vpn-target 300:1 import-extcommunity
vpn-target 300:1 export-extcommunity
l2vpn enable
#
vsi vpna
gateway vsi-interface 1
vxlan 10
evpn encapsulation vxlan
route-distinguisher 1:1
vpn-target 10:1 export-extcommunity
vpn-target 10:1 import-extcommunity
#
interface LoopBack0
ip address 1.1.1.1 255.255.255.255
#
interface GigabitEthernet1/0
description link_management
ip address 192.168.1.5 255.255.255.0
#
interface GigabitEthernet2/0
description link_to_servera
xconnect vsi vpna
#
interface GigabitEthernet3/0
description link_to_s2
ip address 12.1.1.1 255.255.255.0
#
interface Vsi-interface1
ip binding vpn-instance vpna
ip address 192.168.2.254 255.255.255.0
distributed-gateway local
#
interface Vsi-interface3
ip binding vpn-instance vpna
l3-vni 2000
#
bgp 200
peer 3.3.3.3 as-number 200
peer 3.3.3.3 connect-interface LoopBack0
#
address-family ipv4 unicast
peer 3.3.3.3 enable
#
address-family l2vpn evpn
peer 3.3.3.3 enable
S2隻涉及路由配置,這裡省略
S3主要配置:
sysname S3
#
ip vpn-instance vpna
route-distinguisher 1:2
#
address-family ipv4
vpn-target 1000:1 import-extcommunity
vpn-target 1000:1 export-extcommunity
#
address-family evpn
vpn-target 400:1 300:1 import-extcommunity
vpn-target 400:1 300:1 export-extcommunity
#
vsi vpna
gateway vsi-interface 1
vxlan 10
evpn encapsulation vxlan
route-distinguisher 1:2
vpn-target 10:1 export-extcommunity
vpn-target 10:1 30:1 import-extcommunity
#
interface LoopBack0
ip address 3.3.3.3 255.255.255.255
#
interface LoopBack11
ip binding vpn-instance vpna
ip address 11.11.11.11 255.255.255.255
#
interface GigabitEthernet1/0
description link_management
ip address 192.168.1.7 255.255.255.0
#
interface GigabitEthernet2/0
description link_to_s2
ip address 23.1.1.3 255.255.255.0
#
interface GigabitEthernet3/0
description link_to_serverb
xconnect vsi vpna
#
interface Vsi-interface1
ip binding vpn-instance vpna
ip address 192.168.2.254 255.255.255.0
distributed-gateway local
#
interface Vsi-interface3
ip binding vpn-instance vpna
l3-vni 2000
#
bgp 200
peer 1.1.1.1 as-number 200
peer 1.1.1.1 connect-interface LoopBack0
#
address-family ipv4 unicast
peer 1.1.1.1 enable
#
address-family l2vpn evpn
peer 1.1.1.1 enable
#
ip vpn-instance vpna
#
address-family ipv4 unicast
import-route direct
import-route static
#配置完成後查看S1上的BGP EVPN路由信息,可以看到type 2類,3類和5類
#查看type 3類路由明細信息
#查看自動生成的VXLAN 隧道信息
#查看S1上的路由
#查看S1上學習的mac地址信息
驗證:
#PCA ping訪問PCB,是可以實現互訪的
#抓包信息中可以看到二層互訪時,封裝的VXLAN值為二層VNI的值
學習過程中遇到的問題是對於分布式網關二層互訪,本端生成的BGP EVPN type 3類路由發送給對端時究竟攜帶的是哪個RT值,對端接收時會根據哪個RT值做路由取捨,是二層VNI下的RT值,還是三層vpn實例下evpn的RT值?還是說兩個RT值都會參與?這裡我們做個簡單的測試:
測試一:
#修改兩端三層VPN實例下EVPN的RT值,使得兩端設備的RT值均不一致,兩端VSI下的RT值一致,看能否實現互訪,修改後路由能否學習到,mac地址能否學習到?
修改後的主要配置如下:
S1配置:
ip vpn-instance vpna
route-distinguisher 1:2
#
address-family ipv4
vpn-target 5000:1 1000:1 import-extcommunity
vpn-target 5000:1 1000:1 export-extcommunity
#
address-family evpn
vpn-target 300:1 import-extcommunity
vpn-target 300:1 export-extcommunity
#
vsi vpna
gateway vsi-interface 1
vxlan 10
evpn encapsulation vxlan
route-distinguisher 1:1
vpn-target 10:1 export-extcommunity
vpn-target 10:1 import-extcommunity
S3配置:
ip vpn-instance vpna
route-distinguisher 1:2
#
address-family ipv4
vpn-target 1000:1 import-extcommunity
vpn-target 1000:1 export-extcommunity
#
address-family evpn
vpn-target 400:1 import-extcommunity
vpn-target 400:1 export-extcommunity
#
vsi vpna
gateway vsi-interface 1
vxlan 10
evpn encapsulation vxlan
route-distinguisher 1:2
vpn-target 10:1 export-extcommunity
vpn-target 10:1 30:1 import-extcommunity
#為了保證接口的準確性,我們reset下兩端bgp的鄰居關係
reset bgp all
Reset BGP sessions? [Y/N]:y
reset bgp all
Reset BGP sessions? [Y/N]:y
#PCA ping訪問PCB,發現是可以正常互訪的
#查看S1上的路由條目,發現已經學習不到對端的32位主機路由了,但是mac地址依然能夠學習到
#同理,查看S3上的主機路由條目,發現也學習不到對端的32位主機路由了,mac地址也能正常學習
測試總結:在BGP EVPN分布式網關場景中,網子網互訪的環境中,當二層VSI下的RT值一致而三層VPN實例下的EVPN RT不一致時,能夠正常學習mac,但是學習不到路由
測試二:
#修改二層VSI下的RT值,使得兩端VSI的RT值不一致,而三層VPN實例下EVPN的RT值一致,然後reset bgp的鄰居,看看路由能否正常學習,mac能否正常學習,能否實現PCA訪問PCB?
修改後的主要配置如下:
#S1主要配置
sysname S1
#
ip vpn-instance vpna
route-distinguisher 1:2
#
address-family ipv4
vpn-target 5000:1 1000:1 import-extcommunity
vpn-target 5000:1 1000:1 export-extcommunity
#
address-family evpn
vpn-target 300:1 import-extcommunity
vpn-target 300:1 export-extcommunity
#
vsi vpna
gateway vsi-interface 1
vxlan 10
evpn encapsulation vxlan
route-distinguisher 1:1
vpn-target 10:1 export-extcommunity
vpn-target 10:1 import-extcommunity
#S3主要配置:
sysname S3
#
ip vpn-instance vpna
route-distinguisher 1:2
#
address-family ipv4
vpn-target 1000:1 import-extcommunity
vpn-target 1000:1 export-extcommunity
#
address-family evpn
vpn-target 400:1 300:1 import-extcommunity
vpn-target 400:1 300:1 export-extcommunity
#
vsi vpna
gateway vsi-interface 1
vxlan 10
evpn encapsulation vxlan
route-distinguisher 1:2
vpn-target 20:1 export-extcommunity
vpn-target 20:1 import-extcommunity
#為了保證接口的準確性,我們reset下兩端bgp的鄰居關係
reset bgp all
Reset BGP sessions? [Y/N]:y
reset bgp all
Reset BGP sessions? [Y/N]:y
#此時PCA訪問PCB,發現是無法互訪的
#S1上可以學習到32位主機路由,學習不到mac地址信息
#S3上可以學習到32位主機路由,也學習不到mac地址信息
#由於二層互訪根據源mac學習,依賴目標mac轉發,學習不到mac地址信息,所以導致無法互訪
測試總結:在BGP EVPN分布式網關場景中,網子網互訪的環境中,當三層VPN實例EVPN 的RT值一致而二層VSI下的RT值不一致,路由能夠正常學習,mac無法正常學習
總結:
1、BGP EVPN分布式網關場景中,網子網互訪,發布的路由條目會攜帶二層VSI下的RT值屬性,對端接收時會先判斷接收的路由和自己VSI的RT 入向的值是否一致,如果一致,且對端VTEP地址可達,本地VNI與遠端VNI相同,則創建VXLAN頭端複製表,學習遠端MAC地址,為二層互訪做準備。如果二層VSI的RT不一致而三層VPN實例的EVPN實例RT值一致,則無法學習到mac地址,但不影響路由的學習。
2、文章內容為個人學習時梳理,難免有誤,如有錯誤之處,歡迎私信指正。