写点什么

什么是 VXLAN

发布于: 2021 年 01 月 17 日

什么是 VXLAN


VXLAN(Virtual eXtensible Local Area Network,虚拟扩展局域网),是由 IETF 定义的 NVO3(Network Virtualization over Layer 3)标准技术之一,是对传统 VLAN 协议的一种扩展。VXLAN 的特点是将 L2 的以太帧封装到 UDP 报文(即 L2 over L4)中,并在 L3 网络中传输。


VXLAN 本质上是一种隧道技术,在源网络设备与目的网络设备之间的 IP 网络上,建立一条逻辑隧道,将用户侧报文经过特定的封装后通过这条隧道转发。从用户的角度来看,接入网络的服务器就像是连接到了一个虚拟的二层交换机的不同端口上(可把蓝色虚框表示的数据中心 VXLAN 网络看成一个二层虚拟交换机),可以方便地通信。



VXLAN 已经成为当前构建数据中心的主流技术,是因为它能很好地满足数据中心里虚拟机动态迁移和多租户等需求。


为什么需要 VXLAN


为什么需要 VXLAN 呢?这和数据中心服务器侧的虚拟化趋势紧密相关,一方面服务器虚拟化后出现了虚拟机动态迁移,要求提供一个无障碍接入的网络;另一方面,数据中心规模越发庞大,租户数量激增,需要网络提供隔离海量租户的能力。采用 VXLAN 可以满足上述两个关键需求。


虚拟机动态迁移,要求提供一个无障碍接入的网络


什么是服务器虚拟化技术?


传统的数据中心物理服务器利用率太低,平均只有 10%~15%,浪费了大量的电力能源和机房资源,所以出现了服务器虚拟化技术。服务器虚拟化技术是把一台物理服务器虚拟化成多台逻辑服务器,这种逻辑服务器被称为虚拟机(VM)。每个 VM 都可以独立运行,有自己的操作系统、APP,当然也有自己独立的 MAC 地址和 IP 地址,它们通过服务器内部的虚拟交换机(vSwitch)与外部实体网络连接。



通过服务器虚拟化,可以有效地提高服务器的利用率,降低能源消耗,降低数据中心的运营成本,所以虚拟化技术目前得到了广泛的应用。


什么是虚拟机动态迁移?


所谓虚拟机动态迁移,就是在保证虚拟机上服务正常运行的同时,将一个虚拟机系统从一个物理服务器移动到另一个物理服务器的过程。该过程对于最终用户来说是无感知的,从而使得管理员能够在不影响用户正常使用的情况下,灵活调配服务器资源,或者对物理服务器进行维修和升级。


在服务器虚拟化后,虚拟机动态迁移变得常态化,为了保证迁移时业务不中断,就要求在虚拟机迁移时,不仅虚拟机的 IP 地址不变,而且虚拟机的运行状态也必须保持原状(例如 TCP 会话状态),所以虚拟机的动态迁移只能在同一个二层域中进行,而不能跨二层域迁移。


传统的二三层网络架构限制了虚拟机的动态迁移范围,迁移只能在一个较小的局部范围内进行,应用受到了极大的限制。



为了打破这种限制,实现虚拟机的大范围甚至跨地域的动态迁移,就要求把 VM 迁移可能涉及的所有服务器都纳入同一个二层网络域,这样才能实现 VM 的大范围无障碍迁移。


VXLAN 如何满足虚拟机动态迁移时对网络的要求?


众所周知,同一台二层交换机可以实现下挂服务器之间的二层通信,而且服务器从该二层交换机的一个端口迁移到另一个端口时,IP 地址是可以保持不变的。这样就可以满足虚拟机动态迁移的需求了。VXLAN 的设计理念和目标正是由此而来的。


从上一个小节我们可以知道,VXLAN 本质上是一种隧道技术,当源和目的之间有通信需求时,便在数据中心 IP 网络之上创建一条虚拟的隧道,透明转发用户数据。而数据中心内相互通信的需求众多,这种隧道的建立方式几乎是全互联形态才能满足通信需求。


