个人认为,理解报文就理解了协议。通过报文中的字段可以理解协议在交互过程中相关传递的信息,更加便于理解协议。
因此本文将以EVPN VXLAN分布式网关场景下报文交互过程为基础进行介绍,以详细介绍EVPN。
关于EVPN VXLAN的RFC,可参考2018年发布的RFC8365。
此外还有
EVPN MPLS2015年发布的RFC7432、
EVPN PBB2015年发布的RFC7623和
EVPN SRv62022年发布的RFC9252等多种方案。
Note:第一二章主要简介了概念内容。有相关基础可以直接阅读第后续章节。
有关EVPN的介绍可参考EVPN SRv6(2014年发布的RFC7209)。
简单来说,数据中心的发展要求建立大二层网络。而传统VPLS(Virtual Private LAN Service,虚拟私有局域网)无法很好利用多点到多点(MP2MP)标签交换路径(Lable Swithch Path,LSP)来优化多目标帧的传递。
并且提出了各种需求:冗余需求、多播优化需求、易于调配的需求、新的服务接口需求。以及快速收敛和泛洪抑制。
EVPN(Ethernet Virtual Private Network)的提出是利用BGP来传递二层或三层的网络层可达性信息,实现了转发面和控制面的分离。(三层主要使用MP-BGP扩展的Type-2路由传递路由信息,Type-5进行外部通信。)
传统的L2VPN主要通过ARP等流量手段进行Mac学习,无控制面参与。
EVPN的路由类型
EVPN基于MP-BGP,定义了一系列新的BGP EVPN路由类型,从而使EVPN网络中的不同站点间可以相互学习MAC地址信息。
主要有如下几种BGP EVPN路由:
Link Type | 作用 | 场景 |
---|---|---|
Type-1: Ethernet Auto-Discovery Route |
向其他的PE通告本端的PE对接入站点的MAC地址是否可达 | 主要用在快速收敛、冗余模式。水平分割场景,解决多归属网络中的流量负载分担问题。 |
Type-2: MAC/IP Advertisement Route |
站点的MAC和IP等信息通告 | 减少广播流和带宽资源的浪费 |
Type-3: inclusive Multicast Route |
发送多播地址可达信息来实现广播域内的成员互相发现 | 创建隧道的属性 |
Type-4: Ethernet Segment Route |
连接到相同CE和PE设备之间相互自动发现 | DF选举 |
Type-5: IP Prefix Route |
EVPN网络接入外部网络 | IP前缀的形式通告引用的外部路由 |
到目前为止EVPN还有Route Type 6:Selective Multicast Ethernet Tag route;
Route Type 7:Multicast Membership Report Synch route;Route Type 8:Multicast Leave Synch route。
VXLAN是大二层网络中广泛使用的网络虚拟化技术(NVO-Network Virtualization Over Layer 3),主要在服务器的虚拟化中实现虚拟机动态迁移(虚拟机在迁移前后的IP和MAC地址不能改变)和租户隔离。
最初的VXLAN的RFC可见于2014年发布的RFC7348。
VXLAN的功能实现:在IP网络上当源和目的之间有通信需求时,便在IP网络之上创建一条虚拟的隧道,透明转发用户数据。任意两点之间都能通过VXLAN隧道来通信,忽略底层网络的结构和细节。
数据结构上:主要采用MAC in UDP的方式进行流量转发。
Flags:2字节。
Group Policy:2字节。
VNI:3字节。24bits,相当于vlan标签。
Reserved:1字节。
也即将整个Ethernet封装于UDP报文中。数据结构上,先嵌套一层VXLAN Header信息,随后标注于UDP的DPort=4789上。
一般对UDP的SPort不做要求,或以原始以太帧哈希得到。
EVPN VXLAN也即基于VXLAN隧道的EVPN技术。将MP-BGP作为VXLAN的控制平面。
点击此处回到目录
VTEP(VXLAN Tunnel Endpoints):VXLAN网络的边缘设备,是VXLAN隧道的起点和终点。用于封装和解封装VXLAN Header信息。
NVE(Network Virtualization Edge):虚拟化网络的边缘设备。用于封装和解封装VXLAN Header信息。区别在于NVE一般指的是设备,VTEP指的是隧道。一台设备可以有多个VTEP。
VNI(VXLAN Network Identifier):VXLAN的网络标识符。类似于VLAN ID的用户标识,一个VNI代表了一个租户,属于不同VNI的虚机之间不能直接二层通信。
VXLAN网关:类似普通网关概念。VXLAN网关主要用于不同VNI之间的虚机,以及VXLAN网络和非VXLAN网络中的虚机相互通信。
VXLAN二层网关用于终端接入VXLAN网络,也可用于同一VXLAN网络的子网通信;VXLAN三层网关用于VXLAN网络中跨子网通信以及访问外部网络,并且可分为集中式网关和分布式网关。
BD域(Bridge-Domain):是一个本地概念,用于区分不同的VNI实例。
在建立VXLAN隧道时,需要在VTEP设备上配置BD与VNI的映射关系,进入VTEP的报文根据BD与VNI的映射关系表确定进行VXLAN封装时添加哪个VNI标识。
这里以基于接口的静态VXLAN隧道为例进行介绍
以图示进行VXLAN传输流量报文的过程进行解析。CE1-3用于模拟公网,建立VXLAN隧道。CE2和CE3分别为VTEP/NVE节点,将所定义来自BD域的报文进行VXLAN的封装。
考虑到模拟器支持能力,可以将CE1更换为普通设备或者直接删除。因为这里仅用于承载公网流量。
PC1–>PC2: 与普通的Layer2报文处理过程类似。
1@:PC1判断为同网段路由通信,发送ARP请求。(默认ARP表为空)
2@:SW1对来自PC1的报文进行相应的vlan Tag标记,并将其从相应端口转发。
3@:与BD域绑定的CX设备接口接口收到报文后(这一行为与L3VPN的端口加入VPN实例非常类似),对其进行相应的VXLAN封装。并将其根据定义的头端复制列表发送给对VXLAN隧道对端。
4@:对端CX设备接口接口收到报文后,对其进行相应的VXLAN解封装。并将其从BD域绑定的接口转发出去。
3@和4@所描述的BD域都与VNI相关,只在具有相同VNI的BD域内进行转发。VNI类似于报文的VLAN标签,也类似于L3VPN的私网标签。
5@:对端PC2接口收到报文后,对其进行相应的ARP回包。
这样就完成了1次ARP请求。随后在以所述的过程完成通信。
实际在通信时,VTEP/NVE节点会学习BD域内的MAC地址进行ARP代答(非ARP代理)并有多种手段减小隧道中BUM的转发。之后将其进行介绍。
VXLAN的封装是MAC in UDP。也即会将报文的整个信息放入VXLAN的data中,而VXLAN则使用UDP的4789目的端口进行标识。UDP的源目的IP则使用建立VXLAN隧道的地址
整个网络拓扑是一个大2层网络交换机,VNI就是该大交换机的vlan,BD是每个组成交换机上vlan。BD和VNI一一对应。
这里只提供了CE1设备配置,有能力者可自行进行其它设备的配置。
有需要者可私信联系提供模拟器源文件及配置。
sysname CE2
#
bridge-domain 10
vxlan vni 10
#
interface GE1/0/1.10 mode l2
encapsulation dot1q vid 10
bridge-domain 10
#
interface Nve1
source 2.2.2.2
vni 10 head-end peer-list 3.3.3.3
#
这里可以看出静态VXLAN隧道建立包含三个部分:(这里仅仅指的是以接口模式进行区分)
1@:创建BD域与VNI实例绑定。BD域和VNI是一一对应的。
2@:用户口与BD域绑定。并指定进入VXLAN的模式为dot1q Vlan10。并且一个BD域可以在端口上指定多个进入VXLAN的dot1q,也即此时多个vlan可以对应1个BD域。 encapsulation dot1q vid 10 to 20
因此值得注意的是,在本VXLAN场景下VLAN的存在没有意义。此时进入VXLAN隧道时都会将其进行vlan剥离。
default:允许所有进入VXLAN隧道。不对报文进行处理。
dot1q:只允许特定vlan进入VXLAN隧道。并将该VLAN标签进行剥离。即使初始时未剥离,也会在解封装VXLAN时进行剥离或替换。
qinq:只允许QINQ型vlan进入VXLAN隧道。
untag:只允许不携带vlan进入VXLAN隧道。
在VTEP入节点配置了default模式后,该物理口的其他子接口不允许进行其他模式。
3@:建立公网VXLAN隧道。这里建立的静态VXLAN,仅要求隧道地址可正常路由即可。并且一个VNE接口可以指定多个VNI,一个VNI可以指定多个VTEP邻居节点。
VXLAN隧道建立情况Mac学习情况
流量行为:
从报文上看,VXLAN隧道直接将Ethernet帧封装发送给所有具有相同VNI的实例隧道。并不区分相应的BUM类型。所有相同VNI的VTEP/NVE都会接受该ARP并进行Mac学习。这一行为也称为头端复制。
BD域也可基于VLAN进行绑定
//在BD10下绑定相应的vlan10。实际较少使用。
VXLAN的三层可以通过类似vlanif的方式进行实现
在相同的网络情况下,添加vbdif。以vbdif的方式进行路由,且该vbdif是与BD域相对应的。
interface Vbdif10
ip address 192.168.1.100 255.255.255.0
#
//相应的端口需要放行/建立相应的BD/VNI实例。这里的10是BD域编号,具有一定的对应关系。
该vbdif可以作为普通路由节点进行对外通信。而虚机和该vbdif之间其实还是进行的2层通信。
*//对于S6720EI和S6720S-EI作为VXLAN三层网关设备时,需要配置Eth-Trunk接口.
interface eth-trunk
service type vxlan-tunnel
#
*
实际上VTEP/NVE设备可以同时承载二层和三层VXLAN网关。那么VXLAN的二层和三层在网络架构上有什么区别?
从流量行为上来说,VXLAN的2层网关是对其进行VXLAN的“2层”封装,是用户流量进行VXLAN处理的第一个节点。VXLAN的3层网关是对VXLAN跨网段/跨VNI路由的VXLAN节点。对于VXLAN的2层网关和3层网关分别部署的场景,2层设备和3层设备通常是跨越设备建立VXLAN隧道的。
VXLAN的2层网关:维护MAC和VXLAN隧道传递的路由信息。
VXLAN的3层网关:维护MAC/ARP,用户路由和VXLAN隧道传递的路由信息。
VXLAN的3层网关可以分为集中式网关和分布式网关。
集中式网关通常指的是整个“大2层”网络的某个或某些VNI网关集中于一台设备(或M-LAG双活网关)。这种方案明显存在2个缺点:
1@:类似单臂路由的流量迂回行为会造成带宽挤占。
2@:全网流标集中于一台设备,在大型网络上存在表项瓶颈,需要进行资源扩容。(通过扩容设备,将VNI网关切割分离。)
点击此处回到目录
EVPN(Ethernet Virtual Private Network)是一种用于二层网络互联的VPN技术。通过在BGP协议的基础上定义了一种新的NLRI(Network Layer Reachability Information,网络层可达信息)即EVPN NLRI,用于处在二层网络的不同站点之间的MAC地址学习和发布。
VXLAN引入了EVPN作为控制平面,通过在VTEP之间交换BGP EVPN路由实现VTEP的自动发现、主机信息相互通告等特性,从而避免了不必要的数据流量泛洪。
BGP除了携带Origin和AS_PATH公认必遵Well-known mandatory等属性外其他还携带了:EXTENDED__COMMUNITIES、PMSI_TUNNEL_ATTRIBUTE和MP_REACH_NLRI属性:
BGP的属性也是基于TLV模式的,这为BGP提供了极大的扩展性。
EXTENDED__COMMUNITIES:主要携带了扩展团体属性,该团体属性用于进行EVPN标识,并同时指明了隧道类型为VXLAN。
NVE/VTEP节点上的BD域实际上类似于VPN实例的存在。
PMSI_TUNNEL_ATTRIBUTE:主要用于建立VXLAN隧道。指定VXLAN建立所需的VNI和目的IP地址。
Flags、Type Code和Length为属性必含不做介绍。
Flags:1字节。标识当前隧道是否需要叶子节点信息。VXLAN场景无意义。
Tunnel Type:1字节。目前仅支持6表示头端复制BUM转发。
VNI:3字节。此时的VNI用于进行2层标识。类似标签。
Tunnel ID:4字节。描述了建立VXLAN隧道的路由节点,也即vtep隧道节点。
MP_REACH_NLRI:网络可达信息。主要用于传递EVPN路由。之间所介绍的5种路由,在此携带。
Flags:1字节。用于指定传递属性的类型。这里为可选非过渡。
Type Code:1字节。标识BGP属性类型,这里表示属性为网络层可达信息。
Length:除去Flags、Type和Length(一般1bits或2bits)后的整个属性的长度。
Address family identifier (AFI):地址族类型。此处为L2VPN且为EVPN类型。
Network Layer Reachability Information (NLRI):网络层可达信息。
Route Type:1字节。EVPN路由类型。这里表示的是Type-3 Inclusive Multicast Route 集成组播路由。
集成组播路由和BGP属性PMSI_TUNNEL_ATTRIBUTE共同完成VXLAN隧道的建立。
Length:除去Route Type和Length后的整个NLRI的长度。
route distinguisher:8字节。路由区分符,类似与VPNv4路由。
Ethernet Tag ID:4字节。用于承载VXLAN的EVPN场景下无意义,取0。
ip add Length和ipv4 add:5字节。描述了建立VXLAN隧道的路由节点,也即vtep隧道节点。
需要注意的一点是:从EVPN NLRI上看,Inclusive Multicast Route 集成组播路由主要由RD和VTEP/NVE地址所包含。
因此使用EVPN动态建立VXLAN隧道时,必须指定租户且既包含Route distinguisher又包含Route Target。 否则无法建立。
这里标识的是EVPN Type-2 MAC/IP Advertisement Route MAC/IP路由。
Route distinguisher:8字节。路由区分符,类似与VPNv4路由。
Ethernet Segment ID:10字节。主要和EVPN Type-1 Ethernet Auto-Discovery Route以太网自动发现路由结合使用。在双活场景下具有意义。
MAC add Length和MAC add:1+6字节。描述了虚机MAC地址。
Ip add Length和Ipv4 add:1+4字节。描述了虚机IP地址。
VNI:3字节。描述了对端所具有的2层BD域信息。
如果为跨VNI通信额外携带一个3层VNI。位于2层VNI后新增3字节。只携带2层VNI为MAC路由,携带2层和3层为IRB(Integrated Route and Bridge)路由。
Type-2 MAC/IP Advertisement Route路由主要用于减小网络中的广播流量。
1@:VTEP/NVE节点会学习BD域内的MAC和ARP信息,并将其在VXLAN隧道同步。
2@:这一功能还可主要虚机迁移。虚机完成迁移后,VTEP/NVE节点探测到
虚机位置改变。其原本节点进行一次ARP探测。无回应则完成虚机迁移。
IBR路由示意:
这里有时还会在扩展属性里,携带8字节的Rouer MAC标识。用于携带设备MAC,防止冲突。这个地址作为NVE接口地址。
ARP和IBR路由的区别:
ARP路由=MAC+IP+2层VNI
IRB路由=MAC+IP+2层VNI+3层VNI
3层VNI主要用于跨子网互访。
点击此处回到目录
这里只提供了CE1设备配置,有能力者可自行进行其它设备的配置。
有需要者可私信联系提供模拟器源文件及配置。
这里以CE1和CE2分别作为各自BD域的2层网关进行建立,CE1和CE2可作为公网,提供可达的VTEP/NVE地址即可。
e-overlay enable
#
bridge-domain 10
vxlan vni 10
e
route-distinguisher 1:1
-target 100:200 export-extcommunity
-target 100:200 import-extcommunity
#
interface Nve1
source 1.1.1.1
vni 10 head-end peer-list protocol bgp
#
bgp 100
router-id 1.1.1.1
peer 2.2.2.2 as-number 100
peer 2.2.2.2 connect-interface LoopBack1
ipv4-family unicast
network 10.1.1.0 255.255.255.0
undo peer 2.2.2.2 enable
#
l2-family e
policy -target
peer 2.2.2.2 enable
#
从以上配置可以发现
1@:BD域的创建相当于L3VPN的VPN实例,用于与2层租户相关联。
2@:创建EVPN VXLAN时,只需将创建模式改为BGP即可。
3@:对于BGP的l2VPN-EVPN配置,需要酌情关闭policy -target。例如对于iBGP的RR场景,RR设备上可能并不包含该VPN实例。
可以发现该场景下与静态VXLAN Layer2并无多大差别,只是借用EVPN的Type-3 Inclusive Multicast Route集成路由完成了VXLAN隧道的建立(或者说头端复制列表的建立)。
而流量行为上,也无差别。正常进行流量传递即可。
这里只提供了CE1设备配置,有能力者可自行进行其它设备的配置。
有需要者可私信联系提供模拟器源文件及配置。<__>模拟器比较难实现,有的时候只能看到BGP的Update报文,有的甚至看不到不发Update。
还有个需要注意的是,这里是CX交换机系列配置。跟NE路由器的配置还是有点差别。需要注意下~
sysname CE1
#
e-overlay enable
#
ip -instance A
ipv4-family
route-distinguisher 11:11
-target 11:22 export-extcommunity e
-target 11:22 import-extcommunity e
vxlan vni 50
#
//华为的三层VNI
bridge-domain 10
vxlan vni 10
e
route-distinguisher 1:1
-target 100:200 export-extcommunity
-target 100:200 import-extcommunity
#
//华为的二层VNI
interface Vbdif10
ip binding -instance A
ip address 10.1.1.100 255.255.255.0
arp distribute-gateway enable
mac-address 3875-1111-0010
arp collect host enable
#
interface GE1/0/0
undo portswitch
undo shutdown
ip address 10.1.2.1 255.255.255.0
#
interface GE1/0/1
undo shutdown
interface GE1/0/1.10 mode l2
encapsulation dot1q vid 10
bridge-domain 10
#
interface LoopBack1
ip address 1.1.1.1 255.255.255.255
#
interface Nve1
source 1.1.1.1
vni 10 head-end peer-list protocol bgp
#
bgp 100
router-id 1.1.1.1
peer 2.2.2.2 as-number 100
peer 2.2.2.2 connect-interface LoopBack1
ipv4-family unicast
undo peer 2.2.2.2 enable
l2-family e
policy -target
peer 2.2.2.2 enable
peer 2.2.2.2 advertise irb
#
以上配置需要注意的有
1@:三层网关类似于L3VPN租户路由的概念,需要建立VPN实例。并且这里额外指定了RD和RT。从模拟器上看到的RT仍然为BD域下的RT值。实际上应当都可以接受。
2@:类似于L3VPN租户路由,在接口下绑定VPN就自动生成Type-2 路由。(VPN自动为绑定租户生成VPNv4路由。)
点击此处也可以看到发送了主机10.1.1.1和10.1.1.11的IRB路由。
3@:对于BGP需要指定为对端发送Type-2 路由的类型。这里指定的是IRB路由,也可指定ARP路由。
这里以4.3.章节的EVPN VXLAN Layer场景为例进行说明。转发面上的行为没有其他特殊差别,这里仅介绍控制面建立的相关信息。
尤其需要说明各种RT和RD的作用。
1@:建立BGP的EVPN邻居关系。这里与Layer2相关要求类似。
2@:路由的传递。由于BD与和VPN实例下都存在RD和RD值,这里需要重点进行说明。
2.1@:路由的传出—>从报文上看。无论是哪种Type-2 路由,其RT值都取BD域下定义的Export RT值,RD都取BD域下定义的RD值。
2.2@:路由的接收—>此时报文中不在体现,需要有本地配置进行识别。
当EVPN对等体接收到该EVPN路由后:
首先检查BD域下的Import RT,进行匹配。
成功则接收可完成ARP广播抑制和虚机迁移等功能。
随后检查VPN实例的EVPN Import RT,进行匹配。
成功则可放入VPN实例中,进行跨子网互访。
需要注意的是这是两个功能,互不影响。
完成上述路由传递后,控制面完成收敛。
点击此处回到目录
VXLAN建立大二层网络后,在公网上会不可避免的出现大量二层的广播报文。为了防止挤占公网带宽的情况,有如下情况的优化。
ARP 二层代答
1@:在虚机正常通信会发送广播ARP。此时VXLAN网关会进行相应的ARP学习并记录到本地的ARP Snooping。如果开启了基于BD域进行主机信息搜集功能,
还会将该信息在VXLAN中泛洪传递。
在之后的ARP请求时,VXLAN基于ARP本地表项代替终端进行应答(代答)。
注意是代答不是代理。代理指的是用本地自己设备的MAC进行应答。而代答还是使用正确的MAC只是代替终端进行了代理应答
ARP广播抑制:
1@:如果没有开启代答功能,也可以通过广播抑制来限制流量。通过检索目标节点所在VTEP/NVE节点,只将ARP转变为单播包发送给具体的VTEP/NVE节点进行相应操作。(这里也缓存了目标的ARP信息)。对端收到相应的报文后,解封装单播发送。目标节点单播回应。
如果无缓存,还是需要在全网泛洪一次来进行ARP/MAC学习。
VXLAN的一个重要特点和优势在于对虚机迁移的支持能力。VXLAN直接封装的Ethernet帧,因此数据的MAC和IP都不发生改变。虚机迁移前后可以不发生状态的改变。
在此重点进行下2方面的说明:
1@控制面:虚机的迁移完成后。VTEP/NVE节点会探测到网络中的信息变化。(通常对于稳定网络可以开启MAC学习抑制和设置永久MAC)。并在Type-2 MAC/IP 路由中进行通告。
此时对于原有网络来说,实际上是发生了MAC漂移。为了与实际的飘逸网络故障场景进行区分,在报文上有如下警示。
在Extended_Communities中会额外协议一个子TLV(SubTLV),该TLV位于Encapsulation TLV之后和EVPN Router`s MAC之前。(此处没有体现)
T=0x06(1字节),**SubType**=0x00(1字节)。表示属性为Transitive。
Flag**=0x01(1字节)。置位1表示Sticky MAC。
Sequence Number(1字节)。越大越优,类似于OSPF LSA的Seq Num可用于标识最新的虚机地址。
2@转发面:转发面上的行为与所定义的BUM转发规则有关。有一点需要说明的是,虚机迁移完成后会触发一次免费ARP。而其原有网络VTEP节点会进行一次ARP探测,探测到原有位置网络发生改变后确认MAC漂移完成。
引入外部路由时配置:
bgp 100
router-id 1.1.1.1
peer 2.2.2.2 as-number 100
peer 2.2.2.2 connect-interface LoopBack1
ipv4-family unicast
undo peer 2.2.2.2 enable
ipv4-family -instance A
import-route direct
advertise l2 e
l2-family e
policy -target
peer 2.2.2.2 enable
peer 2.2.2.2 advertise irb
注意需要在-instance下有该外部路由条目才可引入相应的VPN
报文上此时的RT和RD则对应了VPN实例下的EVPN RT和EVPN RD值
点击此处回到目录