VXLAN-EVPN
在 VXLAN 中提到,除了手工配置VXLAN隧道,还可以使用EVPN作为VXLAN的控制平面,从而避免网路中存在大量的泛洪流量。
BGP-EVPN地址族
EVPN技术采用类似于BGP/MPLS IP VPN的机制,在BGP协议的基础上定义了一种新的网络层可达信息NLRI(Network Layer Reachability Information)即EVPN NLRI,EVPN NLRI定义了几种新的BGP EVPN路由类型,用于处在二层网络的不同站点之间的MAC地址学习和发布。
传统的BGP-4使用Update报文在对等体之间交换路由信息。一条Update报文可以通告一类具有相同路径属性的可达路由,这些路由放在NLRI(Network Layer Reachable Information,网络层可达信息)字段中。因为BGP-4只能管理IPv4单播路由信息,为了提供对多种网络层协议的支持(例如IPv6、组播),发展出了MP-BGP。MP-BGP在BGP-4基础上对NLRI作了新扩展。玄机就在于新扩展的NLRI上,扩展之后的NLRI增加了地址族的描述,可以用来区分不同的网络层协议,例如IPv6单播地址族、VPN实例地址族等。
类似的,EVPN也是借用了MP-BGP的机制,在L2VPN地址族下定义了新的子地址族——EVPN地址族,在这个地址族下又新增了一种NLRI,即EVPN NLRI。EVPN NLRI定义了几种BGP EVPN路由类型,这些路由可以携带主机IP、MAC、VNI、VRF等信息。这样,当一个VTEP学习到下挂的主机的IP、MAC地址信息后,就可以通过MP-BGP路由将这些信息发送给其他的VTEP,从而在控制平面实现主机IP、MAC地址的学习,抑制了数据平面的泛洪。
采用EVPN作为VXLAN的控制平面具有以下优势:
可实现VTEP自动发现、VXLAN隧道自动建立,从而降低网络部署、扩展的难度。
EVPN可以同时发布二层MAC信息和三层路由信息。
可以减少网络中的泛洪流量。
EVPN NLRI定义了五种EVPN路由类型
路由类型 | 路由描述 |
---|---|
Type1 | Ethernet auto-discovery (AD) route,以太自动发现路由 |
Type2 | MAC/IP advertisement route,MAC/IP路由 |
Type3 | Inclusive multicast Ethernet tag route,Inclusive Multicast路由 |
Type4 | Ethernet segment route,以太网段路由 |
Type5 | IP prefix route,IP前缀路由 |
其中,Type1和Type4是用于EVPN ESI(Ethernet Segment Identifier)多活场景,该场景主要是为了提高VXLAN接入侧的可靠性。主要重点介绍Type2、3、5
EVPN Type2路由(MAC/IP路由)
EVPN Type2路由,也就是MAC/IP路由,主要用于VTEP之间相互通告主机IP、MAC信息。
报文格式及各字段意义说明如下:
字段 | 说明 |
---|---|
Route Distinguisher | 该字段为EVPN实例下设置的RD(Route Distinguisher)值。 |
Ethernet Segment Identifier | 该字段为当前设备与对端连接定义的唯一标识。 |
Ethernet Tag ID | 该字段为当前设备上实际配置的VLAN ID。 |
MAC Address Length | 该字段为此路由携带的主机MAC地址的长度。 |
MAC Address | 该字段为此路由携带的主机MAC地址。 |
IP Address Length | 该字段为此路由携带的主机IP地址的掩码长度。 |
IP Address | 该字段为此路由携带的主机IP地址。 |
MPLS Label1 | 该字段为此路由携带的二层VNI。 |
MPLS Label2 | 该字段为此路由携带的三层VNI。 |
在字段中有两个MPLS Lable
,其实是因为原来EVPN设计的时候是用来作为MPLS的控制平面的,后面发展到其他技术的控制平面,因此EVPN只是常用于VXLAN,但不局限于VXLAN
该类型路由在VXLAN控制平面中的作用包括:
主机MAC地址通告
要实现同子网主机的二层互访,两端VTEP需要相互学习主机MAC。作为BGP EVPN对等体的VTEP之间通过交换MAC/IP路由,可以相互通告已经获取到的主机MAC。其中,MAC Address字段为主机MAC地址。
主机ARP通告
MAC/IP路由可以同时携带主机MAC地址+主机IP地址,因此该路由可以用来在VTEP之间传递主机ARP表项,实现主机ARP通告。其中,MAC Address字段为主机MAC地址,IP Address字段为主机IP地址。此时的MAC/IP路由也称为ARP类型路由。主机ARP通告主要用于以下两种场景:
- ARP广播抑制。当三层网关学习到其子网下的主机ARP时,生成主机信息(包含主机IP地址、主机MAC地址、二层VNI、网关VTEP IP地址),然后通过传递ARP类型路由将主机信息同步到二层网关上。这样当二层网关再收到ARP请求时,先查找是否存在目的IP地址对应的主机信息,如果存在,则直接将ARP请求报文中的广播MAC地址替换为目的单播MAC地址,实现广播变单播,达到ARP广播抑制的目的。
- 分布式网关场景下的虚拟机迁移。当一台虚拟机从当前网关迁移到另一个网关下之后,新网关学习到该虚拟机的ARP(一般通过虚拟机发送免费ARP实现),并生成主机信息(包含主机IP地址、主机MAC地址、二层VNI、网关VTEP IP地址),然后通过传递ARP类型路由将主机信息发送给虚拟机的原网关。原网关收到后,感知到虚拟机的位置发生变化,触发ARP探测,当探测不到原位置的虚拟机时,撤销原位置虚拟机的ARP和主机路由。
主机IP路由通告
在分布式网关场景中,要实现跨子网主机的三层互访,两端VTEP(作为三层网关)需要互相学习主机IP路由。作为BGP EVPN对等体的VTEP之间通过交换MAC/IP路由,可以相互通告已经获取到的主机IP路由。其中,IP Address字段为主机IP路由的目的地址,同时MPLS Label2字段必须携带三层VNI。此时的MAC/IP路由也称为IRB(Integrated Routing and Bridge)类型路由。
ND表项扩散
MAC/IP路由可以同时携带主机MAC地址+主机IPv6地址,因此该路由可以用来在VTEP之间传递ND表项,实现ND表项扩散。其中,MAC Address字段为主机MAC地址,IP Address字段为主机IPv6地址。此时的MAC/IP路由也称为ND类型路由。ND表项扩散主要用于以下场景:
- NS组播抑制。当VXLAN网关设备收集到本地IPv6主机的信息后,生成ND表或ND代答表,然后通过MAC/IP路由进行扩散,其他VXLAN网关(BGP EVPN对等体)收到该路由后生成本地的ND代答表。这样,当VXLAN网关再收到NS报文时先查找本地的ND代答表,查找成功就直接进行ND代答或组播转单播处理,从而减少或抑制NS报文洪泛。
- 防止ND欺骗攻击。ND欺骗攻击是指攻击者将自己的MAC地址与某一主机的IPv6地址相关联,从而使发往该IPv6地址的任何流量都发送给攻击者。通过ND扩散功能,VXLAN网关之间可以同步同一IPv6主机的ND代答表。当攻击者上线后,针对同一IPv6主机,会重复生成ND代答表并扩散到其他VXLAN网关。这样通过ND代答表冲突检测触发IPv6地址冲突告警,进而提醒用户可能存在ND欺骗攻击。
- 分布式网关场景下的IPv6虚拟机迁移。当一台IPv6虚拟机从当前网关迁移到另一个网关下之后,该虚拟机会主动发送免费NA报文,新网关收到后生成ND表,并通过MAC/IP路由扩散给原网关。原网关收到后,感知到IPv6虚拟机的位置发生变化,触发NUD探测。当探测不到原位置的IPv6虚拟机时,删除本地ND表,并通过MAC/IP路由扩散给新网关,新网关收到后删除老的ND代答表。
主机IPv6路由通告
在分布式网关场景中,要实现跨子网IPv6主机的三层互访,网关设备需要互相学习主机IPv6路由。作为BGP EVPN对等体的VTEP之间通过交换MAC/IP路由,可以相互通告已经获取到的主机IPv6路由。其中,IP Address字段为主机IPv6路由的目的地址,同时MPLS Label2字段必须携带三层VNI。此时的MAC/IP路由也称为IRBv6类型路由。
EVPN Type3路由(Inclusive Multicast)
EVPN Type3路由主要用于在VTEP之间相互通告二层VNI、VTEP IP信息,以建立头端复制列表,即用于VTEP的自动发现和VXLAN隧道的动态建立:如果对端VTEP IP地址是三层路由可达的,则建立一条到对端的VXLAN隧道。同时,如果对端VNI与本端相同,则创建一个头端复制表,用于后续BUM报文转发。
Type3路由的NLRI是由“前缀”和“PMSI”属性组成,报文格式如下图所示。其中VTEP IP信息体现在NLRI的Originating Router’s IP Address字段中,二层VNI信息则体现在PMSI属性的MPLS Label中。
字段 | 说明 |
---|---|
Route Distinguisher | 该字段为EVPN实例下设置的RD(Route Distinguisher)值。 |
Ethernet Tag ID | 该字段为当前设备上的VLAN ID。在此路由中为全0。 |
IP Address Length | 该字段为此路由携带的本端VTEP IP地址的掩码长度。 |
Originating Router’s IP Address | 该字段为此路由携带的本端VTEP IP地址。 |
Flags | 该字段为标志位,标识当前隧道是否需要叶子节点信息。在VXLAN场景中,该字段没有实际意义。 |
Tunnel Type | 该字段为此路由携带的隧道类型。目前,在VXLAN场景中,支持的类型只有“6:Ingress Replication”,即头端复制,用于BUM报文转发。 |
MPLS Label | 该字段为此路由携带的二层VNI。 |
Tunnel Identifier | 该字段为此路由携带的隧道信息。目前,在VXLAN场景中,该字段也是本端VTEP IP地址。 |
该类型路由在VXLAN控制平面中主要用于VTEP的自动发现和VXLAN隧道的动态建立。作为BGP EVPN对等体的VTEP,通过Inclusive Multicast路由互相传递二层VNI和VTEP IP地址信息。其中,Originating Router’s IP Address字段为本端VTEP IP地址,MPLS Label字段为二层VNI。如果对端VTEP IP地址是三层路由可达的,则建立一条到对端的VXLAN隧道。同时,本端会创建一个基于VNI的头端复制表并将对端VTEP IP地址加入其中,用于后续BUM报文转发。
EVPN Type5路由(IP前缀路由)
EVPN Type5路由又称IP前缀路由,主要用于传递网段路由。不同于Type2路由只传递32(IPv4)/128(IPv6)位的主机路由,Type5路由可传递0~32/0~128掩码长度的网段路由。
字段 | 说明 |
---|---|
Route Distinguisher | 该字段为VPN实例下设置的RD(Route Distinguisher)值。 |
Ethernet Segment Identifier | 该字段为当前设备与对端连接定义的唯一标识。 |
Ethernet Tag ID | 该字段取值为全0。 |
IP Prefix Length | 该字段为此路由携带的IP前缀掩码长度。 |
IP Prefix | 该字段为此路由携带的IP前缀。 |
GW IP Address | 该字段为默认网关地址。 |
MPLS Label | 该字段为此路由携带的三层VNI。 |
该类型路由的IP Prefix Length和IP Prefix字段既可以携带主机IP地址,也可以携带网段地址:
- 当携带主机IP地址时,该类型路由在VXLAN控制平面中的作用与IRB类型路由是一样的,主要用于分布式网关场景中的主机IP路由通告。
- 当携带网段地址时,通过传递该类型路由,可以实现VXLAN网络中的主机访问外部网络。
EVPN工作原理
在用BGP EVPN方式部署分布式VXLAN网络的场景中,控制平面的流程包括VXLAN隧道建立、MAC地址动态学习;转发平面的流程包括同子网已知单播报文转发、同子网BUM报文转发、跨子网报文转发。
EVPN学习MAC地址
在手工配置中,VTEP学习远程主机MAC是通过ARP广播实现的,而在EVPN中,可以使用Type2路由交互实现,减少泛洪流量。
Host1接入Leaf1时,Leaf1会通过DHCP、ARP等方式得知Host1的MAC地址,记录到本地的MAC地址表中。Leaf1学习到本地主机的MAC表项后,会向其对等体Leaf2发送EVPN Type2路由。该路由会携带本端EVPN实例的ERT、VTEP IP地址、二层VNI、Host1的MAC地址等信息。其中本端的EVPN实例的ERT、VTEP IP地址、二层VNI这些信息来源于本端VTEP上的配置
Leaf2收到Leaf1发来的Type2路由后,能够学习到Host1的MAC地址信息,并将其保存在MAC表中,其下一跳为Leaf1的VTEP IP地址。 需要说明的是,Leaf2收到Leaf1发送的EVPN路由时,能否接纳该路由信息,是需要通过EVPN实例的RT(Route Target)值是否匹配来判断的。这个跟 BGP/MPLS VPN 里的RT类似,当路由中的ERP与本端的IRT相同时才接收该路由。
经过以上的流程,在未发送广播请求的情况下,Leaf2就可以学习到Host1的MAC地址。类似的,Leaf1也可以学习到Host2的MAC地址。
另外需要强调的是,EVPN只是减少了网络中的流量泛洪,并不会完全避免,例如在以下一些场景:
- 网络中存在“静默”主机的情况,这种情况下主机不会触发ARP、DHCP等行为,导致VTEP学习不到本地主机MAC地址,从而也就无法发送MAC地址信息让其他VTEP学习到。
- 主机首次通信的过程中,主机会发送ARP广播请求报文,这种也会产生泛洪。这种情况还可以通过 ARP广播抑制功能 来避免泛洪
同子网VXLAN隧道的建立
VXLAN隧道由一对VTEP确定,在同子网互通场景下,因为只需要在同一个二层广播域(BD)内互通,所以只要两端VTEP的IP地址路由可达,VXLAN隧道就可以建立。通过EVPN动态建立VXLAN隧道,就是在两端VTEP之间建立BGP EVPN对等体,然后对等体之间通过交互Type3路由来互相传递VNI和VTEP IP地址信息,从而实现动态建立VXLAN隧道。
Leaf2、Leaf3收到Leaf1发来的Type3路由后,如果Leaf1的VTEP IP三层路由可达,则建立一条到Leaf1的二层VXLAN隧道;同时,如果本地有相同的VNI,则建立一条头端复制列表,用于后续广播、组播、未知单播报文的转发。
在Leaf2、Leaf3收到Leaf1发送的EVPN路由时,会基于路由携带的RT值(EVPN实例的ERT值)是否与本地EVPN实例的IRT值匹配,来判断是否接纳该路由。
[Leaf1]
bridge-domain 10
vxlan vni 10 //二层VNI
evpn
route-distinguisher 1:10 //EVPN实例的RD
vpn-target 0:10 export-extcommunity //EVPN实例的ERT
vpn-target 100:5000 export-extcommunity
vpn-target 0:10 import-extcommunity
#
interface Nve1
source 1.1.1.1 //Leaf1的VTEP IP地址
vni 10 head-end peer-list protocol bgp
#
经过以上的流程,Leaf2、Leaf3上就能建立到Leaf1的头端复制列表,指导后续BUM报文的转发。类似的,Leaf1上也会建立到Leaf2、Leaf3的头端复制列表。
跨子网VXLAN隧道的建立和路由发布
Type2路由除了可以发布MAC地址,还可以通过32位/128位掩码的主机IP地址信息来发布路由信息,实现跨子网的通信。VTEP之间要实现跨子网的通信,需要发布各自下接主机的IP地址,否则无法知道要发布给哪个VTEP。
Host1在连接至Leaf1时,通常会触发ARP、DHCP等行为。通过这些流量,Leaf1上就会学习到Host1的ARP信息。同时,还可以根据Host1所属的BD域,获取相应的二层VNI、L3VPN实例及L3VPN实例关联的三层VNI信息。
为什么会有L3VPN和三层VNI呢?因为同一个Leaf下可能接入多个租户的服务器,而为了实现不同租户之间的隔离,所以就在Leaf上通过创建不同的L3VPN来隔离不同租户的路由表,从而将不同租户的路由存放在不同的私网路由表中。而三层VNI就是用来标识这些L3VPN的,当Leaf节点收到对端发送来的数据报文时(报文会携带三层VNI),就根据其三层VNI找到相应的L3VPN,通过查找该L3VPN实例下的路由表来进行转发。
[Leaf1]
ip vpn-instance vpn1 //L3VPN实例
ipv4-family
route-distinguisher 20:4
vpn-target 100:5000 export-extcommunity evpn
vpn-target 100:5000 import-extcommunity evpn
vxlan vni 5000 //L3VPN实例关联的三层VNI
#
bridge-domain 10
vxlan vni 10 //二层VNI
evpn
route-distinguisher 10:4
vpn-target 0:10 export-extcommunity
vpn-target 100:5000 export-extcommunity
vpn-target 0:10 import-extcommunity
#
interface Vbdif10 //根据BD信息获取三层Vbdif接口和此接口绑定的L3VPN实例
ip binding vpn-instance vpn1
ip address 192.168.1.1 255.255.255.0
mac-address 0000-5e00-0102
vxlan anycast-gateway enable
arp collect host enable
#
- Leaf1上的EVPN实例就可以根据这些信息(IP + MAC + Host1所属的二层VNI + VBDIF绑定的L3VPN实例的三层VNI)生成EVPN Type2类型的路由(参见上图),除了获取的Host1的相关信息外,还携带本端EVPN实例的ERT、路由下一跳(本端VTEP IP)、VTEP的MAC等信息,将其发送给对等体Leaf2。
- Leaf1上的EVPN实例将Host1的IP + MAC + 三层VNI发给本端的L3VPN实例,从而在本端的L3VPN实例中生成本地Host1的路由。
Leaf2收到Leaf1发来的Type2路由后,能够学习到Host1的IP地址信息,并将其保存在相应的路由表中,其下一跳为Leaf1的VTEP IP地址,同时记录对应的三层VNI信息,处理过程如下:
- 检查该路由的ERT与接收端EVPN实例的IRT是否相同。如果相同,则接收该路由,同时EVPN实例提取其中包含的主机IP+MAC信息,用于主机ARP通告。
- 检查该路由的ERT与接收端L3VPN实例的IRT是否相同(如下表中的举例所示)。如果相同,则接收该路由,同时L3VPN实例提取其中的主机IP地址+三层VNI信息,在其路由表中生成Host1的路由。该路由的下一跳会被设置为Leaf1的VXLAN隧道接口。
- 接收端EVPN实例或L3VPN实例接收该路由后会通过下一跳获取Leaf1的VTEP IP地址,如果该地址三层路由可达,则建立一条到Leaf1的VXLAN隧道。
Leaf1(发送端) | Leaf2(接收端) |
---|---|
ip vpn-instance vpn1 ipv4-family route-distinguisher 20:2 vpn-target 100:5000 export-extcommunity evpn vpn-target 100:5000 import-extcommunity evpn vxlan vni 5000 # bridge-domain 10 vxlan vni 10 evpn route-distinguisher 10:2 vpn-target 100:10 export-extcommunity vpn-target 100:5000 export-extcommunity //发送端EVPN中的ERT vpn-target 100:10 import-extcommunity # | ip vpn-instance vpn1 ipv4-family route-distinguisher 20:3 vpn-target 100:5000 export-extcommunity evpn vpn-target 100:5000 import-extcommunity evpn //接收端L3VPN中的IRT(eIRT) vxlan vni 5000 # bridge-domain 20 vxlan vni 20 evpn route-distinguisher 10:3 vpn-target 100:20 export-extcommunity vpn-target 100:5000 export-extcommunity vpn-target 100:20 import-extcommunity # |
经过以上的流程,Leaf2就可以学习到Host1的IP路由信息,后续转发至Host1的报文时,可以根据查找路由表进行转发。类似的,Leaf1也可以学习到Host2的IP路由信息。
网段路由发布
网段路由的发布流程与主机路由类似,区别在于网段路由是通过Type5路由发布的,Type2路由只能发布32/128位的主机路由。Type5路由也可以发布32/128位的主机路由,在发布32/128位的主机路由时,功能与Type2路由类似。
如果网关设备下连接的网段在整个网络中唯一,则可以配置发布网段路由,否则不能配置发布网段路由。
Leaf1收集到本地IP网段路由,把该IP网段路由通过EVPN Type5路由发送给Leaf2。路由中携带有IP前缀、掩码长度、对应VRF的三层VNI等信息(如上图表格所示)。
Leaf2收到Leaf1发来的Type5路由后,能够学习到IP网段路由信息,并将其保存在相应的路由表中,其下一跳为Leaf1的VTEP IP地址,同时记录对应的三层VNI信息。
Leaf2收到Leaf1发送的EVPN路由时,根据EVPN路由携带的RT值(Type 5路由使用L3VPN实例的ERT值填充)是否与本地L3VPN实例的IRT值匹配,来将网段路由添加到对应VRF的路由表中。如果某VRF的IRT值与EVPN路由携带的RT值相同,则接收该路由,同时提取其中的网段路由+三层VNI信息,在其路由表中生成网段路由。该路由的下一跳会被设置为Leaf1的VTEP IP地址。同时,如果Leaf1的VTEP IP地址三层路由可达,则建立一条到Leaf1的VXLAN隧道。
Leaf1(发送端) | Leaf2(接收端) |
---|---|
ip vpn-instance vpn1 ipv4-family route-distinguisher 20:2 vpn-target 100:5000 export-extcommunity evpn //Type5路由中发送端的ERT使用L3VPN实例中的ERT(eERT) vpn-target 100:5000 import-extcommunity evpn vxlan vni 5000 # bridge-domain 10 vxlan vni 10 evpn route-distinguisher 10:2 vpn-target 100:10 export-extcommunity vpn-target 100:5000 export-extcommunity vpn-target 100:10 import-extcommunity # | ip vpn-instance vpn1 ipv4-family route-distinguisher 20:3 vpn-target 100:5000 export-extcommunity evpn vpn-target 100:5000 import-extcommunity evpn //接收端L3VPN中的IRT(eIRT) vxlan vni 5000 # bridge-domain 20 vxlan vni 20 evpn route-distinguisher 10:3 vpn-target 100:20 export-extcommunity vpn-target 100:5000 export-extcommunity vpn-target 100:20 import-extcommunity # |
在同子网和跨子网中,可以看到EVPN实例和L3VPN实例中都有RT值,而且EVPN中RT不止一个,令人疑惑。
在弄懂RT前,要搞懂EVPN实例和L3VPN的作用和区别。
EVPN一大特点就是在控制平面获取MAC/IP路由信息,而要接收这些路由信息,就是通过EVPN实例来获取和保存,EVPN实例作为发布路由信息的一个“主体”,相较于L3VPN实例的“IP VRF”,EVPN实例可以用“MAC VRF”来理解。两个实例引入路由的条件都是IRT=路由的ERT,以跨子网建立隧道为例子,Leaf1发布的路由有100:5000
和100:10
两个ERT,Leaf2获取到报文后,得到这两个ERT,Leaf2中的L3VPN实例的IRT为100:5000
,EVPN实例的IRT为100:20
,因此只有L3VPN实例能够进行路由交叉,L3VPN实例中会保存Host1的路由信息,用于跨网段通信。同理,相同子网的隧道建立中,Leaf1和Leaf2中EVPN实例的ERT和IRT相同,因此路由信息会被交叉到EVPN实例中,用于同子网通信。而对于网段路由发布,发布的主体不再是EVPN实例,而是L3VPN实例,因为L3VPN实例是“IP VRF”,保存的是IP路由信息。因此在后文的同子网和跨子网的报文转发能看到,同子网是直接根据二层VNI查找MAC表进行转发,也就是EVPN实例路由交叉(或者是MAC地址学习得到的),而跨子网则要根据三层VNI到对应的L3VPN实例中找路由进行转发。
结合后文的 配置举例 中可以更好理解
RT值发布
R
流量转发过程
同子网单播报文转发
同子网报文转发为二层转发,只在VXLAN二层网关之间进行,三层网关无需感知。
- Host1发送目的地址为Host2的报文。如果Host1没有Host2的MAC地址,会先发送广播ARP请求来获取Host2的MAC地址,此处该过程不再详述,认为Host1已经获取了Host2的MAC地址。
- Leaf1收到Host1的报文后,根据报文入端口或VLAN信息判断其所属的BD,并在该BD内查找出接口(通过上一节使用EVPN学习MAC地址可以知道,Leaf1上会学习到Host2的MAC地址,出接口为VTEP 2.2.2.2)。然后Leaf1会对报文进行VXLAN封装后转发。
- Leaf2接收到VXLAN报文后,根据报文中VNI获取二层广播域,进行VXLAN解封装,获取内层的二层报文。
- Leaf2根据内层报文的目的MAC地址,从本地MAC表中找到对应的出接口,然后转发给对应的主机Host2。
同子网BUM报文转发
如果是同子网的BUM报文(广播、组播、未知单播),则会向同子网的所有VTEP发送一份报文。
Host1向外发送广播报文。Leaf1收到Host1的广播报文后,根据报文入端口或VLAN信息判断其所属的BD,并在该BD内查找所有的隧道列表,依据获取的隧道列表进行报文封装后,向所有隧道发送报文,从而将报文转发至同子网的Host2和Host3。
跨子网报文转发
在分布式网关场景下,Leaf1、Leaf2作为VXLAN的三层网关,进行VXLAN封装及三层转发,Spine仅作为VXLAN报文转发节点,不进行VXLAN报文的处理。
- 因为Host1与Host2属于不同网段,所以Host1会先将报文发送给网关(Leaf1),交由网关进行转发。
- Leaf1接收到来自Host1的报文,根据报文的目的地址判断需要进行三层转发。Leaf1根据报文入端口或VLAN信息判断其所属的BD,找到绑定该BD的L3VPN实例,然后在该L3VPN实例下查找路由表。在前面跨子网VXLAN隧道的建立和路由发布章节已经介绍过,在分布式网关场景下,网关Leaf1会学习到Host2的主机路由。Leaf1根据路由获取三层VNI、下一跳等信息,然后进行VXLAN封装,将报文转发至Leaf2。
- Leaf2收到VXLAN报文后进行解封装,根据报文携带的三层VNI找到对应的L3VPN实例,通过查找该L3VPN实例下的路由表,获取报文的下一跳是网关接口地址,然后将目的MAC地址替换为Host2的MAC地址,源MAC地址替换为Leaf2网关的MAC地址,转发给Host2。
对称
和非对称
,这里的对称指的是流量来回走的隧道是否对称,例如下图中,主机1首先发送报文给网关(VTEP),VTEP根据报文的目的mac为自己,走三层转发,VTEP根据EVPN的MAC、主机路由学习机制,能知道目的主机的MAC信息,将目的主机的MAC信息替换原目的MAC,并且使用目的主机的VNI(20),接着报文发送给对端VTEP,对端VTEP解封VXLAN,直接根据目的主机的MAC信息查找MAC表进行转发,同理,主机2回复主机1,走的是VNI10的隧道,这样就是非对称的分布式网关。整个过程即”入口三层出口二层“,但这样要求在所有的 VTEP 上配置所有的 VNI 及网关信息(因为 VTEP 需要同时连接非对称的两条 VXLAN 隧道)。这也就导致 VTEP 要学习到 VNI 所有的主机 MAC 信息(包括远端主机的 MAC),在网络中 VNI 或主机数量增加时,会带来扩展性的问题。因此配置三层的VNI来解决这个问题,通过统一走三层VNI隧道,实现对称转发。ARP广播抑制
网络中同网段主机首次通信时,由于没有目标主机的MAC地址信息,因此会发送ARP广播请求来获取目的MAC地址信息。ARP广播请求报文在VXLAN网络中会泛洪转发,大量的ARP报文存在会占用过多的网络资源,导致网络性能下降。
为了抑制ARP广播请求给网络带来的负面影响,可以通过ARP广播抑制功能来尽可能的减少ARP报文在VXLAN网络中的泛洪。ARP广播抑制有两种方式,一种是ARP广播变单播的功能,另一种是ARP二层代答功能。
ARP广播变单播
ARP广播变单播的实现思路是在VXLAN三层网关上根据ARP生成ARP广播抑制表(包括主机IP、MAC、VNI、VTEP IP信息),然后通过EVPN将主机信息发送给二层网关;二层网关在收到ARP广播请求后,直接使用学习到的主机MAC替换原来的全F的广播MAC,从而将广播变为单播进行转发。
Host1和Host2属于同一子网,但是部署在不同的VTEP下。ARP广播变单播过程如下:
Leaf2通过Host2发送的ARP报文,可以学习到Host2的ARP表项。然后Leaf2可以根据ARP生成相应的ARP广播抑制表,并通过EVPN向Leaf1发布,这样Leaf1也可以学习到Host2的主机信息。
Host1初次访问Host2,发送ARP广播请求来获取Host2的MAC地址。
Leaf1收到ARP广播请求后,查询ARP广播抑制表。因为已经有Host2的主机信息,所以Leaf1将ARP请求报文中的全F的广播目的MAC替换为Host2的MAC地址,将ARP广播变为ARP单播,然后再进行VXLAN封装后向Leaf2发送。
如果Leaf1上没有Host2的ARP广播抑制表,那么依然按照正常的流程进行广播。
Leaf2收到VXLAN报文并解封装后,将ARP请求发送给Host2。
可以看出ARP广播变单播功能强依赖于三层网关,需要三层网关学习到主机的ARP信息,如果三层网关学习不到主机ARP,就不能抑制ARP广播。
ARP二层代答
ARP广播变单播的抑制方式需要三层网关的存在,在纯二层网络中,由于不存在三层网关,没有相应的ARP表项,也就无法生成ARP广播抑制表进行ARP抑制。上述二层场景面临的ARP抑制问题,就可以通过ARP二层代答功能来解决。
ARP二层代答的实现思路是在二层网关上收到主机ARP报文,获取ARP报文中的主机信息并生成ARP广播抑制表,然后通过EVPN将主机信息发送给其他二层网关;二层网关在收到ARP广播请求后,根据ARP广播抑制表中的主机信息,直接进行ARP代答。
ARP二层代答是一种有效减少ARP广播报文的机制。使能ARP二层代答之后,二层网关设备在收到ARP请求之后,优先尝试本地代答,只有当本地无法代答时,才会进行广播。
Host1和Host2属于同一子网,在二层网关设备开启基于BD的ARP二层代答之后,ARP二层代答过程如下:
Leaf2上开启ARP二层代答功能后,Leaf2会检测主机发送的ARP报文。当Leaf2接收到Host2的ARP报文后,可以根据ARP生成相应的ARP广播抑制表项,并通过EVPN向Leaf1发布,这样Leaf1也可以学习到Host2的主机信息。
Host1初次访问Host2,发送ARP广播请求来获取Host2的MAC地址。
Leaf1收到ARP广播请求后,查询ARP广播抑制表。因为已经有Host2的主机信息,所以Leaf1直接对ARP请求进行代答。
如果Leaf1上没有Host2的ARP广播抑制表,那么依然按照正常的流程进行广播。
配置举例
集中式网关部署
之前的 VXLAN笔记 中使用的是手工配置的方式,这次用EVPN的方式部署
服务器1上的VM1属于VLAN 10,服务器2上的VM1属于VLAN 20,服务器3上的VM1属于VLAN 30。服务器1和服务器2位于不同网段,服务器3和服务器2位于相同网段。现需要通过VXLAN三层网关实现不同数据中心相同名称VM的互通。
配置数据:
- VM所属的VLAN ID分别是VLAN 10、VLAN 20和VLAN 30。
- 网络中设备互连的接口IP地址。
- 网络中使用的IGP(Internal Gateway Protocol)路由类型是OSPF(Open Shortest Path First)。
- 广播域BD ID分别是BD 10和BD 20。
- VXLAN网络标识VNI ID分别是VNI 5010和VNI 5020。
- EVPN实例的RD值为10:11、10:12、10:21、10:22和10:31,RT值为100:5010和100:5020。
配置过程:
分别在Device1、Device2和Device3上配置OSPF路由协议,保证网络三层互通。(这里不再赘述) 主要是将各自的Loopback接口地址进行发布,为后面的BGP EVPN建立对等体关系铺垫。
分别在Device1和Device3上配置业务接入点实现区分业务流量。 以Device1为例,3的配置类似:
[~Device1] bridge-domain 10 [*Device1-bd10] quit [*Device1] interface 10ge 1/0/2.1 mode l2 //创建二层子接口,并设置接口类型,加入BD域,与手工配置一样 [*Device1-10GE1/0/2.1] encapsulation dot1q vid 10 [*Device1-10GE1/0/2.1] bridge-domain 10 [*Device1-10GE1/0/2.1] quit [*Device1] bridge-domain 20 [*Device1-bd20] quit [*Device1] interface 10ge 1/0/3.1 mode l2 [*Device1-10GE1/0/3.1] encapsulation dot1q vid 30 [*Device1-10GE1/0/3.1] bridge-domain 20 [*Device1-10GE1/0/3.1] quit [*Device1] commit
使能EVPN作VXLAN控制平面功能。 以Device1为例,2和3类似
[~Device1] evpn-overlay enable [*Device1] commit
配置BGP EVPN对等体关系。 Device2和3类似
[~Device1] bgp 100 [*Device1-bgp] router-id 2.2.2.2 [*Device1-bgp] peer 3.3.3.3 as-number 100 [*Device1-bgp] peer 3.3.3.3 connect-interface LoopBack1 [*Device1-bgp] peer 4.4.4.4 as-number 100 [*Device1-bgp] peer 4.4.4.4 connect-interface LoopBack1 [*Device1-bgp] l2vpn-family evpn [*Device1-bgp-af-evpn] peer 3.3.3.3 enable Warning: This operation will reset the peer session. Continue? [Y/N]: y [*Device1-bgp-af-evpn] peer 4.4.4.4 enable Warning: This operation will reset the peer session. Continue? [Y/N]: y [*Device1-bgp-af-evpn] quit [*Device1-bgp] quit [*Device1] commit
配置EVPN实例。
[~Device1] bridge-domain 10 [~Device1-bd10] vxlan vni 5010 [*Device1-bd10] evpn [*Device1-bd10-evpn] route-distinguisher 10:11 [*Device1-bd10-evpn] vpn-target 100:5010 [*Device1-bd10-evpn] quit [*Device1-bd10] quit [*Device1] bridge-domain 20 [*Device1-bd20] vxlan vni 5020 [*Device1-bd20] evpn [*Device1-bd20-evpn] route-distinguisher 10:12 [*Device1-bd20-evpn] vpn-target 100:5020 [*Device1-bd20-evpn] quit [*Device1-bd20] quit [*Device1] commit
配置头端复制功能。
[~Device1] interface nve 1 [*Device1-Nve1] source 2.2.2.2 [*Device1-Nve1] vni 5010 head-end peer-list protocol bgp //手工配置中要指定对端的VTEP IP地址,而EVPN通过BGP自动发现并建立隧道 [*Device1-Nve1] vni 5020 head-end peer-list protocol bgp [*Device1-Nve1] quit [*Device1] commit
在Device2上配置VXLAN三层网关。
[~Device2] interface vbdif 10 [*Device2-Vbdif10] ip address 192.168.10.10 24 [*Device2-Vbdif10] quit [*Device2] interface vbdif 20 [*Device2-Vbdif20] ip address 192.168.20.10 24 [*Device2-Vbdif20] quit [*Device2] commit
分布式网关部署
服务器1上的VM1属于VLAN 10,服务器2上的VM1属于VLAN 20,且位于不同网段;服务器1通过Device2和Device4接入VXLAN网络。现需要通过VXLAN分布式网关实现不同数据中心相同名称VM的互通。其中Device1部署在AS 100,Device2、Device4部署在AS 200,Device3部署在AS 300,Device1、Device2、Device3、Device4使用AS 100作为BGP EVPN的进程号。
数据准备:
设备 | RD值 | RT值 |
---|---|---|
Device2 | EVPN实例:10:2VPN实例:20:2 | EVPN实例:ERT/IRT:100:10ERT:100:5010 VPN实例:ERT/IRT(EVPN):100:5010 |
Device3 | EVPN实例:10:3VPN实例:20:3 | EVPN实例:ERT/IRT:100:20ERT:100:5010 VPN实例:ERT/IRT(EVPN):100:5010 |
Device4 | EVPN实例:10:4VPN实例:20:4 | EVPN实例:ERT/IRT:100:10ERT:100:5010 VPN实例:ERT/IRT(EVPN):100:5010 |
VPN实例和EVPN实例的RT值配置原则如下图所示,其中:
- 在VPN实例中,需要配置带EVPN参数的ERT Y和IRT Y,用于和对端EVPN实例交叉,生成主机路由。如果还需要与普通L3VPN实例交互,请根据需要配置普通的ERT和IRT。
- 在EVPN实例中,除了针对不同的BD配置不同的ERT A、ERT B和IRT A、IRT B外,还必须配置用来和对端VPN实例交叉的ERT Y。一般情况下不需要配置IRT Y,否则会导致不同BD下的EVPN实例相互扩散MAC地址。
配置过程:
分别在Device1与Device2、Device3、Device4间配置EBGP路由协议。(底层用BGP打通) BGP配置不再赘述,需要注意的的是,Device2和4属于同一AS,因此为了能互相通告路由,两台设备需要配置peer x.x.x.x allow-as-loop,
x.x.x.x
为Device1连接Device2/4对应接口ip将Device2和Device4配置为根桥,配置相同的桥ID。
在Device2与Device4之间配置M-LAG。 配置Eth-Trunk,lacp-static,V-STP,绑定DFS Group。
分别在Device2、Device3和Device4上配置业务接入点实现区分业务流量。 跟集中式网关类似,不再赘述。
使能EVPN作VXLAN控制平面。 同上
在Device2、Device3和Device4上建立与Device1之间的EVPN IBGP对等体关系。 以Device2为例,其余类似
[~Device2] bgp 100 instance evpn1 //由于底层是BGP打通,因此在创建EVPN IBGP对等体关系时要使用 'instance' [*Device2-bgp-instance-evpn1] router-id 2.2.2.2 [*Device2-bgp-instance-evpn1] peer 1.1.1.1 as-number 100 [*Device2-bgp-instance-evpn1] peer 1.1.1.1 connect-interface LoopBack0 [*Device2-bgp-instance-evpn1] l2vpn-family evpn [*Device2-bgp-instance-evpn1-af-evpn] peer 1.1.1.1 enable Warning: This operation will reset the peer session. Continue? [Y/N]: y [*Device2-bgp-instance-evpn1-af-evpn] quit [*Device2-bgp-instance-evpn1] quit [*Device2] commit
在Device1上建立与Device2、Device3和Device4之间的BGP EVPN对等体关系,并配置反射器功能。
[~Device1] bgp 100 instance evpn1 [*Device1-bgp-instance-evpn1] router-id 1.1.1.1 [*Device1-bgp-instance-evpn1] peer 2.2.2.2 as-number 100 [*Device1-bgp-instance-evpn1] peer 2.2.2.2 connect-interface LoopBack0 [*Device1-bgp-instance-evpn1] peer 3.3.3.3 as-number 100 [*Device1-bgp-instance-evpn1] peer 3.3.3.3 connect-interface LoopBack0 [*Device1-bgp-instance-evpn1] peer 4.4.4.4 as-number 100 [*Device1-bgp-instance-evpn1] peer 4.4.4.4 connect-interface LoopBack0 [*Device1-bgp-instance-evpn1] l2vpn-family evpn [*Device1-bgp-instance-evpn1-af-evpn] peer 2.2.2.2 enable Warning: This operation will reset the peer session. Continue? [Y/N]: y [*Device1-bgp-instance-evpn1-af-evpn] peer 2.2.2.2 reflect-client [*Device1-bgp-instance-evpn1-af-evpn] peer 3.3.3.3 enable Warning: This operation will reset the peer session. Continue? [Y/N]: y [*Device1-bgp-instance-evpn1-af-evpn] peer 3.3.3.3 reflect-client [*Device1-bgp-instance-evpn1-af-evpn] peer 4.4.4.4 enable Warning: This operation will reset the peer session. Continue? [Y/N]: y [*Device1-bgp-instance-evpn1-af-evpn] peer 4.4.4.4 reflect-client [*Device1-bgp-instance-evpn1-af-evpn] undo policy vpn-target [*Device1-bgp-instance-evpn1-af-evpn] quit [*Device1-bgp-instance-evpn1] quit [*Device1] commit
在Device2、Device3和Device4上配置VPN实例和EVPN实例。
以Device2为例
[~Device2] ip vpn-instance vpn1 [*Device2-vpn-instance-vpn1] vxlan vni 5010 [*Device2-vpn-instance-vpn1] ipv4-family [*Device2-vpn-instance-vpn1-af-ipv4] route-distinguisher 20:2 [*Device2-vpn-instance-vpn1-af-ipv4] vpn-target 100:5010 evpn [*Device2-vpn-instance-vpn1-af-ipv4] quit [*Device2-vpn-instance-vpn1] quit [*Device2] bridge-domain 10 [*Device2-bd10] vxlan vni 10 [*Device2-bd10] evpn [*Device2-bd10-evpn] route-distinguisher 10:2 [*Device2-bd10-evpn] vpn-target 100:10 [*Device2-bd10-evpn] vpn-target 100:5010 export-extcommunity [*Device2-bd10-evpn] quit [*Device2-bd10] quit [*Device2] commit
分别在Device2、Device3、Device4上使能头端复制功能。 其中Device3不需要配置MAC地址,而2和4由于是双活接入设备的网关,因此MAC和IP地址应该相同
[~Device2] interface nve 1 [*Device2-Nve1] source 2.2.2.210 [*Device2-Nve1] mac-address 0000-5e00-0101 [*Device2-Nve1] vni 10 head-end peer-list protocol bgp [*Device2-Nve1] quit [*Device2] commit
在Device2、Device3、Device4上配置VXLAN三层网关。
Device2的Vbdif接口的IP地址要与Device3的属于不同网段,Device2与Device4要配置相同的Vbdif接口的IP地址和MAC地址,Device3的Vbdif接口不需要配置MAC地址
[~Device2] interface vbdif10 [*Device2-Vbdif10] ip binding vpn-instance vpn1 [*Device2-Vbdif10] ip address 10.1.1.1 255.255.255.0 [*Device2-Vbdif10] mac-address 0000-5e00-0102 [*Device2-Vbdif10] vxlan anycast-gateway enable [*Device2-Vbdif10] arp collect host enable [*Device2-Vbdif10] quit [*Device2] commit
在Device1与Device2、Device3、Device4之间配置BGP对邻居发布IRB类型的路由。
[~Device1] bgp 100 instance evpn1 [~Device1-bgp-instance-evpn1] l2vpn-family evpn [~Device1-bgp-instance-evpn1-af-evpn] peer 2.2.2.2 advertise irb [*Device1-bgp-instance-evpn1-af-evpn] peer 3.3.3.3 advertise irb [*Device1-bgp-instance-evpn1-af-evpn] peer 4.4.4.4 advertise irb [*Device1-bgp-instance-evpn1-af-evpn] quit [*Device1-bgp-instance-evpn1] quit [*Device1] commit
在Device2与Device3、Device4之间配置BGP对邻居发布IP前缀路由
[~Device2] bgp 100 instance evpn1 [~Device2-bgp-instance-evpn1] ipv4-family vpn-instance vpn1 [*Device2-bgp-instance-evpn1-vpn1] import-route direct [*Device2-bgp-instance-evpn1-vpn1] advertise l2vpn evpn [*Device2-bgp-instance-evpn1-vpn1] quit [*Device2-bgp-instance-evpn1] quit [*Device2] commit