VXLAN 可以提供一套方法论,在数据中心 IP 网络基础上,构建一张全互联的二层隧道虚拟网络,保证任意两点之间都能通过 VXLAN 隧道来通信,并忽略底层网络的结构和细节。从服务器的角度看,VXLAN 为它们将整个数据中心基础网络虚拟成了一台巨大的“二层交换机”,所有服务器都连接在这台虚拟二层交换机上。而基础网络之内如何转发都是这台“巨大交换机”内部的事情,服务器完全无需关心。



基于这种“二层交换机”的模型,就很容易理解为什么 VXLAN 可以实现 VM 动态迁移了:将虚拟机从“二层交换机”的一个端口换到另一个端口,完全无需变更 IP 地址。


数据中心租户数量激增,要求提供一个可隔离海量租户的网络


众所周知,在传统的 VLAN 网络中,标准定义所支持的可用 VLAN 数量只有 4000 个左右。服务器虚拟化后,一台物理服务器中承载了多台虚拟机,每个虚拟机都有独立的 IP 地址和 MAC 地址,相当于接入数据中心的服务器成倍扩大了。另外,公有云或其它大型虚拟化云数据中心动辄需容纳上万甚至更多租户,VLAN 的能力显然已经力不从心。


VXLAN 如何来解决上述问题呢?VXLAN 在 VXLAN 帧头中引入了类似 VLAN ID 的网络标识,称为 VXLAN 网络标识 VNI(VXLAN Network ID),由 24 比特组成,理论上可支持多达 16M 的 VXLAN 段,从而满足了大规模不同网络之间的标识、隔离需求。


VXLAN 与 VLAN 之间有何不同


VLAN 作为传统的网络隔离技术,在标准定义中 VLAN 的数量只有 4000 个左右,无法满足大型数据中心的租户间隔离需求。另外,VLAN 的二层范围一般较小且固定,无法支持虚拟机大范围的动态迁移。


VXLAN 完美地弥补了 VLAN 的上述不足,一方面通过 VXLAN 中的 24 比特 VNI 字段,提供多达 16M 租户的标识能力,远大于 VLAN 的 4000;另一方面,VXLAN 本质上在两台交换机之间构建了一条穿越数据中心基础 IP 网络的虚拟隧道,将数据中心网络虚拟成一个巨型“二层交换机”,满足虚拟机大范围动态迁移的需求。


虽然从名字上看,VXLAN 是 VLAN 的一种扩展协议,但 VXLAN 构建虚拟隧道的本领已经与 VLAN 迥然不同了。


下面就让我们来看下,VXLAN 报文到底长啥样。



如上图所示,VTEP 对 VM 发送的原始以太帧(Original L2 Frame)进行了以下“包装”:


  • VXLAN Header


  • UDP Header


  • Outer IP Header


  • Outer MAC Header


VXLAN 隧道是如何建立的


介绍 VXLAN 隧道的建立过程,并在这个过程中更好地理解 VXLAN 的工作原理。


什么是 VXLAN 中的 VTEP 和 VNI


下面让我们来进一步了解 VXLAN 的网络模型以及一些常见的概念。两台服务器之间通过 VXLAN 网络进行通信。



从上图中可以发现,VXLAN 在两台 TOR 交换机之间建立了一条隧道,将服务器发出的原始数据帧加以“包装”,好让原始报文可以在承载网络(比如 IP 网络)上传输。当到达目的服务器所连接的 TOR 交换机后,离开 VXLAN 隧道,并将原始数据帧恢复出来,继续转发给目的服务器。


另外,VXLAN 网络中出现了一些传统数据中心网络中没有的新元素,如 VTEP、VNI 等,它们的作用是什么呢?下面将向您介绍这几个新元素。


什么是 VXLAN VTEP


VTEP(VXLAN Tunnel Endpoints,VXLAN 隧道端点)是 VXLAN 网络的边缘设备,是 VXLAN 隧道的起点和终点,VXLAN 对用户原始数据帧的封装和解封装均在 VTEP 上进行。


