VXLAN基本概念
VXLAN是NVO3中的一种网络虚拟化技术,通过将虚拟机发出的数据包封装在UDP中,并使用物理网络的IP、MAC作为outer-header进行封装,然后在IP网络上传输,到达目的地后由隧道终结点解封装并将数据发送给目标虚拟机。

图1 VXLAN结构示意图
通过VXLAN,虚拟网络可接入大量租户,且租户可以规划自己的虚拟网络,不需要考虑物理网络IP地址和广播域的限制,降低了网络管理的难度。 表1介绍VXLAN相关概念。
概念 描述 租户 租户是数据中心、园区等企业网络业务的购买者,可以是运营商、服务提供商或使用服务的最终用户等。当购买网络业务的租户是运营商或服务提供商时,那么租户通常获得的是利用VXLAN技术构建的虚拟网络,此时一个租户对应一个VNI。 Underlay网络和Overlay网络 VXLAN技术将已有的物理网络作为Underlay网络,在其上构建出虚拟的二层或三层网络,即Overlay网络。Overlay网络通过封装技术、利用Underlay网络提供的三层转发路径,实现租户报文在不同站点间传递。对于租户来说,Underlay网络是透明的,只能感知到Overlay网络。 NVE(Network Virtualization Edge) 网络虚拟边缘节点NVE,实现网络虚拟化功能的网络实体。报文经过NVE封装转换后,NVE间就可基于三层基础网络建立二层虚拟化网络。(说明:设备和服务器上的虚拟交换机VSwitch都可以作为NVE。)按照NVE部署位置的不同,可以分为以下三种模式:硬件模式:所有的NVE都部署在支持NVE的设备上,所有的VXLAN报文封装与解封装都在设备上进行。软件模式:所有的NVE都部署在vSwitch上,所有的VXLAN报文封装与解封装都在vSwitch上进行。混合模式:部分NVE部署在vSwitch上,部分NVE部署在支持NVE的设备上,在vSwitch和设备上都有可能会进行VXLAN报文封装与解封装。 VTEP(VXLAN Tunnel Endpoints VTEP是VXLAN隧道端点,封装在NVE中,用于VXLAN报文的封装和解封装。VTEP与物理网络相连,分配有物理网络的IP地址,该地址与虚拟网络无关。VXLAN报文中源IP地址为本节点的VTEP地址,VXLAN报文中目的IP地址为对端节点的VTEP地址,一对VTEP地址就对应着一个VXLAN隧道。 VNI(VXLAN Network Identifier) VXLAN网络标识VNI类似VLAN ID,用于区分VXLAN段,不同VXLAN段的虚拟机不能直接二层相互通信。一个VNI表示一个租户,即使多个终端用户属于同一个VNI,也表示一个租户。VNI由24比特组成,支持多达16M的租户。在分布式网关部署场景下,VNI分为二层VNI和三层VNI。二层VNI是普通的VNI,以1:1方式映射到广播域BD,实现VXLAN报文同子网的转发。三层VNI和VPN实例进行关联,用于VXLAN报文跨子网的转发。 BD(Bridge Domain) BD是VXLAN网络中转发数据报文的二层广播域。在VXLAN网络中,将VNI以1:1方式映射到广播域BD,BD成为VXLAN网络转发数据报文的实体。 VBDIF接口(Virtual Bridge Domain Interface) 基于BD创建的三层逻辑接口。通过VBDIF接口配置IP地址可实现不同网段的VXLAN间,及VXLAN和非VXLAN的通信,也可实现二层网络接入三层网络。 VAP(Virtual Access Point) 虚拟接入点VAP,即VXLAN业务接入点,可以是二层子接口或VLAN:当接入节点是二层子接口时,通过在二层子接口上配置流封装类型实现不同的接口接入不同的数据报文,将二层子接口关联广播域BD后,可实现数据报文通过BD转发。当业务接入点是VLAN时,需要将VLAN绑定到广播域BD,也可以实现数据报文通过BD转发。 网关(Gateway) 和VLAN类似,不同VNI之间的VXLAN,及VXLAN和非VXLAN之间不能直接相互通信。为了使VXLAN之间,以及VXLAN和非VXLAN之间能够进行通信,VXLAN引入了VXLAN网关。VXLAN网关分为:二层网关:用于解决租户接入VXLAN虚拟网络的问题,也可用于同一VXLAN虚拟网络的子网通信。三层网关:用于VXLAN虚拟网络的跨子网通信以及外部网络的访问。
VXLAN报文格式
VXLAN是MAC in UDP的网络虚拟化技术,所以其报文封装是在原始以太报文之前添加了一个UDP封装及VXLAN头封装。具体报文格式如图2所示。

图2 VXLAN报文格式
表2 VXLAN报文格式说明
字段 描述 VXLAN header VXLAN Flags:8比特,取值为00001000。VNI:VXLAN网络标识,24比特,用于区分VXLAN段。Reserved:24比特和8比特,必须设置为0。 Outer UDP header DestPort:目的UDP端口号是4789。Source Port:源端口号是内层报文通过哈希算法计算后的值。 Outer IP header IP SA:源IP地址是VXLAN隧道本端VTEP的IP地址。IP DA:目的IP地址是VXLAN隧道远端VTEP的IP地址。如果Underlay网络为IPv4网络,VTEP IP为IPv4类型;如果Underlay网络为IPv6网络,VTEP IP为IPv6类型 Outer Ethernet header MAC DA:在发送报文的虚拟机所属VTEP上根据目的VTEP地址查找路由表,路由表中下一跳IP地址对应的MAC地址。MAC SA:发送报文的虚拟机所属VTEP的MAC地址。802.1Q Tag:可选字段,该字段为报文中携带的VLAN Tag。Ethernet Type:以太报文类型。
VXLAN接入方式
在VXLAN网络中,将VNI以1:1方式映射到广播域BD。当报文到达VTEP后,VTEP只要能够识别出报文所属的BD,就能够选择正确的VXLAN隧道进行转发。VTEP有两种方式识别报文所属的VXLAN。
基于VLAN识别报文所属的VXLAN
如图所示,基于网络规划,在VTEP上建立VLAN与BD的一对一映射。这样,当VTEP收到业务侧报文后,根据VLAN与BD以及BD与VNI的对应关系即能够选择相应的VXLAN隧道进行转发。

基于报文流封装类型识别报文所属的VXLAN
报文的流封装类型可概括地分为携带指定VLAN Tag与不携带VLAN Tag两种。基于此,在VTEP连接下行业务的物理接口上创建二层子接口,并配置二层子接口对报文的不同处理方式,同时将二层子接口与BD进行一一映射。这样业务侧报文到达VTEP后,即会进入指定的二层子接口。VTEP即能够根据二层子接口与BD的映射关系,以及BD与VNI的映射关系,选择正确的VXLAN隧道进行报文转发。
不同流封装类型的二层子接口对报文的处理方式如表所示。
流封装类型 说明 dot1q 对于带有一层VLAN Tag的报文,该类型接口只接收与指定VLAN Tag匹配的报文;对于带有两层VLAN Tag的报文,该类型接口只接收外层VLAN Tag与指定VLAN Tag匹配的报文。该类型接口在对原始报文进行VXLAN封装时,会剥离最外层的VLAN Tag;在解封装VXLAN报文时,会添加指定的VLAN Tag后再转发。配置流封装类型为dot1q时,存在如下限制:二层子接口封装的vid,不能与对应二层主接口允许通过的VLAN相同,也不能与MUX VLAN中的VLAN相同。二层子接口和三层子接口封装的VLAN ID不能相同。同一主接口下的Dot1q的二层子接口VLAN ID不能重叠。 untag 该类型接口只接收不带VLAN Tag的报文。该类型接口在对原始报文进行VXLAN封装时,不会为其添加任何VLAN Tag;对于CE12800在解封装VXLAN报文时,如果其内层报文带有VLAN Tag,则将其VLAN Tag剥离(对于QinQ报文,只剥离其外层VLAN Tag)后再转发。配置流封装类型为untag时,存在如下限制:请确保该二层子接口对应的物理接口上没有任何配置,且对应的物理接口已退出默认VLAN。仅支持为二层物理接口(包括Eth-Trunk接口)创建untag类型二层子接口。一个主接口下仅允许创建一个untag类型的二层子接口。 qinq 该类型接口只接收带有指定两层VLAN Tag的报文。该类型接口在对原始报文进行VXLAN封装时,如果配置的二层子接口的VLAN Tag操作为剥除两层VLAN Tag操作,则将报文的所有VLAN Tag全部剥离,如果不配置二层子接口的VLAN Tag操作为剥除两层VLAN Tag操作,则将报文的VLAN Tag全部保留;在解封装VXLAN报文时,如果配置的二层子接口的VLAN Tag操作为剥除两层VLAN Tag操作,则添加指定的两层VLAN Tag后再转发,如果不配置二层子接口的VLAN Tag操作为剥除两层VLAN Tag操作,则保持报文的VLAN Tag不变直接转发。QinQ二层子接口上封装的外层VLAN不能和对应二层主接口配置的缺省VLAN以及允许通过的VLAN相同。 default 允许接口接收所有报文,不区分报文中是否带VLAN Tag。不论是对原始报文进行VXLAN封装,还是解封装VXLAN报文,该类型接口都不会对原始报文进行任何VLAN Tag处理,包括添加、替换或剥离。配置流封装类型为default时,存在如下限制:必须确保对应的主接口没有加入VLAN。仅支持为二层物理接口(包括Eth-Trunk接口)创建default类型二层子接口。一个主接口下仅允许创建一个default类型的二层子接口,创建后不允许再创建其他类型二层子接口。
如图所示,VTEP基于物理接口10GE1/0/1有两个子接口,不同的流封装类型与不同的BD进行绑定。VM 1属于VLAN 10,VM 2不带VLAN tag。为了区分两种报文,就必须要在10GE1/0/1上分别创建dot1q和untag类型的二层子接口:
- 创建二层子接口10GE1/0/1.10流封装类型为dot1q,允许携带指定VLAN Tag为10的报文进入VXLAN隧道。
- 创建二层子接口10GE1/0/1.20流封装类型为untag,允许不携带VLAN Tag的报文进入VXLAN隧道。
当VM 1或VM 2的报文到达VTEP时,根据报文的Tag情况选择进入不同的二层子接口。之后,VTEP根据子接口与BD,以及BD与VNI的映射关系,即能够选择正确的VXLAN隧道进行报文转发。

VXLAN网关划分
和VLAN类似,不同VNI之间的VXLAN,及VXLAN和非VXLAN之间不能直接相互通信。为了使VXLAN之间,以及VXLAN和非VXLAN之间能够进行通信,VXLAN引入了VXLAN网关。
VXLAN网关分为:
- 二层网关:用于解决租户接入VXLAN虚拟网络的问题,也可用于同一VXLAN虚拟网络的子网通信。
- 三层网关:用于VXLAN虚拟网络的跨子网通信以及外部网络的访问。
根据三层网关部署方式的不同,VXLAN三层网关又可以分为集中式网关和分布式网关。
集中式网关部署
集中式网关是指将三层网关集中部署在一台设备上,如图所示,所有跨子网的流量都经过三层网关进行转发,实现流量的集中管理。

部署集中式网关的优点和缺点如下:
优点:
- 对跨子网流量进行集中管理,网关的部署和管理比较简单。
缺点:
- 转发路径不是最优:同一二层网关下跨子网的数据中心三层流量都需要经过集中三层网关转发。
- ARP表项规格瓶颈:由于采用集中三层网关,通过三层网关转发的终端租户的ARP表项都需要在三层网关上生成,而三层网关上的ARP表项规格有限,这不利于数据中心网络的扩展。
分布式网关部署
产生原因
通过部署分布式网关可以解决集中式网关部署的缺点。VXLAN分布式网关是指在典型的“Spine-Leaf”组网结构下,将Leaf节点作为VXLAN隧道端点VTEP,每个Leaf节点都可作为VXLAN三层网关,Spine节点不感知VXLAN隧道,只作为VXLAN报文的转发节点。 如图所示,Server1和Server2不在同一个网段,但是都连接到一个Leaf节点。Server1和Server2通信时,流量只需要在Leaf1节点进行转发,不再需要经过Spine节点。

Spine节点:
- 关注于高速IP转发,强调的是设备的高速转发能力。
Leaf节点:
- 作为VXLAN网络中的二层网关设备,与物理服务器或VM对接,用于解决终端租户接入VXLAN虚拟网络的问题。
- 作为VXLAN网络中的三层网关设备,进行VXLAN报文封装/解封装,实现跨子网的终端租户通信,以及外部网络的访问。
分布式网关的特点
VXLAN分布式网关具有如下特点:
- 同一个Leaf节点既可以做VXLAN二层网关,也可以做VXLAN三层网关,部署灵活。
- Leaf节点只需要学习自身连接服务器的ARP表项,而不必像集中三层网关一样,需要学习所有服务器的ARP表项,解决了集中式三层网关带来的ARP表项瓶颈问题,网络规模扩展能力强。
EVPN基本原理
介绍
EVPN(Ethernet Virtual Private Network)是一种用于二层网络互联的VPN技术。EVPN技术采用类似于BGP/MPLS IP VPN的机制,在BGP协议的基础上定义了一种新的NLRI(Network Layer Reachability Information,网络层可达信息)即EVPN NLRI,EVPN NLRI定义了几种新的BGP EVPN路由类型,用于处在二层网络的不同站点之间的MAC地址学习和发布。
原有的VXLAN实现方案没有控制平面,是通过数据平面的流量泛洪进行VTEP发现和主机信息(包括IP地址、MAC地址、VNI、网关VTEP IP地址)学习的,这种方式导致数据中心网络存在很多泛洪流量。为了解决这一问题,VXLAN引入了EVPN作为控制平面,通过在VTEP之间交换BGP EVPN路由实现VTEP的自动发现、主机信息相互通告等特性,从而避免了不必要的数据流量泛洪。
综上所述,EVPN通过扩展BGP协议新定义了几种BGP EVPN路由,这些BGP EVPN路由可以用于传递VTEP地址和主机信息,因此EVPN应用于VXLAN网络中,可以把原本依赖数据平面的VTEP发现和主机信息学习从数据平面转移到控制平面。
BGP EVPN路由
在EVPN NLRI中定义了如下几种应用于VXLAN控制平面的BGP EVPN路由类型:
Type2路由——MAC/IP路由
该类型路由的报文格式如下图所示:

各字段的解释如下表所示:

该类型路由在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)类型路由。
ARP类型路由携带的有效信息有:主机MAC地址+主机IP地址+二层VNI;IRB类型路由携带的有效信息有:主机MAC地址+主机IP地址+二层VNI+三层VNI。因此,IRB类型路由包含着ARP类型路由,不仅可以用于主机IP路由通告,也能用于主机ARP通告。
说明:
ARP类型路由携带的有效信息有:主机MAC地址+主机IP地址+二层VNI;IRB类型路由携带的有效信息有:主机MAC地址+主机IP地址+二层VNI+三层VNI。因此,IRB类型路由包含着ARP类型路由,不仅可以用于主机IP路由通告,也能用于主机ARP通告。
ND表项扩散
MAC/IP路由可以同时携带主机MAC地址+主机IPv6地址,因此该路由可以用来在VTEP之间传递ND表项,实现ND表项扩散。其中,MAC Address字段为主机MAC地址,IP Address字段为主机IPv6地址。此时的MAC/IP路由也称为ND类型路由。ND表项扩散主要用于以下场景(详细描述请参见VXLAN网络NS组播抑制):
. 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类型路由。
说明:
ND类型路由携带的有效信息有:主机MAC地址+主机IPv6地址+二层VNI;IRBv6类型路由携带的有效信息有:主机MAC地址+主机IPv6地址+二层VNI+三层VNI。因此,IRBv6类型路由包含着ND类型路由,不仅可以用于主机IPv6路由通告,也能用于ND表项扩散。
Type3路由——Inclusive Multicast路由
该类型路由是由前缀和PMSI属性组成,报文格式如下图所示:


该类型路由在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报文转发。
Type5路由——IP前缀路由
该类型路由的报文格式如下图所示:

各字段的解释如下表所示:

该类型路由的IP Prefix Length和IP Prefix字段既可以携带主机IP地址,也可以携带网段地址:
. 当携带主机IP地址时,该类型路由在VXLAN控制平面中的作用与IRB类型路由是一样的,主要用于分布式网关场景中的主机IP路由通告。
. 当携带网段地址时,通过传递该类型路由,可以实现VXLAN网络中的主机访问外部网络。