VxLAN 数据面封装协议
2011 年 8 月,主要由 VMware 与 Cisco 公司草拟并由 IETF 发布了 RFC 7348 草案《Virtual eXtensible Local Area Network (VXLAN): A Framework for Overlaying Virtualized Layer 2 Networks over Layer 3 Networks》。 VxLAN(Virtual Extensible Local Area Network,虚拟扩展本地局域网)是 IETF 定义的 NVO3(Network Virtualization over Layer 3)标准技术之一,从名字可以看出,VxLAN 最初定位于对传统 VLAN 协议的一种增强替代方案。本质是一种 Tunneling(隧道)网络传输技术,又称为 Overlay 网络,特点是将 L2 Frame 封装到 UDPVxLAN Header 中,并在 L3 IP 网络中进行传输(L2 over L3)。 通过 VxLAN 技术可以将处于不同 L3 Subnets 的 Underlay 网络设备整合到一个逻辑上的 Overlay 网络中。对于 Overlay 网络的终端用户而言,这些网络设备似乎 “真实” 地部署在了同一个 L2 数据链路层网络中,以此来适应大规模云计算多租户隔离网络的需求。
VxLAN 组网拓扑介绍
如上图所示,首先介绍构建一个 VxLAN 网络所需要的组成部分,包括以下 3 组核心元素:
NVE / VTEP / VxLAN Tunnel
VxLAN L2 Gateway / L2 VNI / BD
VxLAN L3 Gateway / L3 VNI / VRF
NVE / VTEP / VxLAN Tunnel
在抽象的 Overlay 网络中,NVE(Network Virtualization Edge,网络虚拟边缘节点)是一个处于 Underlay 网络和 Overlay 网络交界处的边缘设备,提供网络虚拟化功能,用于衔接 2 个不同的网络类型。 根据具体的组网环境,NVE 可以是主机中运行的一个虚拟网元,也可以是一个物理网元(e.g. Spine/Leaf 交换机)。在本文中主要讨论硬件 NVE 的情况。
• 软件 NVE 常见的有 OvS Tun Bridge 和 Linux Bridge + Tun 虚拟隧道网卡设备。
• 硬件 NVE 常见的有 Spine-Leaf 交换机设备。 在具体的 VxLAN Overlay 网络中,NVE 需要具备 VTEP(VxLAN Tunnel Endpoints,隧道端点)功能,用于完成 VxLAN 协议栈的封装/解封装。两个 VTEP(local-VTEP 和 remote-VTEP)之间具有 Underlay IP 路由可达性,继而可以构造一个 L3 之上的 VxLAN Tunnel。 区别于 VLAN 使用 VLAN ID 来隔离二层网络,VxLAN 使用了 VNI(VXLAN Network Identifier,VXLAN 网络标识符)来作为隔离标记。在一个 VxLAN Tunnel 中,可用于传输若干个由 VNI 进行隔离的 VxLAN 虚拟网络。 另外,与 VLAN 网络隔离需要通过 L3 Gateway 来互联互通类似,在 VxLAN 网络隔离中同样需要 VxLAN Gateway 来实现 VxLAN 虚拟网络与其他类型网络之间的互联互通,而且情况会更加复杂。根据用途的区别,VxLAN Gateway 大体上可以分为 VxLAN L2 Gateway 和 VxLAN L3 Gateway 这 2 种类型,对应的 VNI 也根据用途被细分为 L2 VNI 和 L3 VNI 这 2 种类型。
VxLAN L2 Gateway / L2 VNI / BD
VxLAN L2 Gateway 用于实现 VxLAN 和 VLAN 之间的互联。 在 Leaf NVE 中,为了实现 VxLAN L2 Gateway 的 L2 隔离和转发而引入了 BD(Bridge Domain)的概念,它是一个可配置的二层广播域,类似于一个虚拟网桥设备。在新建一个 BD Instance 时,通常会将 BD Instance、L2 VNI、Local VLAN ID 配置为一一对应,并且在一个 BD Instance 中会同时存在 2 种类型的接口:
Overlay 侧接口
是一个对内的二层接口设备,更准确的说是一个 Host 上联 Leaf Port 的二层子接口设备(e.g. CloudEngine VAP),具有同一个 VLAN ID 的下挂终端(VM/Host)的 Original L2 Frame 会从此接口进入到 VTEP 中进行后续的封装。
Underlay 侧接口
是一个对外的三层接口设备,会被分配一个 Underlay IP,与物理网络相连。在 Underlay 网络中的多个 VTEP 之间具备 IP 路由可达性,用于构建 VxLAN Tunnel。被 VTEP 封装之后的 VxLAN 封装包会从此接口流出进入 VxLAN Tunnel 传输。 另外,BD Instance 为了能够 “缝合“ Local VLAN 和 VxLAN Tunnel 这两段网络,维护了 VID-VNID 映射关系。通过这样的方式,VxLAN L2 Gateway 就将 Local VLAN 作为了 VxLAN Tunnel 的接入点,所有加入到 Local VLAN 中的终端(VM/Host)L2 流量,就会进入到对应的 VxLAN Tunnel 中。
VxLAN L3 Gateway / L3 VNI / VRF
VxLAN L3 Gateway 用于实现下列 2 种互联场景:
两个 VNI 不同的 VxLAN 虚拟网络之间的互联互通。
VxLAN 虚拟网络和外部 IP 网络之间的互联互通。
可见,VxLAN L3 Gateway 主要提供了 L3 隔离和转发功能,具体沿用了 L3 VPN Instance 中的 VRF 技术。每个 VRF 都具有自己的 Route Tables,类似于 Linux Network Namespace,同时维护了 VRF 和 L3 VNI 的映射关系,以此在 VxLAN L3 Gateway 层面实现了对不同租户之间的 L3 隔离。 另外,在常见的 Spine-Leaf 数据中心网络架构中,根据将 VxLAN L3 Gateway 部署在 Spine 或者部署在 Leaf 上的不同,又可以再细分为 2 种不同的 VxLAN 组网方案:
集中式 VxLAN L3 Gateway 组网方案
分布式 VxLAN L3 Gateway 组网方案
下图中概述性的列举了这 2 种组网方案的异同。
集中式 VxLAN L3 Gateway 组网方案
在分布的 Leaf 上部署 VxLAN L2 Gateway 功能,在集中的 Spine 上部署 VxLAN L3 Gateway 功能。这意味着所有跨网络之间的流量都需要经过 Spine 进行转发,包括:VxLAN 虚拟网络之间,以及 VxLAN 虚拟网络与外部 IP 网络之间的流量。 该方案的优点是跨网络流量集中管理,简化网关部署和管理。而缺点是:
转发路径并非最优
跨网络之间的流量都需要在 Spine 上进行 L3 绕行,这样就导致了 Leaf 与 Spine 之间的链路上存在冗余的报文,额外占用了大量的带宽。
Spine 的 ARP 表项压力大
所有通过 L3 转发的 ARP 表项(MAC-IP)都存储在 Spine 上,当终端的数量越来越多时,Spine 就容易成为网络瓶颈。 所以该方案适用于小型组网环境。
分布式 VxLAN L3 Gateway 组网方案
在分布的 Leaf 上同时部署了 VxLAN L2 和 L3 Gateway,而 Spine 只作为常规 L3 转发节点并不需要感知 VxLAN 隧道的存在。具有以下特性:
相同 VTEP 下跨网络之间的流量在 Leaf 上完成 L3 转发。
只有不同 VTEP 下跨网络之间的流量需要经过 Spine 完成 L3 转发。
另外,只要求 Leaf 学习下挂终端的 ARP 表项,从而解决了 Spine 规格带来的容量瓶颈问题。所以该方案适用于中大规模(5000 台服务器及以上)的高性能网络。 而缺点是网关部署、故障定位及网络运维相对复杂,通常需要结合 EVPN Control Plane 来完成一系列的自动化配置工作,例如:基于 BGP Peer 的 VTEP 自动发现、VxLAN Tunnel 自动建立,ARP 表项自动生成等等。
VxLAN 协议栈解析
VxLAN 的协议栈比较简单,定义了一种 MAC-in-IP 的报文封装格式。
Original L2 Frame
一个原始且完整的 L2 数据帧,是业务层发出(通常是 VM)的实际 Payload 数据。
VxLAN Header(8Bytes)
将 Original L2 Frame 封装到 VxLAN Header(8Bytes)成为 Overlay Segment。
VxLAN Flags(8bits):标记字段,如果 VNI 有效,则固定取值为 00001000。
Reserved(24bits):保留字段,固定取值为全 0。
VNI(VxLAN Network Identifier,24bits):最多支持 16777216(1600 万)个二层隔离网络。根据用途的不同可分为 L2 VNI 和 L3 VNI。
Reserved(8bits):保留字段,固定取值为全 0。
UDP Header(8Bytes)
是 Overlay 和 Underlay 的分界线。UDP 协议由于其高效率、低占用的特性常被用作隧道封装协议的传输层。
UDP srcPort(16bits):由 local-VTEP 通过对 Original L2 Frame 进行 HASH 计算后得出,该特性使得 VxLAN 封装包在 Receive Site 具备了可行的 HASH-base 负载均衡处理能力(e.g. ECMP 等价路由)。
UDP dstPort / VxLAN Port(16bits):缺省取值为 UDP 4789,根据具体设备型号可能支持配置更改。
UDP Length(16bits):指示一个 UDP 数据报的总长度。
Checksum(16bits):检验字段。
Outer IP Header(20Bytes)
是 Underlay 的 L3 IP Header 封装。
srcIP 是 local-VTEP 的 IP 地址。
dstIP 可能是 remote-VTEP 的 IP 单播地址,也可能是用于 BUM 流量的多播/组播地址。
Outer MAC Header
是 Underlay 的 L2 Frame 封装。dstMAC 和 srcMAC 地址视乎于具体的 Underlay 网络拓扑。
srcMAC 是 local-VTEP 的 MAC 地址;
dstMAC 视乎于具体的 Underlay 以太网络拓扑。
VxLAN 数据面转发原理
同 VNI 的 BUM 报文转发场景
BUM(Broadcast,Unknown-unicast,Multicast)是网络中常见的 3 种流量类型,分别表示:
广播流量(Broadcast)
指发送到网络中所有设备的流量,例如:ARP 报文、DHCP 报文等。
未知单播流量(Unknown-unicast)
指发送给网络中不存在的设备的流量,例如:发往一个错误的 MAC 地址的报文等。当交换机收到一个未知目的 MAC 地址的报文时,它需要向除了源端口外的所有端口转发该报文,以便让目的主机能够收到该报文并发送响应。因此,未知单播报文也是广播报文的一种,也会对网络带宽造成浪费。
组播流量(Multicast)
指发送给一组目标设备的流量,这些设备加入到了一个组播组,组播流量的目的地址也是特定的组播地址,因此对网络带宽的占用相较于广播更少一些。 在网络中,对于不同类型的 BUM 报文,交换机的处理方式也不同,例如,对于 Broadcast 和 Multicast 报文,交换机会将它们转发到所有的端口,而对于 Unknown-unicast 报文,则只会将它们转发到除源端口外的所有端口。基于这样的特性,为了简单理解,我们可以将 BUM 报文统称为 Flooding 流量。 在大规模的 VxLAN 场景中,由于多个 Overlay 虚拟网络共享 Underlay 物理网络,多租户情况下,这些 Flooding(洪泛)流量对物理带宽资源的占用尤为突出,需要特别的注意。 物理网络设备对 BUM 的处理方式(数据包复制)大体上有 2 种:
头端复制(Head-End Replication,HER)
在源头(即发送端所在的端口)将 BUM 流量复制到多个目的地,每个目的地对应着一个收件人(e.g. 一个接收组播流的客户端)。这种方式需要在源端口上复制和转发每个数据包,因此可能会导致性能问题和链路拥塞。头端复制适用于小规模网络,常用于数据中心的二层网络中。
核心复制(Core Replication,CR)
将 BUM 流量复制到一组专用的核心设备,这些设备负责将流量复制到所有需要它的接收方(e.g. 接收组播流的客户端)。这种方式通过在核心层进行复制,避免了在源端口上进行大量的复制和转发,因此对网络性能的影响更小。核心复制适用于大规模网络,常用于广域网环境中。 对应的 VxLAN 硬件 NVE 同样有 2 种 BUM 报文处理方式:
VxLAN 头端复制 + Underlay 单播路由
由 local-VTEP(源头设备)负责对终端(VM/Host)发出的 BUM 报文进行复制,并采用 Underlay 单播路由的方式,经过 VxLAN Tunnels 将 BUM 传递到其他多个 remote-VTEPs 接收。remote-VTEP 接收到 BUM 报文之后,就不再 Flooding,避免了环路。
再展开一下 Local LAN 流量接入 VxLAN Tunnel 的流程细节。如下图所示,当 VTEP 接收到终端的携带 VLAN 的 BUM 之后,首先会通过 VLAN ID 匹配到对应的 BD,然后在该 BD 内查找 VNI-Tunnel List,最后为 BUM 封装上不同的 OverlayUnderlay Header 之后向 VNI-Tunnel List 指定的所有 VxLAN Tunnels 发出。
VxLAN 核心复制 + Underlay 组播路由
首先将网络中所有的 VTEPs 设备都加入到同一个组播组中,部署专门的核心层设备并通过组播路由协议(e.g. PIM)或 IPv6 多播路由协议(e.g. IGMP )与 VTEPs 建立一个组播信道和相应的组播转发表项。当终端发出 BUM 报文后,local-VTEP 会为其封装好组播目的 IP 地址,然后进入核心层设备进行数据复制,并采用 Underlay 组播的方式,将 BUM 传递到同一个组播组内的其他 remote-VTEPs 接收。
同 VNI 的单播报文转发场景
同 VNI 的单播报文转发场景中,一个 IP 单播报文的发送实际上可以拆分为 3 次转发流程,分别是:
ARP Request 广播转发;
ARP Reply 单播转发;
IP 单播转发。
下面以较为简单的 “VxLAN 头端复制 + Underlay 单播路由“ 方式为例进行介绍:VM_A、VM_B、VM_C 同属于 VNI 5000,也同属于 10.1.1.0/24 子网。此时,VM_A 想与 VM_C 进行首次通信。
ARP Request 广播转发流程
首次通信,VM_A 没有 VM_C 的 MAC 地址,所以首先进行 ARP Request 广播转发流程,请求获取 VM_C 的 MAC 地址。
VM_A 发送 srcMAC 为 MAC_A、dstMAC 为 “全 F(广播)”、srcIP 为 IP_A、dstIP 为 IP_C 的 ARP Request 广播报文,请求获取 VM_C 的 MAC 地址。
VTEP_1 收到 ARP Request 后,根据二层子接口上的 VLAN 和 DB 配置判断报文需要进入 VxLAN Tunnel。确定报文所属 VNID 后,VTEP_1 首先会自学习 MAC_A、VNID 和 Port_1(二层子接口对应的物理接口)的映射关系,并记录在本地 MAC Table 中。之后,VTEP_1 会根据头端复制列表对报文进行复制,并分别进行 OverlayUnderlay Header 封装。
封装的 Outer srcIP 地址为 VTEP_1 的 IP 地址,Outer dstIP 地址为 remote-VTEP(VTEP_2 或 VTEP_3)的 IP 地址;Outer srcMAC 地址为 VTEP_1 的 MAC 地址,而 Outer dstMAC 地址为去往目的 IP 的网络中下一跳设备的 MAC 地址。
根据 Outer MAC/IP 信息,在 Underlay IP 网络中进行传输,直至到达 remote-VTEP。
报文到达 remote-VTEP 后,对报文进行解封装,得到 VM_A 发送的 Original L2 Frame。同时,remote-VTEP 学习 VM_A 的 MAC 地址、VNID 和 VTEP_1 的 IP 地址的映射关系,并记录在本地 MAC Table 中。之后,remote-VTEP 根据二层子接口上 BD 和 VLAN 配置对报文在 Local LAN 二层域内进行广播。
VM_B 或 VM_C 接收到 ARP Request 后,比较报文中的 dstIP 地址是否为本机的 IP 地址。VM_B 发现 dstIP 不是本机 IP,故将报文丢弃;VM_C 发现 dstIP 是本机 IP,则对 ARP Request 做出应答。
ARP Reply 单播转发流程
VM_C 应答 ARP Reply 时,由于 VM_C 已经知道了 VM_A 的 MAC 地址,所以 ARP Reply 报文为单播报文。报文的 srcMAC 为 MAC_C,dstMAC 为 MAC_A, srcIP 为 IP_C、dstIP 为 IP_A。
VTEP_3 接收到 VM_C 发送的 ARP Reply 报文后,同样先自学习 MAC_C、VNI 和 Port_3 的映射关系,并记录在本地 MAC Table 中。然后 VTEP_3 对报文进行封装。
封装的 Outer srcIP 地址为 VTEP_3 的 IP 地址,Outer dstIP 地址为 VTEP_1 的 IP 地址;Outer srcMAC 地址为 VTEP_3 的 MAC 地址,而 Outer dstMAC 地址为去往目的 IP 的网络中下一跳设备的 MAC 地址。
根据 Outer MAC/IP 信息,在 Underlay IP 网络中进行传输,直至到达 remote-VTEP。
报文到达 VTEP_1 后,VTEP_1 对报文进行解封装,得到 VM_C 发送的 Original L2 Frame。同时,VTEP_1 学习 VM_C 的 MAC 地址、VNI 和 VTEP_3 的 IP 地址的映射关系,并记录在本地 MAC Table 中。然后 VTEP_1 将解封装后的报文发送给 VM_A。
至此,VM_A 和 VM_C 均已学习到了对方的 MAC 地址。之后,VM_A 和 VM_C 将采用 IP 单播方式进行转发。转发流程类似,这里不再赘述。
不同 VNI 的单播报文转发场景
不同 VNI 的单播报文转发场景,又称为 “跨 VxLAN 子网的单播报文转发场景“,需要结合上文中提到的 VxlAN L3 Gateway 来共同完成。 这里以较为简单的 “集中式 VxLAN L3 Gateway 组网方案“ 来进行介绍:Spine 提供 L3 Forwarding 功能,VM1 和 VM4 处于不同的 VxLAN 子网,VM1 的网关是 VSI-Interface10,VM4 的网关是 VSI-Interface20,并分别接入到不同的 VSI(Virtual Switching Instance,虚拟交换实例)中,VSI 具有传统以太网交换机的所有功能。 假设现在已经不是首次通信,VM1、VM4、VSI-Interface10、VSI-Interface20 之间的 MAC 地址都已经互相学习到了。此时 VM1 向 VM4 发出跨子王的 IP 单播报文。
VM1 先将报文发送给 VSI-Interface10。
Leaf-A 收到 VM1 发来的报文,识别此报文属于 VxLAN 10,查找 dstMAC G10 的表项,然后对报文进行 VxLAN 封装后从 Tunnel2 发送出去。
Spine-C 收到 Leaf-A 发来的报文,进行 L3 Forwarding 处理:
发现 Outer dstIP 是自己,于是对报文进行解封装。
解完封装后,Spine-C 发现 Original L2 Frame 的 dstMAC 是本机 VSI-interface10 的 MAC、dstIP 是 IP4,于是根据路由表查找 IP4 的下一跳;
发现一下跳为 Leaf-B、出接口为 VSI-Interface20,再查询 ARP 表项,并将 Original L2 Frame 的 srcMAC 修改为 VSI-interface20 的 MAC 地址,将 dstMAC 修改为 VM4 的 MAC 地址。
报文到达 VSI-interface20 接口时,识别到需要进入 VxLAN 20,所以根据 MAC 表对报文进行封装。
封装的 VNI 为 20,Outer srcIP 为 Spine-C 的 IP 地址,Outer dstIP 为 Leaf-B 的 IP 地址;Outer srcMAC 为 Spine-C 的 MAC 地址,Outer dstMAC 为去往目的 IP 的网络中下一跳设备的 MAC 地址。
封装后的报文,根据 Outer dstMAC/dstIP 信息,在 Underlay IP 网络中进行传输,直至到达 remote-VTEP。
Leaf-B 收到 Spine-C 发来的报文后,解封装,得到 Original L2 Frame。在 VxLAN 20 内找到 dstMAC 为 MAC4 的表项,并将报文从对应的接口和 VLAN 中发送出去。
最终 VM4 收到了来自 VM1 的报文。
VxLAN/UDP 的 MTU 问题 UDP(User Datagram Protocol,用户数据报协议),是一种无连接的、非可靠的传输层协议,常被应用于 Tunnel 协议的传输层。主要原因有以下几点:
速度快
只要应用进程将 Payload 传给 UDP,UDP 将此数据打包后就立刻传递给 IP 层,而无需作其他额外的机制处理。
首部开销小
相较于 TCP Header 都有 20Bytes 的首部开销,UDP Header 只有 8Bytes。
负载均衡特性
因为无连接,所以 UDP srcPort 可以使用 HASH 计算值,该特性能够在各个网络环节中进行负载均衡优化,例如:ECMP 传输环节,CPU 队列绑定收包环节等。 但相对的,UDP 也存在一个关键的 MTU 分片问题,即:假如 UDP Datagram 进行分片,那么只有 First Fragment 是包含 UDP Header 的,一旦丢包就会导致 Receiver 无法重组出一个完整的 Datagram。如下图所示。
所以,当采用 UDP 作为传输层时,需要十分注意 MTU 的设置,才能带来更好的传输性能以及可靠性。根据 VXLAN RFC7348 中的建议,VxLAN 封装包不应该分片,否则在接收端 VTEP 上会丢弃分片的报文,导致无法正确解封装。
通常的,VM/Host 的默认 MTU 是 1500Bytes,即 Original L2 Frame 最大为 1500Bytes。在 VTEP 封装上 VxLAN Overhead 的 50Bytes(VxLAN header + UDP Header + Outer IP/MAC Header)之后,VxLAN 封装包的总长度就达到了 1550Bytes。 如果希望不对 VxLAN 封装包进行分片,可以通过 2 种常规手段来实现:
减小 VM/Host 的 MTU。
加大 Underlay 网络的 MTU。
根据实际的场景,需要考虑采用不同的实现方式。
DCN 场景中的 VxLAN MTU
在 DCN 场景中,由于运营商对整网环境具有把控能力,所以通常会采用从 “业务需求出发“ 的原则,即:调整 Underlay MTU 以适应 VM/Host MTU 的需求。所以,极端情况下,Underlay MTU 可能被设置为 9000Bytes。
DCI 场景中的 VxLAN MTU
并跨越两个地理位置分离的 DC(数据中心),通过 L3 路由广域网(WAN)或其他数据中心互连(DCI)传输连接的场景中。因为 VxLAN 封装包需要经过并非完全可控的第三方承载网络,所以对 MTU 的规划需要更加严谨。所以通常采用 “从适配性出发“ 的原则,即:对 VM/Host MTU 进行控制,确保在整个端到端的承载网中均小于 Underlay MTU。 以一个内层 ping 包(长度为 1422Bytes)为例,计算各层封装的长度如下表,发现最终的 VxLAN 封装包大于 1500Bytes,此时就需要修改 Inner MTU 以及 Inner App 的长度值,使其小于等于 1500Bytes。
EVPN MP-BGP 控制面协议
EVPN (Ethernet VPN)是一个 L2 VPN(L2-in-L3)协议,最初的设计目的是为了替换落后的 VPLS(Virtual Private LAN Service),号称为 Next Generation L2 VPN(下一代的 L2 VPN)。 后来,EVPN 逐渐演进为一套通用的 Control Plane 协议,而不是具体为了承载业务的 Data Plane 协议。EVPN Control Plane 可以与多种不同的 Data Plane 技术(包括:MPLS、SRv6、VxLAN 等)结合使用实现一套完整的数控分离 SDN 方案。 EVPN Control Plane 的全称为 EVPN MP-BGP(Ethernet VPN base on Multi-Protocols BGP),是一种基于 MP-BGP 协议可扩展性的实现方式,增加新的协议类型和路由类型,包括:
L2 VPN AFI(Address Family Identifier,地址族标识)
EVPN SAFI(Subsequent Address Family Identifier,子地址族标识)
EVPN NLRI(Network Layer Reachability Information,网络层可达性信息)
EVPN VxLAN SDN 方案
在引入 EVPN 作为 VxLAN 的 Control Plane 之前,需要通过手工的方式建立静态 VxLAN 隧道,即:手动指定 VxLAN Tunnel 的 local-VTEP 和remote-VTEP 的 IP 地址对,并构建 Tunnel。手工静态配置的方式在集中式 VxLAN L3 Gateway 组网方案中或许还能够勉强接受,但在大规模的分布式 VxLAN L3 Gateway 组网方案中会出现较为严峻的挑战,主要有 2 个方面:
网络扩展困难:网络变更需要手动修改集群配置,容易出现 “雪花设备“ 故障。
BUM 洪泛流量占比大:所有 VTEP 都需要通过 Flood and Learn(洪泛和自学习)来完成数据转发之前的 ARP 表项和主机路由表项学习。
为了解决这个问题,需要在 VxLAN 网络中引入 Control Plane 方案来提供灵活的运维管理支撑。目前最为流行和成熟的组合就是 EVPN VxLAN(RFC6624),依托于 BGP 在 E-BGP 和 I-BGP 场景中的适配性,也使得 VxLAN 不仅局限于 DCN(数据中心网络)场景,还能应用于 DCI(数据中心互联)场景。
相应的,采用 EVPN 作为 VxLAN 的 Control Plane 带来了 2 个核心优势:
EVPN 可实现 VTEP 自动发现、VxLAN Tunnel 的自动建立,从而降低网络运维的复杂度和提升了网络可扩展性。
EVPN 可实现 IP、MAC、VNI 等 ARP 和主机路由信息的自动宣告,从而有效减少了 BUM 泛洪流量。
EVPN VxLAN 的路由类型
EVPN 基于 MP-BGP NLRI 扩展引入了 5 种新的路由类型(Route Type),如下:
Type1. Ethernet Auto-Discovery Route(Ethernet 自动发现路由)
Type2. MAC/IP Advertisement Route(MAC/IP 通告路由)
Type3. Inclusive Multicast Ethernet Tag Route(集成多播 Ethernet Tag 路由)
Type4. Ethernet Segment Route(Ethernet 段路由)
Type5. IP Prefix Route(IP 前缀路由)
在 EVPN VxLAN 场景中,NVE(交换机)充当 PE 的角色,同时具备了 BGP Peer 和 VTEP 的功能,下文中统称为 VTEP Peer。其主要应用了 Type2、Type3、Type5 这 3 种路由类型,下面重点介绍这些路由类型的定义和作用。
Type2:MAC/IP Advertisement Route(MAC/IP 通告路由)
Type2 Route 的 EVPN NLRI 字段如下: • Route Distinguisher: 指示一个 EVPN Instance 的 RD 值,用于区分不同的 EVPN Instances。每个 EVPN Instance 都具有一个对应的 BD(二层广播域)。
• Ethernet Segment Identifier: EVPN 允许在同一物理网络上创建多个虚拟网络,这些虚拟网络被称为 Ethernet Segment。而 Ethernet Segment Identifier 就是该虚拟网络的唯一标识。在 VxLAN 场景中,ES 就是 VxLAN Tunnel,ESI 用于唯一标识一个 VxLAN Tunnel 的连接。
• Ethernet Tag ID 指示当前设备配置的以太网 VLAN ID。
• MAC Address Length 指示该 Route 携带的 host-MAC 地址的长度。
• MAC Address 指示该 Route 携带的 host-MAC 地址。
• IP Address Length 指示该 Route 携带的 host-IP 地址的掩码长度,为 32bits(IPv4)或 128bits(IPv6)。
• IP Address 指示该 Route 携带的 host-IP 地址。
• MPLS Label1 指示该 Route 携带的 L2 VNI,用于标识不同的 BD。
• MPLS Label2 指示该 Route 携带的 L3 VNI,用于标识不同的 VRF(L3 VPN)。VxLAN 网络中为了实现不同租户之间的隔离,需要通过不同的 VRF 来隔离租户的路由表。 从上述字段可见,Type2 Route 的关键特性就是支持对称 IRB(Integrated Bridging and Routing,集成的桥接和路由),能够同时发布 L2 MAC Switching 和 L3 IP Routing 信息,以此来支撑 VxLAN L2 和 L3 Gateway 应用场景。
基于这样的特性,Type2 Route 非常适用于云计算虚拟机迁移的场景(MAC Mobility,MAC 移动性),可以有效避免了虚拟机迁移期间所带来的 IP 地址更改,以及重新配置网络的问题。例如:当一台 VM 从 VTEP1 迁移到 VTEP2 时,VTEP2 会学习到该 VM 的 ARP 信息(通过 VM 发出的 gARP 实现),并生成 VM 对应的 Type2 Route,然后传递给 VTEP1。VTEP1 收到后,感知到 VM 的位置发生变化,触发 ARP 探测,当探测不到 VM 时,则会撤销 VM 在本地的 ARP 和主机路由信息。
VTEP 应用 Type2 通告 host-MAC 地址
当 VTEP 是 VxLAN L2 Gateway 时,VTEP Peer 之间可以通过 Type2 Route 来互相学习对方的 host-MAC Table,包括:host-MAC、BD、Interface 等信息。 如下图所示,Leaf1、Leaf2 是 VxLAN L2 Gateway,Host1、Host2 属于同一个 VxLAN 子网,Leaf1 向 Leaf2 通告它的 host-MAC Table。
Host1 通过特定的 Interface 和 BD 接入到 Leaf1 时,通常会触发 ARP、DHCP 等广播流量。Leaf1 以此来学习到 Host1 对应的 Host1-MAC 并记录在 BD 的 host-MAC Table 中。
随后 Leaf1 向 Leaf2 发送 Type2 Route,携带了 EVPN Instance RD、Host1-MAC、L2 VNI、VTEP IP 等信息。
Leaf2 收到 Type2 Route 后,根据 L2 VNI 匹配到相应的 BD,并将 Host1-MAC 保存在 BD 的 host-MAC Table 中。
VTEP 应用 Type2 通告 host-IP 精确路由
在 VxLAN 网络中,要想实现跨网络之间的三层互访,就需要在 VxLAN L3 Gateway 中应用 L3 VPN Instance 和隔离的 Route Table 来完成 IP Routing。 当 VTEP 是 VxLAN L3 Gateway 时,VTEP Peer 之间可以通过 Type2 Route 来互相学习对方的 host-IP Table,包括:host-IPv4 /32 或 host-IPv6 /128 精确路由、Interface、L3 VNI 等信息。 以较为复杂的 “分布式 VxLAN L3 Gateway 组网” 场景为例。如下图所示,Leaf1、Leaf2 同时作为 VxLAN L2/L3 Gateway,Host1、Host2 属于不同的 VxLAN 子网,Leaf1 向 Leaf2 通告它的 host-IP Table。 Host1 通过特定的 Interface 和 BD 接入到 Leaf1 时,通常会触发 ARP、DHCP 等广播流量。
L2 Gateway 特性:学习到 Host1 对应的 Host1-MAC 并记录在 BD 的 host-MAC Table 中。
L3 Gateway 特性:学习到 Host1 对应的 Host1-IP 并记录在 L3 VNI 对应的 VRF 的 host-IP Table 中。
随后 Leaf1 向 Leaf2 发送 Type2 Route,携带了 EVPN Instance RD、Host1-MAC、Host1-IP、L2 VNI、L3 VNI、VTEP IP 等信息。 Leaf2 收到 Type2 Route 后,根据 L2 VNI 匹配到相应的 BD,并将 Host1-MAC 保存在 BD 的 host-MAC Table 中。
L2 Gateway 特性:根据 L2 VNI 匹配到相应的 BD,并将 Host1-MAC 保存在 BD 的 host-MAC Table 中。
L3 Gateway 特性:根据 L3 VNI 匹配到相应的 VRF,并将 Host1-IP 保存在 VRF 的 host-IP Table 中。
VTEP 应用 Type2 实现 ARP 广播抑制
同一个 VxLAN 子网属于一个 “大二层“ 虚拟网络,子网内的主机要互相通信就需要知道对方的 MAC 地址,传统的方式是发出 ARP Request 广播报文。而在 EVPN 场景中,则可以应用 Type2 实现 ARP 广播抑制,能够有效减少 ARP 洪泛的流量。
首先,VxLAN L3 Gateway 之间通过 Type2 Route 互相宣告 ARP 表项信息(host-MAC/IP)。
然后,VxLAN L3 Gateway 通过传递 ARP 类型路由,将 ARP 表项信息传递给 VxLAN L2 Gateway。
最后,VxLAN L2 Gateway 开启 ARP 代答功能后,就会根据 ARP 表项信息生成 ARP 广播抑制表,包括:host-IP、host-MAC、VTEP、VNI 等信息。
完成控制面的配置后,当 VxLAN L2 Gateway(e.g. Leaf1)再收到从 Host1 向 Host2 发出的 ARP Request 时,就会先查看自己的 ARP 广播抑制表,发现有 Host2 的 MAC-IP 记录,则直接将 ARP Request 报文中的广播 MAC 地址替换为目的单播 MAC 地址(广播变单播),然后原路 Reply,从而达到 ARP 广播抑制的目的。
但需要注意的是,Type2 Route 和 ARP 广播抑制只是减少了 ARP 洪泛流量,但不能完全避免,例如下面场景:
新上线的可能是 “静默主机“,它不会自动触发 ARP、DHCP 等广播流量,所以上挂 VTEP 不能被动学习其 MAC 地址。首次访问 “静默主机” 时,还是需要在 VxLAN 子网中广播 ARP Request 报文来获得对方的 MAC 地址。
在 VTEP 没来及的学习到 ARP 广播抑制表项的时候,也会按照正常的流程进行广播。
Type3:Inclusive Multicast Ethernet Tag Route(集成多播 Ethernet Tag 路由)
通过应用 Type3 Route 可以实现 VTEP Peers 的自动发现和认证,并在 VTEP Peer 之间互相传递 L2 VNI 和 VTEP IP 地址信息。 Type3 Route 的 EVPN NLRI 字段如下:
Route Distinguisher:指示 EVPN Instance 的 RD 值。
Ethernet Tag ID:指示当前设备配置的以太网 VLAN ID。在 Type3 Route 中为全 0。
IP Address Length:指示该 Route 携带的 local-VTEP IP 地址的掩码长度。
Originating Router's IP Address:指示该 Route 携带的 local-VTEP IP 地址。
Flags:在 VxLAN 场景中,该字段没有实际意义。
MPLS Label:指示该 Route 携带的 L2 VNI,用于标识不同的 BD。
Tunnel Type:指示该 Route 携带的隧道类型。在 VxLAN 场景中,该字段为 “6: Ingress Replication”,即头端复制类型。
Tunnel Identifier:指示该 Route 携带的隧道信息。在 VxLAN 场景中,该字段也是 local-VTEP IP 地址。
VTEP 应用 Type3 建立头端复制列表
前面提到 Type2 Route 只能 “抑制“ ARP 洪泛流量,但不能完全避免。这些不能避免的 BUM 流量,还是需要通过头端复制或核心复制方式来进行广播或组播。 以头端复制为例,VTEP Peer 之间可以通过 Type3 Route 宣告来实现自动创建头端复制列表,包括:L2 VNI、src-VTEP IP、dst-VTEP IP 等信息。如下图所示,Leaf1、Leaf2、Leaf3 作为 VTEP,Leaf1 向 Leaf2、Leaf3 发送 Type3 Route。
在 Leaf1 上完成 VTEP IP、L2 VNI、EVPN Instance 等相关配置后,Leaf1 会向 Leaf2、Leaf3 分别发送 Type3 Route,携带了 L2 VNI、local-VTEP IP、EVPN Instance RD 等信息。
Leaf2、Leaf3 收到来自 Leaf1 的 Type3 Route 后:
如果 Leaf1 VTEP IP 三层路由可达,则建立一条 VxLAN Tunnel。
如果如果 remote-VNI 与 local-VNI 相同,则新建一个头端复制表,用于后续 BUM 报文广播。
Type5:IP Prefix Route(IP 前缀路由)
Type3 Route 的 EVPN NLRI 字段如下:
Route Distinguisher
指示 EVPN Instance 的 RD 值。
Ethernet Segment Identifier
用于唯一标识一个 VxLAN Tunnel 的连接。
Ethernet Tag ID
指示当前设备配置的以太网 VLAN ID。
IP Prefix Length
指示该 Route 携带的 IP Prefix 的掩码长度。
IP Prefix
指示该 Route 携带的 IP Prefix,可以是精确路由(/32 或 /128),也可以网段地址(/0-32 或 /0-128),主要是传递网段路由。
GW IP Address
指示默认网关地址。该字段在 VxLAN 场景中没有实际意义。
MPLS Label
指示该 Route 携带的 L3 VNI,用于标识不同的 VRF。
VTEP 应用 Type5 通告 host-IP 网段路由
Type5 Route 有 2 个主要的应用场景:
在没有 IP 地址重叠的网络规划中,可以配置 VTEP 通过 Type5 Route 宣告 host-IP 网段路由,而不是 host-IP 精确路由,以此来有效减少 VxLAN L3 Gateway 设备的路由表项。
在 VxLAN 网络和外部 IP 网络之间需要互联互通时,可以通过 Type5 Route 将外部 IP 网段宣告到 VxLAN L3 Gateway,继而实现 VxLAN 网络中的主机能够与外部网络之间进行 IP 访问。
如下图所示,Leaf1、Leaf2 作为 VxLAN L3 Gateway,其中 Leaf1 连接了一个外部网络的 192.168.1.0/24 网段。
Leaf1 探测到 192.168.1.0/24 网段路由后,向 Leaf2 宣告 Type5 Route,包括:EVPN Instance RD、IP Prefix、L3 VNI、Leaf1 VTEP IP 地址等信息。
Leaf2 收到 Type5 Route 后,学习到 192.168.1.0/24 网段信息,并将其保存在相应的 Route Table 中,其下一跳为 Leaf1 VTEP IP 地址。
后续,Leaf2 就可以直接转发 dstIP 为 192.168.1.0/24 网段的 IP 报文了。
编辑:黄飞
评论
查看更多