VTEP 是 VXLAN 网络中绝对的主角,VTEP 既可以是一台独立的网络设备(比如华为的 CloudEngine 系列交换机),也可以是在服务器中的虚拟交换机。源服务器发出的原始数据帧,在 VTEP 上被封装成 VXLAN 格式的报文,并在 IP 网络中传递到另外一个 VTEP 上,并经过解封转还原出原始的数据帧,最后转发给目的服务器。


什么是 VXLAN VNI


以太网数据帧中 VLAN 只占了 12 比特的空间,这使得 VLAN 的隔离能力在数据中心网络中力不从心。而 VNI 的出现,就是专门解决这个问题的。


VNI(VXLAN Network Identifier,VXLAN 网络标识符),VNI 是一种类似于 VLAN ID 的用户标识,一个 VNI 代表了一个租户,属于不同 VNI 的虚拟机之间不能直接进行二层通信。VXLAN 报文封装时,给 VNI 分配了 24 比特的长度空间,使其可以支持海量租户的隔离。


另外,在分布式网关部署场景下,VNI 还可分为二层 VNI 和三层 VNI,它们的作用不同:


  • 二层 VNI 是普通的 VNI,以 1:1 方式映射到广播域 BD,实现 VXLAN 报文同子网的转发。

  • 三层 VNI 和 VPN 实例进行关联,用于 VXLAN 报文跨子网的转发。


哪些 VTEP 之间需要建立 VXLAN 隧道


一条 VXLAN 隧道是由两个 VTEP 来确定建立的。数据中心网络中存在很多个 VTEP,那么哪些 VTEP 间需要建立 VXLAN 隧道呢?



通过 VXLAN 隧道,“二层域”可以突破物理上的界限,实现大二层网络中 VM 之间的通信。所以,连接在不同 VTEP 上的 VM 之间如果有“大二层”互通的需求,这两个 VTEP 之间就需要建立 VXLAN 隧道。换言之,同一大二层域内的 VTEP 之间都需要建立 VXLAN 隧道。


例如,上图中 VTEP_1 连接的 VM、VTEP_2 连接的 VM 以及 VTEP_3 连接的 VM 之间需要“大二层”互通,那 VTEP_1、VTEP_2 和 VTEP_3 之间就需要两两建立 VXLAN 隧道。



什么是“同一大二层域”


上文提到的“同一大二层域”,就类似于传统网络中 VLAN(虚拟局域网)的概念,只不过在 VXLAN 网络中,它有另外一个名字,叫做 Bridge-Domain,简称 BD。


我们知道,不同的 VLAN 是通过 VLAN ID 来进行区分的,那不同的 BD 是如何进行区分的呢?其实前面已经提到了,就是通过 VNI 来区分的。对于华为 CloudEngine 系列交换机而言,BD 与 VNI 是 1:1 的映射关系,这种映射关系是通过在 VTEP 设备上配置命令行建立起来的,配置样例如下:


bridge-domain 10   //表示创建一个“大二层广播域”BD,其编号为10
复制代码


 vxlan vni 5000  //表示在BD 10下,指定与之关联的VNI为5000
复制代码


#
复制代码

VTEP 设备会根据以上配置生成 BD 与 VNI 的映射关系表,该映射表可以通过命令行查看,如下所示:


<HUAWEI> display vxlan vni
复制代码


Number of vxlan vni : 1 
复制代码


VNI            BD-ID            State  
复制代码


--------------------------------------- 
复制代码


5000           10               up
复制代码

有了映射表后,进入 VTEP 的报文就可以根据自己所属的 BD 来确定报文在进行 VXLAN 封装时,该添加哪个 VNI 标识。那么,报文根据什么来确定自己属于哪个 BD 呢?


如何确定报文属于哪个 BD


