页面加载中,请稍候
来源:开源Linux发布时间:2023-06-081028浏览
询问 AI
来源:http://just4coding.com/2020/04/26/vxlan-evpn/
VXLAN现在主要有以下几种类型的控制面:
基于BGP EVPN(Ethernet Virtual Private Network)VMware NSX方案是基于SDN控制器。本文我们来介绍基于BGP EVPN的VXLAN控制面。
BGP EVPN是一个标准的控制面协议,由RFC7432定义。它支持三种数据面: MPLS、PBB、NVO(Network Virtualization Overlay)。
VXLAN是NVO方案中的一种,它的EVPN应用由RFC8365定义。BGP EVPN依赖BGP协议和MP-BGP扩展。BGP是支撑互联网的主要协议,用于在网络设备之间同步路由信息。MP-BGP扩展能够将BGP所同步信息扩展到多种协议,如IPv4, IPv6, L3VPN和EVPN等。EVPN地址族用来传递MAC地址以及这些MAC地址所挂接的设备IP。
EVPN方案相较其他的控制面方案具备这些优势:
基于EVPN的VXLAN方案中,VTEP通常做为第一跳路由配置在ToR交换机(虚拟化场景中可以是Hypervisor上的虚拟交换机)。当一个本地交换机在某VLAN学习到本地MAC地址(通过Gratuitous ARP或首个数据包)后, 将MAC地址放到交换机的FDB表中。每个Local VLAN会映射到一个VNI。本地的MP-BGP进程收集到本地VTEP所配置的VNI信息、每个VNI下的MAC地址,然后将这些信息通过MP-BGP协议宣告给其他的VTEP。其中:
VTEP信息通过Type 3路由宣告每个VNI下的本地MAC地址通过Type 2路由宣告在接收端, BGP进程将接收到的MAC地址存放在BGP表中。如果接收到的路由中的RT community与本地VNI的导入RT相匹配,这些MAC地址就会被放入本地交换的FDB中。
通过这个流程,其他的VTEP就具备了本地VTEP上的MAC地址信息, 从而构造完成VXLAN的FDB表项,后续数据面转发则可以直接从MAC地址、VNI找到相应的VTEP。表项格式可简化表达为:
<MAC><VNI><REMOTEVTEP>
为了在所有VTEP之间进行路由同步,需要采用FullMesh方式,即任意两个VTEP之间都需要建立BGP会话。在大规模VXLAN环境中这样配置非常复杂,为了降低配置复杂度,通常会引入RR(Router Reflector)。这样,每个VTEP都只需要与RR建立BGP会话,RR会将从某个BGP Peer所接收到的路由信息转发给其他的所有BGP Peer。
开源项目FRRoutring是一个功能丰富的Linux路由软件,它实现了EVPN协议。我们在Linux上基于FRR来实验基于BGP EVPN的VXLAN通信过程。实验结构与之前的文章一致,只是在两台主机上添加了FRR软件和一台RouterReflector虚拟机,如下图:

