VXLAN简介
VXLAN是什么
VXLAN即虚拟扩展局域网,在源网络设备与目的网络设备之间建立一条逻辑VXLAN隧道,采用MAC in UDP(User Datagram Protocol)封装方式,即,将虚拟机发出的原始以太报文完整的封装在UDP报文中,然后在外层使用物理网络的IP报文头和以太报文头封装,这样,封装后的报文就像普通IP报文一样,可以通过路由网络转发。
VXLAN 产生背景
1、虚拟机迁移
虚拟机动态迁移,就是在保证虚拟机上服务正常运行的同时,将一个虚拟机系统从一个物理服务器移动到另一个物理服务器的过程。该过程对于最终用户来说是无感知的,从而使得管理员能够在不影响用户正常使用的情况下,灵活调配服务器资源,或者对物理服务器进行维修和升级。
在服务器虚拟化后,虚拟机动态迁移变得常态化,为了保证迁移时业务不中断,就要求在虚拟机迁移时,不仅虚拟机的IP地址不变,而且虚拟机的运行状态也必须保持原状(例如TCP会话状态),所以虚拟机的动态迁移只能在同一个二层域中进行,而不能跨二层域迁移。
因为如果跨二层域进行迁移,但要保持IP地址不变的话,是无法进行通信的。如下图,S1和S2下是两个不同的广播域,但S1和S2具有相同的网段,在传统的二三层网络是无法实现通信的。因为10.10.11.3跟10.10.11.2处于同一网段,报文不会发送到网关那里,而是发送ARP报文查询MAC地址,准备进行二层通信,但R1作为三层设备,是不会透传ARP报文的,因此无法学习到MAC地址,无法进行报文传输。
在传统的二三层网络中,限制了虚拟机迁移的范围
而VXLAN为何能解决这个问题呢?那就是把这个二层域“扩大”!用VXLAN技术将三层网络变成一个“大型交换机”,这样数据中心的所有VM都处于一个二层域下了。
众所周知,同一台二层交换机可以实现下挂服务器之间的二层通信,而且服务器从该二层交换机的一个端口迁移到另一个端口时,IP地址是可以保持不变的。这样就可以满足虚拟机动态迁移的需求了。VXLAN的设计理念和目标正是由此而来的。
前面提到,VXLAN本质上是一种隧道技术,当源和目的之间有通信需求时,便在数据中心IP网络之上创建一条虚拟的隧道,透明转发用户数据。而数据中心内相互通信的需求众多,这种隧道的建立方式几乎是全互联形态才能满足通信需求。
VXLAN可以提供一套方法论,在数据中心IP网络基础上,构建一张全互联的二层隧道虚拟网络,保证任意两点之间都能通过VXLAN隧道来通信,并忽略底层网络的结构和细节。从服务器的角度看,VXLAN为它们将整个数据中心基础网络虚拟成了一台巨大的“二层交换机”,所有服务器都连接在这台虚拟二层交换机上。而基础网络之内如何转发都是这台“巨大交换机”内部的事情,服务器完全无需关心。
而VXLAN的精髓就在于,将二层的报文,“藏”在了跨越三层网络的UDP报文中,在IP网络中,表明传输的是UDP报文,实际上传输的各个VM的二层报文,对于VM来说,就在三层IP网络之上,构建了一个“大二层”网络,只要目的IP可达,它就能将二层报文发送到指定设备。
那么这里就有问题了,为什么不直接将整个数据中心搞成一个真正意义上的二层域呢?
2、虚拟机规模受网络设备表项规格的限制
对于同网段主机的通信而言,报文通过查询MAC表进行二层转发。服务器虚拟化后,数据中心中VM的数量比原有的物理机发生了数量级的增长,伴随而来的便是虚拟机网卡MAC地址数量的空前增加。
前面的疑问便可以解决了,直接搞成一个二层域,庞大的VM数量,会使得二层设备的MAC表项大大增加,而且在二层域中,还会存在环路问题,需要使用STP进行链路阻塞,而数据中心的链路,都是10G、40G的链路,阻塞后会大大浪费链路资源,而使用VXLAN,将三层网络转为一个大型交换机,利用三层网络协议本身的防环机制,不需要额外阻塞链路,提高资源利用率,何乐而不为?
VTEP会将VM发出的原始报文封装成一个新的UDP报文,并使用物理网络的IP和MAC地址作为外层头,对网络中的其他设备只表现为封装后的参数。也就是说,网络中的其他设备看不到VM发送的原始报文。
如果服务器作为VTEP,那从服务器发送到接入设备的报文便是经过封装后的报文,这样,接入设备就不需要学习VM的MAC地址了,它只需要根据外层封装的报文头负责基本的三层转发就可以了。因此,虚拟机规模就不会受网络设备表项规格的限制了。
当然,如果网络设备作为VTEP,它还是需要学习VM的MAC地址。但是,从对报文进行封装的角度来说,网络设备的性能还是要比服务器强很多。
使用VXLAN形成一个“大交换机”后,还面临一个问题,那就是隔离问题。类似于VLAN,这个大交换机,需要将VM进行批量隔离,保证数据的安全性,因此又还要再划分隔离域,分成一个个的“广播域”,那VXLAN怎么解决这个问题呢?
3、网络的隔离能力有限
VLAN作为主流的网络隔离技术,在标准定义中只有12比特,也就是说可用的VLAN数量只有4000个左右。对于公有云或其它大型虚拟化云计算服务这种动辄上万甚至更多租户的场景而言,VLAN的隔离能力显然已经力不从心。
VXLAN中引入了类似VLAN ID的VNI
,一个VNI对应一个租户,属于不同VNI的虚拟机之间不能直接进行二层通信。VTEP(VXLAN隧道的起点和终点,可以是网络设备,也可以是虚拟机,后文会详解)在对报文进行VXLAN封装时,给VNI分配了24比特的空间,这就意味着VXLAN网络理论上支持多达16M(即:$2^{24}-1$)的租户隔离。相比VLAN,VNI的隔离能力得到了巨大的提升,有效得解决了云计算中海量租户隔离的问题。
VXLAN 原理
报文格式
前文提到在VXLAN中,使用了UDP来封装了原始的以太网帧,并且使用物理的IP和MAC作为外层头,那么实际上VXLAN报文长什么样呢?
VXLAN Header
增加VXLAN头(8字节),其中包含24比特的VNI字段,用来定义VXLAN网络中不同的租户。此外,还包含VXLAN Flags(8比特,取值为00001000)和两个保留字段(分别为24比特和8比特)。
UDP Header
VXLAN头和原始以太帧一起作为UDP的数据。UDP头中,目的端口号(VXLAN Port)固定为4789,源端口号(UDP Src. Port)是原始以太帧通过哈希算法计算后的值。
Outer IP Header
封装外层IP头。其中,源IP地址(Outer Src. IP)为源VM所属VTEP的IP地址,目的IP地址(Outer Dst. IP)为目的VM所属VTEP的IP地址。
Outer MAC Header
封装外层以太头。其中,源MAC地址(Src. MAC Addr.)为源VM所属VTEP的MAC地址,目的MAC地址(Dst. MAC Addr.)为到达目的VTEP的路径上下一跳设备的MAC地址。
VXLAN报文传输过程:
VTEP
VTEP是VXLAN网络中绝对的主角,VTEP既可以是一台独立的网络设备(比如华为的CloudEngine系列交换机),也可以是在服务器中的虚拟交换机。源服务器发出的原始数据帧,在VTEP上被封装成VXLAN格式的报文,并在IP网络中传递到另外一个VTEP上,并经过解封转还原出原始的数据帧,最后转发给目的服务器。
VNI
VNI是一种类似于VLAN ID的用户标示,一个VNI代表了一个租户,属于不同VNI的虚拟机之间不能直接进行二层通信。VXLAN报文封装时,给VNI分配了足够的空间使其可以支持海量租户的隔离。
另外,在 分布式网关 部署场景下,VNI还可分为二层VNI和三层VNI,它们的作用不同:
- 二层VNI是普通的VNI,以1:1方式映射到广播域BD,实现VXLAN报文同子网的转发。
BD(Bridge Domain),是VXLAN的“大二层”概念,类似于VLAN的概念,BD的区分通过VNI来区分,BD和VNI的一一映射关系形成映射表,进入VTEP的报文可以根据映射表来添加VNI。
- 三层VNI和VPN实例进行关联,用于VXLAN报文跨子网的转发(详见 EVPN )
VXLAN隧道建立
建立VXLAN隧道之前,首先应该知道哪些报文要进入VXLAN隧道,并不是所有的报文都要通过VXLAN隧道,它们也可以走传统的二三层转发流程。也就是说我们要知道哪些VTEP之间需要建立VXLAN隧道。
前面提到,VXLAN隧道就是打通了一个“大二层”,实现大二层网络中的VM互相访问。大二层是什么呢?其实就是我们熟知的VLAN,只不过现在这个二层广播域,”凌驾于“三层网络之上。因此在同一个大二层的VTEP之间需要建立VXLAN隧道。例如下图,各个VM之间需要互相访问,因此三个VTEP之间都要建立VXLAN隧道。
那么建立了隧道以后,由于隔离的需要,产生了不同的BD,即对应不同的VNI,VTEP在接口上收到报文时,怎么知道它是属于哪个BD,或者说是哪个VNI的呢?
在解决这个疑惑之前,我们得清楚,建立了VXLAN隧道,不代表所有的报文都要走VXLAN隧道,它也可以走普通的二三层转发路线。因此,VXLAN中诞生了”二层子接口“这个定义。只有加入了对应BD的接口中的报文才会进入VXLAN隧道。
在VLAN中,有Access、Hybrid和Trunk接口,而在VXLAN中,是“二层子接口”,它们的目的都是一样的:一是根据配置来检查哪些报文是允许通过的;二是判断对检查通过的报文做怎样的处理。
在二层子接口上,可以根据需要定义不同的流封装类型(类似于VLAN中的不同接口类型):
dot1q:对于带有一层VLAN Tag的报文,该类型接口只接收与指定VLAN Tag匹配的报文;对于带有两层VLAN Tag的报文,该类型接口只接收外层VLAN Tag与指定VLAN Tag匹配的报文。
untag:该类型接口只接收不带VLAN Tag的报文。
qinq:该类型接口只接收带有指定两层VLAN Tag的报文。
default:允许接口接收所有报文,不区分报文中是否带VLAN Tag。不论是对原始报文进行VXLAN封装,还是解封装VXLAN报文,该类型接口都不会对原始报文进行任何VLAN Tag处理,包括添加、替换或剥离。一般用于下挂的VM都属于同一个BD。
到这里,应该就明白VTEP根据什么来分辨报文所属的VNI了。
由于BD是一对一绑定了VNI,因此将二层子接口加入指定的BD,那么也就确定了该接口收到报文后的VNI,如下图,将VTEP上创建两个子接口,分别加入BD 10和BD 20,而BD 10和BD 20分别绑定了VNI 5000和VNI 6000,这样后续VM1和VM2的流量将会进入不同的VXLAN隧道继续转发。
在上图中,由于vSwitch的上行接口的PVID为20,并且设置为Trunk接口,因此VM2的报文是untag的,而VM1的是tag的,因此需要配置dot1q和untag类型的两种子接口
如果感觉还有点绕,可以看看下面的配置过程,应该就很清晰了。
配置VXLAN隧道
建立VXLAN隧道分为手工方式和自动方式,笔记只记录了手工方式,自动方式见 EVPN
对于CE系列交换机,以上配置是在NVE(Network Virtualization Edge)接口下完成的。配置过程如下:
[~Device1] bridge-domain 10 //创建BD
[*Device1-bd10] quit
[*Device1] interface 10ge 1/0/2.1 mode l2 //创建二层子接口
[*Device1-10GE1/0/2.1] encapsulation dot1q vid 10 //设置子接口的类型
[*Device1-10GE1/0/2.1] bridge-domain 10 //将该子接口加入到对应BD中
[~Device1] bridge-domain 10
[~Device1-bd10] vxlan vni 5000 //将VNI与BD绑定,形成一一映射
[*Device1-bd10] quit
[*Device1] interface nve 1 //配置VXLAN隧道建立接口
[*Device1-Nve1] source 1.1.1.1 //本地VTEP的IP地址
[*Device1-Nve1] vni 5000 head-end peer-list 2.2.2.2 3.3.3.3 //设置VNI隧道对端的VTEP IP地址
其中,vni 5000 head-end peer-list 2.2.2.2和vni 5000 head-end peer-list 2.2.2.3的配置,表示属于VNI 5000的对端VTEP有两个,IP地址分别为2.2.2.2和2.2.2.3。根据这两条配置,VTEP上会生成如下所示的一张表:
根据上表中的Peer List,本端VTEP就可以知道属于同一BD(或同一VNI)的对端VTEP都有哪些,这也就决定了同一大二层广播域的范围。当VTEP收到BUM(Broadcast & Unknown-unicast & Multicast,广播 & 未知单播 & 组播)报文时,会将报文复制并发送给Peer List中所列的所有对端VTEP(这就好比广播报文在VLAN内广播)。因此,这张表也被称为“头端复制列表”。当VTEP收到已知单播报文时,会根据VTEP上的MAC表来确定报文要从哪条VXLAN隧道走。而此时Peer List中所列的对端,则充当了MAC表中“出接口”的角色。
至此,我们知道了VTEP是如何识别VXLAN隧道报文的,也知道了隧道是如何建立的,那么,报文在隧道中是怎么转发的呢?实际上也就是由VNI决定的。
网关
和VLAN类似,不同VNI之间的主机,以及VXLAN网络和非VXLAN网络中的主机不能直接相互通信。为了满足这些通信需求,VXLAN引入了VXLAN网关的概念。VXLAN网关分为二层网关和三层网关:
VXLAN二层网关:用于终端接入VXLAN网络,也可用于同一VXLAN网络的子网通信。(可以理解为接入层交换机,下面接了两个不同的VLAN)
VXLAN三层网关:用于VXLAN网络中跨子网通信以及访问外部网络。
网关的具体应用在 后文 会详细说明
集中式网关
集中式网关是指将三层网关集中部署在一台设备上,如下图所示,所有跨子网的流量都经过这个三层网关转发,实现流量的集中管理。
集中式网关的缺陷也很明显:
转发路径不是最优:同一二层网关下跨子网的数据中心三层流量都需要经过集中三层网关绕行转发(如图中蓝色虚线所示)。
ARP表项规格瓶颈:由于采用集中三层网关,通过三层网关转发的终端的ARP表项都需要在三层网关上生成,而三层网关上的ARP表项规格有限,这不利于数据中心网络的扩展。
分布式网关
VXLAN分布式网关是指在典型的“Spine-Leaf”组网结构下,将Leaf节点作为VXLAN隧道端点VTEP,每个Leaf节点都可作为VXLAN三层网关(同时也是VXLAN二层网关),Spine节点不感知VXLAN隧道,只作为VXLAN报文的转发节点。如下图所示,Server1和Server2不在同一个网段,但是都连接到同一个Leaf节点。Server1和Server2通信时,流量只需要在该Leaf节点上转发,不再需要经过Spine节点。
- Spine节点:关注于高速IP转发,强调的是设备的高速转发能力。
- Leaf节点:
- 作为VXLAN网络中的二层网关设备,与物理服务器或VM对接,用于解决终端租户接入VXLAN虚拟网络的问题。
- 作为VXLAN网络中的三层网关设备,进行VXLAN报文封装/解封装,实现跨子网的终端租户通信,以及外部网络的访问。
分布式网关的优点:
- 同一个Leaf节点既可以做VXLAN二层网关,也可以做VXLAN三层网关,部署灵活。
- Leaf节点只需要学习自身连接服务器的ARP表项,而不必像集中三层网关一样,需要学习所有服务器的ARP表项,解决了集中式三层网关带来的ARP表项瓶颈问题,网络规模扩展能力强。
报文在VXLAN隧道转发流程
同子网互通(集中式网关)
VMA、VMB和VMC都处于同一网段,且同属于VNI5000,现VMA与VMC通信。
由于是首次通信,因此VMA上没有VMC的MAC地址,因此VMA首先要发送ARP报文:
发送ARP请求报文的过程如下:
- VMA发送源MAC为MAC_A,目的MAC为广播地址(全1),源IP为IP_A,目的IP为IP_C
- VTEP_1收到ARP报文后,根据子接口上的配置,确定了报文所属的BD,同时,学习MAC_A、VNI和报文入接口(子接口对应的物理接口,即图中的Port_1),记录在MAC地址表中。VTEP根据头端复制地址,对报文进行封装复制,然后发送给对端,图中就会向VTEP_2和VTEP_3发送:源IP为IP_1,目的IP为IP_2和IP_3,源MAC为MAC_1,目的MAC为去往目的IP的下一跳的MAC地址。
- VTEP_2和VTEP_3接收到VXLAN报文,进行解封装后得到原始的VM报文,即ARP请求报文,同时会学习到MAC_A、VNI和入接口的对应关系,保存到MAC地址表中。接着根据本地二层子接口的配置,将报文发送到对应的广播域进行广播。
- VM_C收到ARP请求报文后,发现报文的目的IP为本机IP,因此会发送ARP响应报文,而VM_B发现报文中目的IP不为本机IP,因此不会作出响应。
响应ARP报文的过程:
- VM_C的响应报文不再是广播,而是单播发送,其中的目的MAC为MAC_A,源IP为IP_C,目的IP为IP_A。
- 同样的,VTEP3接收到响应报文后,也会学习MAC_C、VNI和入接口的对应关系,之后对报文进行封装,封装的外层源IP地址为本地VTEP(VTEP_3)的IP地址,外层目的IP地址为对端VTEP(VTEP_1)的IP地址;外层源MAC地址为本地VTEP的MAC地址,而外层目的MAC地址为去往目的IP的网络中下一跳设备的MAC地址。封装后的报文,根据外层MAC和IP信息,在IP网络中进行传输,直至到达对端VTEP。
- 报文到达VTEP_1后,VTEP_1对报文进行解封装,得到VM_C发送的原始报文。同时,VTEP_1学习VM_C的MAC地址、VNI和远端VTEP的IP地址(IP_3)的对应关系,并记录在本地MAC表中。之后,VTEP_1将解封装后的报文发送给VM_A。
- 后续VM_A和VM_C将以单播的形式通信,过程与前面类似。
不同子网互通(集中式网关)
VM_A和VM_B分别属于10.1.10.0/24网段和10.1.20.0/24网段,且分别属于VNI 5000和VNI 6000。VM_A和VM_B对应的三层网关分别是VTEP_3上BDIF 10和BDIF 20的IP地址。VTEP_3上存在到10.1.10.0/24网段和10.1.20.0/24网段的路由。此时,VM_A想与VM_B进行通信。
同样的,也是首次通信,因此VM_A首先要发送ARP广播报文请求网关的MAC,获得网关的MAC后,VM_A先将数据报文发送给网关;之后网关也将发送ARP广播报文请求VM_B的MAC,获得VM_B的MAC后,网关再将数据报文发送给VM_B。以上MAC地址学习的过程与同子网互通中MAC地址学习的流程一致,不再赘述。现在假设VM_A和VM_B均已学到网关的MAC、网关也已经学到VM_A和VM_B的MAC,下面看看报文是如何转发的;
VM_A先将数据报文发送给网关。报文的源MAC为MAC_A,目的MAC为网关BDIF 10的MAC_10,源IP地址为IP_A,目的IP为IP_B。
VTEP_1收到数据报文后,识别此报文所属的VNI(VNI 5000),并根据MAC表项对报文进行封装。可以看到,这里封装的外层源IP地址为本地VTEP的IP地址(IP_1),外层目的IP地址为对端VTEP的IP地址(IP_3);外层源MAC地址为本地VTEP的MAC地址(MAC_1),而外层目的MAC地址为去往目的IP的网络中下一跳设备的MAC地址。封装后的报文,根据外层MAC和IP信息,在IP网络中进行传输,直至到达对端VTEP。
报文进入VTEP_3,VTEP_3对报文进行解封装,得到VM_A发送的原始报文。
VTEP_3发现该报文的目的MAC为本机BDIF 10接口的MAC,而目的IP地址为IP_B(10.1.20.1),所以会根据路由表查找到IP_B的下一跳。
发现下一跳为10.1.20.10,出接口为BDIF 20。此时VTEP_3查询ARP表项,并将原始报文的源MAC修改为BDIF 20接口的MAC(MAC_20),将目的MAC修改为VM_B的MAC(MAC_B)。
报文到BDIF 20接口时,识别到需要进入VXLAN隧道(VNI 6000),所以根据MAC表对报文进行封装。这里封装的外层源IP地址为本地VTEP的IP地址(IP_3),外层目的IP地址为对端VTEP的IP地址(IP_2);外层源MAC地址为本地VTEP的MAC地址(MAC_3),而外层目的MAC地址为去往目的IP的网络中下一跳设备的MAC地址。
封装后的报文,根据外层MAC和IP信息,在IP网络中进行传输,直至到达对端VTEP。
报文到达VTEP_2后,VTEP_2对报文进行解封装,得到内层的数据报文,并将其发送给VM_B。VM_B回应VM_A的流程与上述过程类似。
同子网互通(分布式网关)
这里以华三的VXLAN分布式网关实现为例:
VM 1访问VM 4的通信过程如下:
- VM 1广播发送ARP请求消息,获取VM 4的MAC地址。
- GW 1收到ARP请求消息后,学习VM 1的ARP信息,并代理应答该ARP请求,即:向VM 1发送ARP应答消息,应答的MAC地址为VSI虚接口10的MAC地址。
- VM 1学习到VM 4的MAC地址为GW 1上VSI虚接口10的MAC地址。
- GW 1将接收到的ARP请求消息中的源MAC地址修改为VSI虚接口10的MAC地址,对该消息进行VXLAN封装后,将其发送给VXLAN内的所有远端VTEP。
- GW 2对VXLAN报文进行解封装后,学习VM 1的ARP信息(IP为10.1.1.11、MAC为GW 1上VSI虚接口10的MAC、出接口为接收该VXLAN报文的Tunnel接口),并将ARP请求消息中的源MAC修改为本地VSI虚接口10的MAC地址,在VXLAN 10的本地站点内进行广播。
- VM 4收到ARP请求后,学习VM 1的ARP信息(IP为10.1.1.11、MAC为GW 2上VSI虚接口10的MAC),并发送ARP应答消息给本地网关GW 2。
- GW 2从VM 4收到ARP应答消息后,学习VM 4的ARP信息,将ARP应答消息中的源MAC修改为本地VSI虚接口10的MAC地址,并根据已经学习到的ARP表项,为ARP应答消息添加VXLAN封装后发送给GW 1。
- GW 1对VXLAN报文进行解封装后,根据收到的ARP应答消息学习VM 4的ARP信息(IP为10.1.1.12、MAC为GW 2上VSI虚接口10的MAC、出接口为接收该VXLAN报文的Tunnel接口)。
- 通过上述步骤完成ARP信息的学习后,VM 1发送给VM 4的报文,根据已经学习到的ARP信息进行转发:首先发送给GW 1;GW 1对其进行VXLAN封装后,将其发送给GW 2;GW 2解封装后,将其发送给VM 4。
不同子网互通(分布式网关)
在集中式网关的部署中,同一Leaf(Leaf1)下挂的不同网段VM(VM1和VM2)之间的通信,都需要在Spine上进行绕行,这样就导致Leaf与Spine之间的链路上,存在冗余的报文,额外占用了大量的带宽。同时,Spine作为VXLAN三层网关时,所有通过三层转发的终端租户的表项都需要在该设备上生成。但是,Spine的表项规格有限,当终端租户的数量越来越多时,容易成为网络瓶颈。(见 图二 )
因此,分布式的网关解决了这个问题。
同Leaf节点下不同部门VM之间的通信 如下图所示,Leaf1作为VXLAN网络的VTEP,在Leaf1上部署VXLAN三层网关,即可实现同Leaf下不同部门VM之间的相互通信。此时,VM1和VM2互访时,流量只需要在Leaf1节点进行转发,不再需要经过Spine节点,从而节约了大量的带宽资源。
跨Leaf节点不同部门VM之间的通信 如下图所示,Leaf1和Leaf2作为VXLAN网络的VTEP,在Leaf1和Leaf2上部署VXLAN三层网关。两个VXLAN三层网关之间通过BGP动态建立VXLAN隧道,并通过BGP的remote-nexthop属性发布本网关下挂的主机路由信息给其他BGP邻居,从而实现跨Leaf节点不同部门VM之间的相互通信。
以H3C的分布式网关实现原理为例:
以VM 1访问VM 5为例,通信过程为:
VM 1广播发送ARP请求消息,获取网关10.1.1.1的MAC地址。
GW 1收到ARP请求消息后,学习VM 1的ARP信息,并向VM 1发送ARP应答消息,应答的MAC地址为VSI虚接口10的MAC地址。
VM 1将访问VM 5的报文发送给GW 1。
GW 1在所有VXLAN内向本地站点和远端站点广播发送ARP请求,获取VM 5的MAC地址。ARP请求消息中的源IP地址为20.1.1.1、源MAC地址为本地VSI虚接口20的MAC地址。
GW 2从VXLAN隧道上接收到VXLAN报文,对其进行解封装后,学习GW 1的ARP信息(IP为20.1.1.1、MAC为GW 1上VSI虚接口20的MAC、出接口为接收该VXLAN报文的Tunnel接口),并将ARP请求消息中的源MAC修改为本地VSI虚接口20的MAC地址,在VXLAN 20的本地站点内广播该ARP请求消息。
VM 5收到ARP请求后,学习GW 2的ARP信息(IP为20.1.1.1、MAC为GW 2上VSI虚接口20的MAC),并发送ARP应答消息给本地网关GW 2。
GW 2从VM 5收到ARP应答消息后,学习VM 5的ARP信息,将ARP应答消息中的源MAC修改为本地VSI虚接口20的MAC地址,并根据已经学习到的ARP表项,为ARP应答消息添加VXLAN封装后发送给GW 1。
GW 1对VXLAN报文进行解封装后,根据收到的ARP应答消息学习VM 5的ARP信息(IP为20.1.1.12、MAC为GW 2上VSI虚接口20的MAC、出接口为接收该VXLAN报文的Tunnel接口)。
通过上述步骤完成ARP信息的学习后,VM 1发送给VM 5的报文,根据已经学习到的ARP信息进行转发:首先发送给GW 1;GW 1对其进行VXLAN封装后,将其发送给GW 2;GW 2解封装后,将其发送给VM 5。
在分布式网关中,为了实现相同站点下、不同站点间的虚机通信,都走Leaf而不上Spine,需要将三层网关下放到Leaf上,类似于传统二三层中,汇聚层交换机启用了不同的vlan虚接口,下接的不同vlan,都可以在汇聚设备上实现通信,当不同的汇聚交换机间下连的vlan需要通信时,则需要汇聚设备之间进行交互,这就类似于分布式网关的VXLAN隧道。类似于传统二三层转发中,trunk口放通不同的vlan,分布式网关中,VXLAN隧道上也要承载多个VSI实例的报文,但仍遵守传统二三层转发中的规则,即只有相同vlan(VSI)的虚接口能互相通信,若不同设备的不同虚接口需要互访,则需要在两台设备上启用相同的vlan(VSI)虚接口,例如下图中,SWA下连的VLAN10想访问SWB下连的VLAN20,若仅在SWA上启用vlan10虚接口,在SWB上vlan20启用虚接口,则二者无法通信,此时需要在SWA和SWB上均启用vlan10和20的虚接口,并将二者相连的链路放通vlan10和20,这样PC1报文首先会上送到SWA的vlan10虚接口,查d_mac发现是自己的mac后,进行三层转发,从vlan20虚接口发送给SWB,SWB同样三层转发,从vlan20虚接口发送给vlan10虚接口,最后发送给PC2,实现通信。这就是VXLAN分布式网关的实现机制,因此,查看配置过程,可以看到在分布式网关中,两台VTEP的VSI设置是对称的。
如上面的场景所示,在SWA和SWB上,都需要创建三个VSI,这样才能实现VM1、VM2和VM3的互通。
当然,我们在传统二三层网络中是不会像上面这样同时创建两个相同虚接口,然后放通两个vlan的,我们常常会用另一个vlan虚接口将两个设备进行连接,如vlan30,然后添加一个路由,这样它们都有一个共同的vlan虚接口了,而这个就是EVPN中的三层VNI概念了,详情请看 EVPN-VXLAN 。
后记
本来在四月份的时候就做了笔记进行了解,但那时只是真的“草草了解”,最近在实际DC项目中又再次听闻VXLAN技术,回顾梳理后有了船新认识,以此更新一下。
这篇笔记主要是对VXLAN有一个大概的了解,并没有进行深入剖析,并且实现技术也比较简单,都是静态(手动)方式配置,后续可以进一步了解 EVPN 方式建立VXLAN隧道,
参考文章
VXLAN是什么?VXLAN与VLAN之间有何不同? - 华为 (huawei.com)