这里要先澄清下,VTEP 只是交换机承担的一个角色而已,只是交换机功能的一部分。也就是说,并非所有进入到交换机的报文都会走 VXLAN 隧道(也可能报文就是走普通的二三层转发流程)。所以,我们在回答“如何确定报文属于哪个 BD”之前,必须先要回答“哪些报文要进入 VXLAN 隧道”。


哪些报文要进入 VXLAN 隧道?


回答这个问题之前,不妨先让我们回想一下 VLAN 技术中,交换机对于接收和发送的报文是如何进行处理的。报文要进入交换机进行下一步处理,首先得先过接口这一关,可以说接口掌控着对报文的“生杀大权”。传统网络中定义了三种不同类型的接口:Access、Trunk、Hybrid。这三种类型的接口虽然应用场景不同,但它们的最终目的是一样的:一是根据配置来检查哪些报文是允许通过的;二是判断对检查通过的报文做怎样的处理。


其实在 VXLAN 网络中,VTEP 上的接口也承担着类似的任务,只不过在 CloudEngine 系列交换机中,这里的接口不是物理接口,而是一个叫做“二层子接口”的逻辑接口。类似的,二层子接口主要做两件事:一是根据配置来检查哪些报文需要进入 VXLAN 隧道;二是判断对检查通过的报文做怎样的处理。在二层子接口上,可以根据需要定义不同的流封装类型(类似于传统网络中不同的接口类型)。CloudEngine 系列交换机目前支持的流封装类型有 dot1q、untag、qinq 和 default 四种类型:


  • dot1q:对于带有一层 VLAN Tag 的报文,该类型接口只接收与指定 VLAN Tag 匹配的报文;对于带有两层 VLAN Tag 的报文,该类型接口只接收外层 VLAN Tag 与指定 VLAN Tag 匹配的报文。

  • untag:该类型接口只接收不带 VLAN Tag 的报文。

  • qinq:该类型接口只接收带有指定两层 VLAN Tag 的报文。

  • default:允许接口接收所有报文,不区分报文中是否带 VLAN Tag。不论是对原始报文进行 VXLAN 封装,还是解封装 VXLAN 报文,该类型接口都不会对原始报文进行任何 VLAN Tag 处理,包括添加、替换或剥离。


除二层子接口外,还可以将 VLAN 作为业务接入点。将 VLAN 绑定到广播域 BD 后,加入该 VLAN 的接口即为 VXLAN 业务接入点,进入接口的报文由 VXLAN 隧道处理。


将二层子接口加入 BD


现在我们再来回答“如何确定报文属于哪个 BD”就非常简单了。其实,只要将二层子接口加入指定的 BD,然后根据二层子接口上的配置,设备就可以确定报文属于哪个 BD 啦!


下图的组网,一台虚拟化服务器中有两个不同 VLAN 的虚拟机 VM1(VLAN 10)和 VM2(VLAN 20),它们与其他虚拟机通信时需要接入 VXLAN 网络。此时我们可以分别在 VTEP 的物理接口 10GE 1/0/1 上,分别针对 VM1 和 VM2 封装不同的二层子接口,并将其分别加入不同的 BD。这样后续 VM1 和 VM2 的流量将会进入不同的 VXLAN 隧道继续转发。


在这个举例中,vSwitch 的上行口配置成 Trunk 模式,且 PVID 为 20。这样 vSwitch 发给 VTEP 的报文中,既有带 tag 的 VM1 流量,又有 untag 的 VM2 流量,此时在 VTEP 的接入口上创建两个二层子接口,分别配置为 dot1q 和 untag 的封装类型。



下面就基于上图,结合华为 CloudEngine 交换机上的配置举例进行说明。


在 CloudEngine 交换机的接入物理接口 10GE 1/0/1 上,分别创建二层子接口 10GE 1/0/1.1 和 10GE 1/0/1.2,并分别配置其流封装类型为 dot1q 和 untag。


interface 10GE1/0/1.1 mode l2   //创建二层子接口10GE1/0/1.1
复制代码


 encapsulation dot1q vid 10   //只允许携带VLAN Tag 10的报文进入VXLAN隧道
