VXLAN中提到,除了手工配置VXLAN隧道,还可以使用EVPN作为VXLAN的控制平面,从而避免网路中存在大量的泛洪流量。

BGP-EVPN地址族

EVPN技术采用类似于BGP/MPLS IP VPN的机制,在BGP协议的基础上定义了一种新的网络层可达信息NLRI(Network Layer Reachability Information)即EVPN NLRI,EVPN NLRI定义了几种新的BGP EVPN路由类型,用于处在二层网络的不同站点之间的MAC地址学习和发布

MP-BGP

传统的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信息

报文格式及各字段意义说明如下:

image-20220812100350383
字段 说明
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通告主要用于以下两种场景:

    1. ARP广播抑制。当三层网关学习到其子网下的主机ARP时,生成主机信息(包含主机IP地址、主机MAC地址、二层VNI、网关VTEP IP地址),然后通过传递ARP类型路由将主机信息同步到二层网关上。这样当二层网关再收到ARP请求时,先查找是否存在目的IP地址对应的主机信息,如果存在,则直接将ARP请求报文中的广播MAC地址替换为目的单播MAC地址,实现广播变单播,达到ARP广播抑制的目的。
    2. 分布式网关场景下的虚拟机迁移。当一台虚拟机从当前网关迁移到另一个网关下之后,新网关学习到该虚拟机的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中。

image-20220812103240964
字段 说明
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掩码长度的网段路由。

image-20220812103518426
字段 说明
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路由交互实现,减少泛洪流量。

image-20220812104452334

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只是减少了网络中的流量泛洪,并不会完全避免,例如在以下一些场景:

  1. 网络中存在“静默”主机的情况,这种情况下主机不会触发ARP、DHCP等行为,导致VTEP学习不到本地主机MAC地址,从而也就无法发送MAC地址信息让其他VTEP学习到。
  2. 主机首次通信的过程中,主机会发送ARP广播请求报文,这种也会产生泛洪。这种情况还可以通过ARP广播抑制功能来避免泛洪

同子网VXLAN隧道的建立

VXLAN隧道由一对VTEP确定,在同子网互通场景下,因为只需要在同一个二层广播域(BD)内互通,所以只要两端VTEP的IP地址路由可达,VXLAN隧道就可以建立。通过EVPN动态建立VXLAN隧道,就是在两端VTEP之间建立BGP EVPN对等体,然后对等体之间通过交互Type3路由来互相传递VNI和VTEP IP地址信息,从而实现动态建立VXLAN隧道。

image-20220812111613043

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。

image-20220812112833631

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实例下的路由表来进行转发。