在实际EVPN的部署中,可以使用:
我们这里的示例使用iBGP, VTEP AS号都为: 65000。
首先我们在虚拟机192.168.33.12上使用FRR作为Router Reflector。在FRR的BGP配置文件中添加如下配置:
routerbgp65000
bgprouter-id192.168.33.12
bgpcluster-id192.168.33.12
bgplog-neighbor-changes
nobgpdefaultipv4-unicast
neighborfabricpeer-group
neighborfabricremote-as65000
neighborfabriccapabilityextented-nexthop
neighborfabricupdate-source192.168.33.12
bgplistenrange192.168.33.0/24peer-groupfabric
!
address-familyl2vpnevpn
neighborfabricactivate
neighborfabricroute-reflector-client
exit-address-family
!
exit
!
我们定义一个peer-group: fabric, 并且使用FRR的动态peer特性接收来自所有192.168.33.0/24网段且ASN为65000的BGP peer连接。
接下来我们在两台虚拟机上配置VTEP。我们需要在VXLAN接口上禁用源地址学习, 只依赖EVPN来同步FDB。在Host1上使用脚本创建本地交换机和VXLAN设备:
sysctl-wnet.ipv4.ip_forward=1
ipnetnsaddns1
iplinkaddveth1typevethpeernameeth0netnsns1
ipnetnsexecns1iplinkseteth0up
ipnetnsexecns1iplinksetloup
ipnetnsexecns1ipaddradd3.3.3.3/24deveth0
iplinksetupdevveth1
iplinkaddbr1typebridge
iplinksetbr1up
iplinksetveth1masterbr1
iplinkaddvxlan100typevxlanid100dstport4789local192.168.33.15nolearning
iplinksetvxlan100masterbr1
iplinksetupvxlan100
在Host2上同样配置:
sysctl-wnet.ipv4.ip_forward=1
ipnetnsaddns1
iplinkaddveth1typevethpeernameeth0netnsns1
ipnetnsexecns1iplinkseteth0up
ipnetnsexecns1iplinksetloup
ipnetnsexecns1ipaddradd3.3.3.4/24deveth0
iplinksetupdevveth1
iplinkaddbr1typebridge
iplinksetbr1up
iplinksetveth1masterbr1
iplinkaddvxlan100typevxlanid100dstport4789local192.168.33.16nolearning
iplinksetvxlan100masterbr1
iplinksetupvxlan100
此时我们从192.168.33.15机器上的ns1来访问192.168.33.16机器中的ns1中的IP, 访问不成功:
root@ubuntu-focal:/home/vagrant/workspace#ipnetnsexecns1ping-c23.3.3.4
PING3.3.3.4(3.3.3.4)56(84)bytesofdata.
From3.3.3.3icmp_seq=1DestinationHostUnreachable
From3.3.3.3icmp_seq=2DestinationHostUnreachable
---3.3.3.4pingstatistics---
2packetstransmitted,0received,+2errors,100%packetloss,time1028ms
pipe2
然后我们确认两台主机上的需要测试的虚拟网卡的MAC地址:
root@ubuntu-focal:/home/vagrant#ipnetnsexecns1iplink
1:lo:<LOOPBACK,UP,LOWER_UP>mtu65536qdiscnoqueuestateUNKNOWNmodeDEFAULTgroupdefaultqlen1000
link/loopback00:00:00:00:00:00brd00:00:00:00:00:00
2:eth0@if4:<BROADCAST,MULTICAST,UP,LOWER_UP>mtu1500qdiscnoqueuestateUPmodeDEFAULTgroupdefaultqlen1000
link/ether7a:bb:b4:6a:55:02brdff:ff:ff:ff:ff:fflink-netnsid0
root@ubuntu-bionic:/home/vagrant#ipnetnsexecns1iplink
1:lo:<LOOPBACK,UP,LOWER_UP>mtu65536qdiscnoqueuestateUNKNOWNmodeDEFAULTgroupdefaultqlen1000
link/loopback00:00:00:00:00:00brd00:00:00:00:00:00
2:eth0@if4:<BROADCAST,MULTICAST,UP,LOWER_UP>mtu1500qdiscnoqueuestateUPmodeDEFAULTgroupdefaultqlen1000
link/ethere2:38:ad:ed:8f:9ebrdff:ff:ff:ff:ff:fflink-netnsid0
接下来我们配置Host1上的FRR配置, 添加:
logsysloginformational
!
linevty
!
routerbgp65000
bgprouter-id192.168.33.15
nobgpdefaultipv4-unicast
neighborfabricpeer-group
neighborfabricremote-as65000
neighborfabriccapabilityextented-nexthop
!BGPsessionswithroutereflectors
neighbor192.168.33.12peer-groupfabric
!
address-familyl2vpnevpn
neighborfabricactivate
advertise-all-vni
exit-address-family
!
exit
!
然后启动FRR:
systemctlstartfrr
在VTEP上我们建立与RR: 192.168.33.12的BGP会话,配置advertise-all-vni指令去向其他peer宣告所有的本地VNI。
在Host2上也做同样的配置。
此时再次在Host1上执行ping, 访问成功:
root@ubuntu-focal:/home/vagrant/workspace#ipnetnsexecns1ping-c23.3.3.4
PING3.3.3.4(3.3.3.4)56(84)bytesofdata.
64bytesfrom3.3.3.4:icmp_seq=1ttl=64time=0.677ms
64bytesfrom3.3.3.4:icmp_seq=2ttl=64time=0.731ms
---3.3.3.4pingstatistics---
2packetstransmitted,2received,0%packetloss,time1007ms
rttmin/avg/max/mdev=0.677/0.704/0.731/0.027ms
此时, 我们在RR中通过vtysh查看BGP信息:
centos3#showbgpsummary
L2VPNEVPNSummary:
BGProuteridentifier192.168.33.12,localASnumber65000vrf-id0
BGPtableversion0
RIBentries3,using552bytesofmemory
Peers2,using41KiBofmemory
Peergroups1,using64bytesofmemory
NeighborVASMsgRcvdMsgSentTblVerInQOutQUp/DownState/PfxRcd
*192.168.33.154650007900000:03:002
*192.168.33.164650007900000:02:422
Totalnumberofneighbors2
*-dynamicneighbor
2dynamicneighbor(s),limit100
可以看到两台主机都建立了到RR的BGP会话。
接着查看evpn路由信息:
centos3#showbgpevpnroute
BGPtableversionis10,localrouterIDis192.168.33.12
Statuscodes:ssuppressed,ddamped,hhistory,*valid,>best,i-internal
Origincodes:i-IGP,e-EGP,?-incomplete
EVPNtype-2prefix:[2]:[EthTag]:[MAClen]:[MAC]:[IPlen]:[IP]
EVPNtype-3prefix:[3]:[EthTag]:[IPlen]:[OrigIP]
EVPNtype-4prefix:[4]:[ESI]:[IPlen]:[OrigIP]
EVPNtype-5prefix:[5]:[EthTag]:[IPlen]:[IP]
NetworkNextHopMetricLocPrfWeightPath
ExtendedCommunity
RouteDistinguisher:192.168.33.15:2
*>i[2]:[0]:[48]:[7a:bb:b4:6a:55:02]
192.168.33.151000i
RT:65000:100ET:8
*>i[3]:[0]:[32]:[192.168.33.15]
192.168.33.151000i
RT:65000:100ET:8
RouteDistinguisher:192.168.33.16:2
*>i[2]:[0]:[48]:[e2:38:ad:ed:8f:9e]
192.168.33.161000i
RT:65000:100ET:8
*>i[3]:[0]:[32]:[192.168.33.16]
192.168.33.161000i
RT:65000:100ET:8
Displayed4prefixes(4paths)
可以看到各接收到来自Host1和Host2的两条路由信息,分别是Type 2和Type 3。
在Host1上通过vtysh查看vxlan接口:
ubuntu-focal#showinterfacevxlan100
Interfacevxlan100isup,lineprotocolisup
Linkups:0last:(never)
Linkdowns:0last:(never)
vrf:default
index6metric0mtu1500speed0
flags:<UP,BROADCAST,RUNNING,MULTICAST>
Type:Ethernet
HWaddr:ae:46:52:bd:92:2e
inet6fe80::ac46:52ff:febd:922e/64
InterfaceTypeVxlan
VxLANId100VTEPIP:192.168.33.15AccessVLANId1
Masterinterface:br1
可以看到VTEP信息,VNI为100,所属的bridge为br1
查看VNI:100下的本地MAC地址:
ubuntu-focal#showevpnmacvni100
NumberofMACs(localandremote)knownforthisVNI:3
MACTypeIntf/RemoteVTEPVLANSeq#'s
7a:bb:b4:6a:55:02localveth10/0
e2:38:ad:ed:8f:9eremote192.168.33.160/0
06:a7:49:0e:8b:48localbr110/0
可以看到本地MAC7a:bb:b4:6a:55:02被发现,远端的MAC地址e2:38:ad:ed:8f:9e也被发现。
在Host1上查看EVPN路由信息,可以看到接收到了来自Host2所宣告的两条路由信息:
ubuntu-focal#showbgpevpnroute
BGPtableversionis6,localrouterIDis192.168.33.15
Statuscodes:ssuppressed,ddamped,hhistory,*valid,>best,i-internal
Origincodes:i-IGP,e-EGP,?-incomplete
EVPNtype-2prefix:[2]:[EthTag]:[MAClen]:[MAC]:[IPlen]:[IP]
EVPNtype-3prefix:[3]:[EthTag]:[IPlen]:[OrigIP]
EVPNtype-4prefix:[4]:[ESI]:[IPlen]:[OrigIP]
EVPNtype-5prefix:[5]:[EthTag]:[IPlen]:[IP]
NetworkNextHopMetricLocPrfWeightPath
ExtendedCommunity
RouteDistinguisher:192.168.33.15:2
*>[2]:[0]:[48]:[7a:bb:b4:6a:55:02]
192.168.33.1532768i
ET:8RT:65000:100
*>[3]:[0]:[32]:[192.168.33.15]
192.168.33.1532768i
ET:8RT:65000:100
RouteDistinguisher:192.168.33.16:2
*>i[2]:[0]:[48]:[e2:38:ad:ed:8f:9e]
192.168.33.1601000i
RT:65000:100ET:8
*>i[3]:[0]:[32]:[192.168.33.16]
192.168.33.1601000i
RT:65000:100ET:8
Displayed4prefixes(4paths)
在Host1上查看VXLAN接口vxlan100的FDB:
root@ubuntu-focal:/home/vagrant#bridgefdbshowdevvxlan100
e2:38:ad:ed:8f:9evlan1extern_learnmasterbr1
e2:38:ad:ed:8f:9eextern_learnmasterbr1
ae:46:52:bd:92:2evlan1masterbr1permanent
ae:46:52:bd:92:2emasterbr1permanent
00:00:00:00:00:00dst192.168.33.16selfpermanent
e2:38:ad:ed:8f:9edst192.168.33.16selfextern_learn
可以看到EVPN接收的MAC地址e2:38:ad:ed:8f:9e已经写入到FDB中。
在Host2上也可以发现Host1上的MAC记录及相关路由信息。
参考链接:
https://umairhoodbhoy.net/2014/10/29/head-end-replication-and-vxlan-compliance/https://www.sdnlab.com/19717.htmlhttps://vincent.bernat.ch/en/blog/2017-vxlan-bgp-evpnhttps://vincent.bernat.ch/en/blog/2017-vxlan-linux
10T 技术资源大放送!包括但不限于:Linux、网络、云计算、Python、Go、C/C++ 等。在开源Linux公众号内回复10T,即可免费获取!
新闻来源:开源Linux,文中所述为作者独立观点,不代表icspec立场。更多精彩资讯请下载icspec App。如对本稿件有异议,请联系微信客服specltkj。
暂无评论哦,快来评论一下吧!

2026-07-08

2026-07-07
2026-07-15