复制代码


 bridge-domain 10   //指定报文进入的是BD 10
复制代码


#
复制代码


interface 10GE1/0/1.2 mode l2   //创建二层子接口10GE1/0/1.2
复制代码


 encapsulation untag   //只允许不携带VLAN Tag的报文进入VXLAN隧道
复制代码


 bridge-domain 20   //指定报文进入的是BD 20
复制代码


#
复制代码

VXLAN 隧道是怎么建立的


现在,我们可以来看下 VXLAN 隧道是怎么建立起来的。一般而言,隧道的建立不外乎手工方式和自动方式两种。


手工方式建立 VXLAN 隧道


这种方式需要用户手动指定 VXLAN 隧道的源 IP 为本端 VTEP 的 IP、目的 IP 为对端 VTEP 的 IP,也就是人为地在本端 VTEP 和对端 VTEP 之间建立静态 VXLAN 隧道。


对于华为 CloudEngine 系列交换机,以上配置是在 NVE(Network Virtualization Edge)接口下完成的,配置举例如下:


interface Nve1   //创建逻辑接口NVE 1
复制代码


 source 1.1.1.1   //配置源VTEP的IP地址(推荐使用Loopback接口的IP地址)
复制代码


 vni 5000 head-end peer-list 2.2.2.2   
复制代码


 vni 5000 head-end peer-list 2.2.2.3   
复制代码


#
复制代码

其中,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 上会生成如下所示的一张表:


<HUAWEI> display vxlan vni 5000 verbose
复制代码


    BD ID                 : 10 
复制代码


    State                  : up 
复制代码


    NVE                    : 288
复制代码


    Source Address      : 1.1.1.1
复制代码


    Source IPv6 Address    : -
复制代码


    UDP Port               : 4789 
复制代码


    BUM Mode               : head-end
复制代码


    Group Address          : -  
复制代码


    Peer List            : 2.2.2.2 2.2.2.3  
复制代码


    IPv6 Peer List         : -
复制代码

根据上表中的 Peer List,本端 VTEP 就可以知道属于同一 BD(或同一 VNI)的对端 VTEP 都有哪些,这也就决定了同一大二层广播域的范围。当 VTEP 收到 BUM(Broadcast&Unknown-unicast&Multicast,广播 &未知单播 &组播)报文时,会将报文复制并发送给 Peer List 中所列的所有对端 VTEP(这就好比广播报文在 VLAN 内广播)。因此,这张表也被称为“头端复制列表”。当 VTEP 收到已知单播报文时,会根据 VTEP 上的 MAC 表来确定报文要从哪条 VXLAN 隧道走。而此时 Peer List 中所列的对端,则充当了 MAC 表中“出接口”的角色。


自动方式建立 VXLAN 隧道


自动方式下 VXLAN 隧道的建立需要借助于 EVPN(Ethernet VPN)协议。


如何确定报文要进哪条隧道?


属于同一 BD 的 VXLAN 隧道可能不止一条,比如上文的头端复制列表中,同一个源端 VTEP(1.1.1.1)对应了两个对端 VTEP(2.2.2.2 和 2.2.2.3)。那就带来了另一个问题,报文到底应该走哪一条隧道呢?


我们知道,基本的二三层转发中,二层转发依赖的是 MAC 表,如果没有对应的 MAC 条目,则主机发送 ARP 广播报文请求对端的 MAC 地址;三层转发依赖的是 FIB 表。在 VXLAN 中,其实也是同样的道理。在下一小节中,将介绍 VXLAN 网络中报文的转发流程,相信看完下面的内容,关于“如何确定报文要进哪条隧道”的疑惑也就迎刃而解了。


VXLAN 网关有哪些种类


VXLAN 二层网关与三层网关