思考?
(这里我觉得在集中式网关中应该也要搞个VRF来区分不同租户,尽管三层网关是一个独立设备,它会知道它下接的所有VTEP的主机IP,可能不同租户用不同的设备作为网关可以实现隔离,仅个人猜想,未证实)
[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信息,处理过程如下:

  1. 检查该路由的ERT与接收端EVPN实例的IRT是否相同。如果相同,则接收该路由,同时EVPN实例提取其中包含的主机IP+MAC信息,用于主机ARP通告。
  2. 检查该路由的ERT与接收端L3VPN实例的IRT是否相同(如下表中的举例所示)。如果相同,则接收该路由,同时L3VPN实例提取其中的主机IP地址+三层VNI信息,在其路由表中生成Host1的路由。该路由的下一跳会被设置为Leaf1的VXLAN隧道接口。
  3. 接收端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路由类似。

如果网关设备下连接的网段在整个网络中唯一,则可以配置发布网段路由,否则不能配置发布网段路由。

image-20220812140811957
  1. Leaf1收集到本地IP网段路由,把该IP网段路由通过EVPN Type5路由发送给Leaf2。路由中携带有IP前缀、掩码长度、对应VRF的三层VNI等信息(如上图表格所示)。

  2. 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 #
RT的相关问题

在同子网和跨子网中,可以看到EVPN实例和L3VPN实例中都有RT值,而且EVPN中RT不止一个,令人疑惑。

在弄懂RT前,要搞懂EVPN实例和L3VPN的作用和区别。

EVPN一大特点就是在控制平面获取MAC/IP路由信息,而要接收这些路由信息,就是通过EVPN实例来获取和保存,EVPN实例作为发布路由信息的一个“主体”,相较于L3VPN实例的“IP VRF”,EVPN实例可以用“MAC VRF”来理解。两个实例引入路由的条件都是IRT=路由的ERT,以跨子网建立隧道为例子,Leaf1发布的路由有100:5000100: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实例中找路由进行转发。

结合后文的配置举例中可以更好理解

流量转发过程

同子网单播报文转发

同子网报文转发为二层转发,只在VXLAN二层网关之间进行,三层网关无需感知。

image-20220812140935155
  1. Host1发送目的地址为Host2的报文。如果Host1没有Host2的MAC地址,会先发送广播ARP请求来获取Host2的MAC地址,此处该过程不再详述,认为Host1已经获取了Host2的MAC地址。
  2. Leaf1收到Host1的报文后,根据报文入端口或VLAN信息判断其所属的BD,并在该BD内查找出接口(通过上一节使用EVPN学习MAC地址可以知道,Leaf1上会学习到Host2的MAC地址,出接口为VTEP 2.2.2.2)。然后Leaf1会对报文进行VXLAN封装后转发。
  3. Leaf2接收到VXLAN报文后,根据报文中VNI获取二层广播域,进行VXLAN解封装,获取内层的二层报文。
  4. Leaf2根据内层报文的目的MAC地址,从本地MAC表中找到对应的出接口,然后转发给对应的主机Host2。

同子网BUM报文转发

如果是同子网的BUM报文(广播、组播、未知单播),则会向同子网的所有VTEP发送一份报文。

Host1向外发送广播报文。Leaf1收到Host1的广播报文后,根据报文入端口或VLAN信息判断其所属的BD,并在该BD内查找所有的隧道列表,依据获取的隧道列表进行报文封装后,向所有隧道发送报文,从而将报文转发至同子网的Host2和Host3。

image-20220812141254958

跨子网报文转发

在分布式网关场景下,Leaf1、Leaf2作为VXLAN的三层网关,进行VXLAN封装及三层转发,Spine仅作为VXLAN报文转发节点,不进行VXLAN报文的处理。

image-20220812141415491
  1. 因为Host1与Host2属于不同网段,所以Host1会先将报文发送给网关(Leaf1),交由网关进行转发。
  2. Leaf1接收到来自Host1的报文,根据报文的目的地址判断需要进行三层转发。Leaf1根据报文入端口或VLAN信息判断其所属的BD,找到绑定该BD的L3VPN实例,然后在该L3VPN实例下查找路由表。在前面跨子网VXLAN隧道的建立和路由发布章节已经介绍过,在分布式网关场景下,网关Leaf1会学习到Host2的主机路由。Leaf1根据路由获取三层VNI、下一跳等信息,然后进行VXLAN封装,将报文转发至Leaf2。
  3. Leaf2收到VXLAN报文后进行解封装,根据报文携带的三层VNI找到对应的L3VPN实例,通过查找该L3VPN实例下的路由表,获取报文的下一跳是网关接口地址,然后将目的MAC地址替换为Host2的MAC地址,源MAC地址替换为Leaf2网关的MAC地址,转发给Host2。
华三的EVPN-VXLAN

华三的EVPN中,还将分布式网关分为对称非对称,对称即入口网关和出口网关处理方式一样,对于二层流量,入口网关和出口网关都只进行二层转发;对于三层流量,入口网关和出口网关都只进行三层转发。非对称则是入口网关需要同时进行二层和三层转发,而出口网关只进行二层转发(这种只能用于同一BD域,或者是同一二层VNI下)。

那既然非对称只能用于同一BD域(或者用华三的说法叫VXLAN ID),那直接进行二层转发就好了,为什么还要进行三层转发呢?

华三将流量转发分为“二三层转发”和“全三层转发”,全三层转发即将二层和三层的流量,都使用三层转发,显然,华为是区分二三层转发的。华三的全三层转发,需要在ARP应答时,将ARP应答中的MAC设置为网关的MAC地址(虚接口的IP),这样二三层的流量都会先发给网关,然后再通过网关进行三层转发。对称转发中使用VTEP的Router MAC作为源目地址,非对称转发和华为使用VBDIF的MAC作为源目地址。 image-20220817103850833

更多其他细节可以参考华三白皮书


更新:今天看到华为也有对称IRB和非对称IRB转发这个说法,与华三不同,华为的非对称IRB可以用于不同的子网,主机首先发送报文给网关(VTEP),VTEP根据EVPN的MAC、主机路由学习机制,能知道目的主机的MAC信息,将目的主机的MAC信息替换原目的MAC,并且使用目的主机的VNI,接着报文发送给对端VTEP,对端VTEP解封VXLAN,直接根据目的主机的MAC信息查找MAC表进行转发,整个过程即”入口三层出口二层“,但这样要求在所有的 VTEP 上配置所有的 VNI 及网关信息(因为 VTEP 需要同时连接非对称的两条 VXLAN 隧道)。这也就导致 VTEP 要学习到 VNI 所有的主机 MAC 信息(包括远端主机的 MAC),在网络中 VNI 或主机数量增加时,会 带来扩展性的问题。

image-20220817103808137

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,从而将广播变为单播进行转发。

image-20220812142824904

Host1和Host2属于同一子网,但是部署在不同的VTEP下。ARP广播变单播过程如下:

  1. Leaf2通过Host2发送的ARP报文,可以学习到Host2的ARP表项。然后Leaf2可以根据ARP生成相应的ARP广播抑制表,并通过EVPN向Leaf1发布,这样Leaf1也可以学习到Host2的主机信息。

  2. Host1初次访问Host2,发送ARP广播请求来获取Host2的MAC地址。

  3. Leaf1收到ARP广播请求后,查询ARP广播抑制表。因为已经有Host2的主机信息,所以Leaf1将ARP请求报文中的全F的广播目的MAC替换为Host2的MAC地址,将ARP广播变为ARP单播,然后再进行VXLAN封装后向Leaf2发送。

    如果Leaf1上没有Host2的ARP广播抑制表,那么依然按照正常的流程进行广播。

  4. 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请求之后,优先尝试本地代答,只有当本地无法代答时,才会进行广播。

image-20220812142940400

Host1和Host2属于同一子网,在二层网关设备开启基于BD的ARP二层代答之后,ARP二层代答过程如下:

  1. Leaf2上开启ARP二层代答功能后,Leaf2会检测主机发送的ARP报文。当Leaf2接收到Host2的ARP报文后,可以根据ARP生成相应的ARP广播抑制表项,并通过EVPN向Leaf1发布,这样Leaf1也可以学习到Host2的主机信息。

  2. Host1初次访问Host2,发送ARP广播请求来获取Host2的MAC地址。

  3. Leaf1收到ARP广播请求后,查询ARP广播抑制表。因为已经有Host2的主机信息,所以Leaf1直接对ARP请求进行代答。

    如果Leaf1上没有Host2的ARP广播抑制表,那么依然按照正常的流程进行广播。

配置举例

集中式网关部署

之前的VXLAN笔记中使用的是手工配置的方式,这次用EVPN的方式部署

image-20220812143212146

服务器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。

配置过程:

  1. 分别在Device1、Device2和Device3上配置OSPF路由协议,保证网络三层互通。(这里不再赘述) 主要是将各自的Loopback接口地址进行发布,为后面的BGP EVPN建立对等体关系铺垫。

  2. 分别在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
    
  3. 使能EVPN作VXLAN控制平面功能。 以Device1为例,2和3类似

    [~Device1] evpn-overlay enable
    [*Device1] commit
    
  4. 配置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
    
  5. 配置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
    
  6. 配置头端复制功能。

    [~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
    
  7. 在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
    

分布式网关部署

image-20220812192232740

服务器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地址。
image-20220812193604389

配置过程:

  1. 分别在Device1与Device2、Device3、Device4间配置EBGP路由协议。(底层用BGP打通) BGP配置不再赘述,需要注意的的是,Device2和4属于同一AS,因此为了能互相通告路由,两台设备需要配置peer x.x.x.x allow-as-loopx.x.x.x为Device1连接Device2/4对应接口ip

  2. 将Device2和Device4配置为根桥,配置相同的桥ID。

  3. 在Device2与Device4之间配置M-LAG。 配置Eth-Trunk,lacp-static,V-STP,绑定DFS Group。

  4. 分别在Device2、Device3和Device4上配置业务接入点实现区分业务流量。 跟集中式网关类似,不再赘述。

  5. 使能EVPN作VXLAN控制平面。 同上

  6. 在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
    
  7. 在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
    
  8. 在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
    
  9. 分别在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
    
  10. 在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
    
  11. 在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
    
  12. 在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
    

参考文章

什么是EVPN - 华为 (huawei.com)

EVPN技术白皮书-6W100-新华三集团-H3C