和 VLAN 类似,不同 VNI 之间的主机,以及 VXLAN 网络和非 VXLAN 网络中的主机不能直接相互通信。为了满足这些通信需求,VXLAN 引入了 VXLAN 网关的概念。VXLAN 网关分为二层网关和三层网关:


  • VXLAN 二层网关:用于终端接入 VXLAN 网络,也可用于同一 VXLAN 网络的子网通信。

  • VXLAN 三层网关:用于 VXLAN 网络中跨子网通信以及访问外部网络。


VXLAN 集中式网关与分布式网关


根据三层网关部署方式的不同,VXLAN 三层网关又可以分为集中式网关和分布式网关。


VXLAN 集中式网关


集中式网关是指将三层网关集中部署在一台设备上,如下图所示,所有跨子网的流量都经过这个三层网关转发,实现流量的集中管理。



部署集中式网关的优点和缺点如下:


  • 优点:对跨子网流量进行集中管理,网关的部署和管理比较简单。

  • 缺点:

  • 转发路径不是最优:同一二层网关下跨子网的数据中心三层流量都需要经过集中三层网关绕行转发(如图中蓝色虚线所示)。

  • ARP 表项规格瓶颈:由于采用集中三层网关,通过三层网关转发的终端的 ARP 表项都需要在三层网关上生成,而三层网关上的 ARP 表项规格有限,这不利于数据中心网络的扩展。


VXLAN 分布式网关


通过部署分布式网关可以解决集中式网关部署的缺点。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 报文封装/解封装,实现跨子网的终端租户通信,以及外部网络的访问。



VXLAN 分布式网关具有如下特点:


  • 同一个 Leaf 节点既可以做 VXLAN 二层网关,也可以做 VXLAN 三层网关,部署灵活。

  • Leaf 节点只需要学习自身连接服务器的 ARP 表项,而不必像集中三层网关一样,需要学习所有服务器的 ARP 表项,解决了集中式三层网关带来的 ARP 表项瓶颈问题,网络规模扩展能力强。


VXLAN 网络中报文是如何转发的


本节以集中式 VXLAN 网络(手工方式建立 VXLAN 隧道)为例,分别介绍相同子网内、不同子网间是如何进行通信的,帮助您理解上文所介绍到的概念。


集中式 VXLAN 中同子网互通流程


如下图所示,VM_A、VM_B 和 VM_C 同属于 10.1.1.0/24 网段,且同属于 VNI 5000。此时,VM_A 想与 VM_C 进行通信。


由于是首次进行通信,VM_A 上没有 VM_C 的 MAC 地址,所以会发送 ARP 广播报文请求 VM_C 的 MAC 地址。



下面就让我们根据 ARP 请求报文及 ARP 应答报文的转发流程,来看下 MAC 地址是如何进行学习的。


ARP 请求报文转发流程


结合下图,我们来一起了解一下 ARP 请求报文的转发流程。



  1. VM_A 发送源 MAC 为 MAC_A、目的 MAC 为全 F、源 IP 为 IP_A、目的 IP 为 IP_C 的 ARP 广播报文,请求 VM_C 的 MAC 地址。

  2. VTEP_1 收到 ARP 请求后,根据二层子接口上的配置判断报文需要进入 VXLAN 隧道。确定了报文所属 BD 后,也就确定了报文所属的 VNI。同时,VTEP_1 学习 MAC_A、VNI 和报文入接口(Port_1,即二层子接口对应的物理接口)的对应关系,并记录在本地 MAC 表中。之后,VTEP_1 会根据头端复制列表对报文进行复制,并分别进行封装。

  3. 报文到达 VTEP_2 和 VTEP_3 后,VTEP 对报文进行解封装,得到 VM_A 发送的原始报文。同时,VTEP_2 和 VTEP_3 学习 VM_A 的 MAC 地址、VNI 和远端 VTEP 的 IP 地址(IP_1)的对应关系,并记录在本地 MAC 表中。之后,VTEP_2 和 VTEP_3 根据二层子接口上的配置对报文进行相应的处理并在对应的二层域内广播。


ARP 应答报文转发流程


结合下图,我们来一起了解一下 ARP 应答报文的转发流程。



  1. 由于此时 VM_C 上已经学习到了 VM_A 的 MAC 地址,所以 ARP 应答报文为单播报文。报文源 MAC 为 MAC_C,目的 MAC 为 MAC_A,源 IP 为 IP_C、目的 IP 为 IP_A。

  2. VTEP_3 接收到 VM_C 发送的 ARP 应答报文后,识别报文所属的 VNI(识别过程与步骤②类似)。同时,VTEP_3 学习 MAC_C、VNI 和报文入接口(Port_3)的对应关系,并记录在本地 MAC 表中。之后,VTEP_3 对报文进行封装。

  3. 报文到达 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 均已学习到了对方的 MAC 地址。之后,VM_A 和 VM_C 将采用单播方式进行通信。单播报文的封装与解封装过程,与上图中所展示的类似,本文就不再赘述啦!


集中式 VXLAN 中不同子网互通流程


如下图所示,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 和 VM_B 处于不同网段,VM_A 需要先发送 ARP 广播报文请求网关(BDIF 10)的 MAC。获得网关的 MAC 后,VM_A 先将数据报文发送给网关;之后网关也将发送 ARP 广播报文请求 VM_B 的 MAC,获得 VM_B 的 MAC 后,网关再将数据报文发送给 VM_B。以上 MAC 地址学习的过程与集中式 VXLAN 中同子网互通流程中 MAC 地址学习的流程一致,不再赘述。现在假设 VM_A 和 VM_B 均已学到网关的 MAC、网关也已经学到 VM_A 和 VM_B 的 MAC,下面就让我们看下数据报文是如何从 VM_A 发送到 VM_B 的。



如上图所示,数据报文从 VM_A 发送到 VM_B 的流程如下:


  1. VM_A 先将数据报文发送给网关。报文的源 MAC 为 MAC_A,目的 MAC 为网关 BDIF 10 的 MAC_10,源 IP 地址为 IP_A,目的 IP 为 IP_B。

  2. VTEP_1 收到数据报文后,识别此报文所属的 VNI(VNI 5000),并根据 MAC 表项对报文进行封装。可以看到,这里封装的外层源 IP 地址为本地 VTEP 的 IP 地址(IP_1),外层目的 IP 地址为对端 VTEP 的 IP 地址(IP_3);外层源 MAC 地址为本地 VTEP 的 MAC 地址(MAC_1),而外层目的 MAC 地址为去往目的 IP 的网络中下一跳设备的 MAC 地址。

  3. 报文进入 VTEP_3,VTEP_3 对报文进行解封装,得到 VM_A 发送的原始报文。然后,VTEP_3 会对报文做如下处理:

  4. VTEP_3 发现该报文的目的 MAC 为本机 BDIF 10 接口的 MAC,而目的 IP 地址为 IP_B(10.1.20.1),所以会根据路由表查找到 IP_B 的下一跳。

  5. 发现下一跳为 10.1.20.10,出接口为 BDIF 20。此时 VTEP_3 查询 ARP 表项,并将原始报文的源 MAC 修改为 BDIF 20 接口的 MAC(MAC_20),将目的 MAC 修改为 VM_B 的 MAC(MAC_B)。

  6. 报文到 BDIF 20 接口时,识别到需要进入 VXLAN 隧道(VNI 6000),所以根据 MAC 表对报文进行封装。这里封装的外层源 IP 地址为本地 VTEP 的 IP 地址(IP_3),外层目的 IP 地址为对端 VTEP 的 IP 地址(IP_2);外层源 MAC 地址为本地 VTEP 的 MAC 地址(MAC_3),而外层目的 MAC 地址为去往目的 IP 的网络中下一跳设备的 MAC 地址。

  7. 报文到达 VTEP_2 后,VTEP_2 对报文进行解封装,得到内层的数据报文,并将其发送给 VM_B。


VM_B 回应 VM_A 的流程与上述过程类似,本文就不再赘述啦!


评论

发布
暂无评论
什么是VXLAN