本文将从以下3个方面介绍VXLAN:
- 背景。介绍VXLAN产生的背景,解决的问题;
- VXLAN原理和实现。介绍VXLAN的原理和三种实现方式;
1 背景
随着服务器虚拟化技术在数据中心中的广泛应用,数据中心主机数量大规模增长,给虚拟网络带来了以下挑战:
- 虚拟机规模受网络规模限制:在传统二层网络环境下,数据报文是根据MAC地址表进行二层转发,MAC地址表容量限制了虚拟机数量
- 网络隔离能力限制:传统的8021.Q只能支持4096个VLAN,无法满足大量租户的需求;
- 二层STP使得资源利用率不足,无法实现ECMP,且收敛时间长,维护困难;
- 虚拟机迁移范围受网络架构限制:服务器虚拟化后,虚拟机迁移成为常见的需求,为保证迁移过程中业务不中断,需要IP,MAC地址等参数保持不变,且要求网络本身具备多路径的冗余备份和可靠性;
VXLAN的出现很好解决了这些问题:
- VXLAN将虚拟机发出的数据包封装在UDP中,降低大二层网络对MAC地址容量需求;
- VXLAN使用VXLAN网络标识VNI(VXLAN Network Identifier),由24比特组成,支持多达16M的VXLAN段,从而满足了大量的用户标识;
- VXLAN使用3层IP网络建立二层通道,无需运行STP,基于IP实现ECMP;
- VXLAN采用MAC in UDP封装来延伸二层网络,将以太报文封装在IP报文之上,通过路由在网络中传输,无需关注虚拟机的MAC地址。且路由网络无网络结构限制,具备大规模扩展能力、故障自愈能力、负载均衡能力。通过路由网络,虚拟机迁移不受网络架构限制。
2 VXLAN原理和实现
2.1 VXLAN基本概念
VXLAN是NVO3(Network Virtualization over Layer 3)中的一种网络虚拟化技术,通过将主机发出的数据包封装在UDP中,并使用物理网络的IP、MAC作为outer-header进行封装,然后在IP网络上传输,到达目的地后由隧道终结点解封装并将数据发送给目标虚拟机,实现服务器间端到端的大二层。
VXLAN组件包括:
- NVE(Network Virtualization Edge):网络虚拟边缘节点,实现网络虚拟化功能的网络实体;
- VTEP( VXLAN Tunnel Endpoints VXLAN):VXLAN 隧道端点;
- VNI(VXLAN Network Identifier):类似于VLAN, 包括二层VNI和三层VNI,二层VNI和VLAN 对应,二层VNI一个网络域内唯一,支持16M VNI;三层VNI类似于SVI。
VXLAN报文格式
- VXLAN Flag 8比特,00001000,保留位有两段,分别是24 bit和8 bit,VNI 24 bit
- 外部UDP 目的端口4789,源端口是内层以太网报文通过哈希算法后得出;
- 外部IP包头源目的IP分别是本端VXLAN和对端VXLAN 的IP地址;
- VXLAN封装额外增加了50 byte 的报文长度。所以在使用过程中需要注意设备上的MTU设置。一般情况下,在数据中心网络设备上,都需要开启巨型帧。
2.2 VXLAN的实现
VXLAN三种实现方式包括:
- 组播实现:标准场景下的VXLAN使用组播实现VTEP的发现和MAC,ARP表项的建立。这种方式没有专门的协议用于控制面的构建,转发表项基于数据层面的数据包转发来建立;
- ethernet virtual private network实现,当前最常用的是BGP ethernet virtual private network传递 arp信息,实现控制层面表项建立;对于BUM或广播报文,可以通过包头复制,或组播是实现。
- 扩展实现:各厂商通过对VXLAN保留字段对VXLAN进行扩展,配合SDN控制器,实现厂商的VXLAN商业化产品,例如CISCO ACI。有关CISCO ACI实现将会进一步研究。
2.2.1组播实现
组播实现中,所有VTEP都需要配置同一个组播地址,且支持ASM。
host A需要和host B通信, ARP请求过程如下:
- A 发送 ARP请求,请求 B 的 MAC地址;
- VTEP-1收到host设备 A发送的 ARP请求 ,ARP请求进行 VXLAN封装, VNI 设置为10,outer-src-ip 是 VTEP-1的 IP ,outer-dst-ip 是加入的组播组地址,封装完成后转发至 VXLAN组播组;
- VTEP-2、VTEP3加入相同的组播组,收到 VTEP-1发送 的组播报文,解封装后检查 VNI 与本地 VNI 是否匹配,如匹配将 ARP请求发送至本地网络。同时记录 VNI、inner src MAC、outer src IP 的对应关系。
- B 收到 ARP请求后以单播方式发送 ARP响应;VTEP-2收到 B 的 ARP响应后进行 VXLAN封装,以单播方式发送。
- VTEP-1收到封装后的 ARP响应后,解封装比对 VNI,如匹配将 ARP响应发送至host设备 A,同时记录 VNI、inner src MAC, outer src IP 的对应关系,构建控制平面表项;此时 VTEP-1、VTEP-2均已成功构建控制平面地址映射信息,
后续 VXLAN数据使用单播在 VTEP-1和 VTEP-2之间传输。
ARP请求完成后,数据转发过程如下:
- ARP请求完成后,主机 A 向主机 B 发送数据, VTEP-1收到数据中查找地址映射表项,将原始数据进行 VXLAN封装后转发至 VTEP-2。外层目的IP为VTEP2地址,外层源IP为VTEP1地址,内层数据帧为A发出的原始二层帧
- VTEP-2收到 VXLAN数据包后检查 VNI 是否与本地 VNI 匹配, 如匹配则解封装后将原始以太网帧转发至主机B。
- B收到后,对数据包进行回应,过程和A发送数据包过程类似,在此不再赘述;
2.2.2 VXLAN的ethernet virtual private network实现
- VXLAN组播实现中,转发的控制通过MAC自学习,需要泛洪时需使用组播进行模拟,非常依赖底层的IP网络组播,对设备和运维要求较高。
- 为了解决这个问题, RFCRFC7432 在 BGP协议基础上定义了ethernet virtual private network NLRI(AFI = 25,SAFI = 70),ethernet virtual private network NLRI中定义了几种BGP ethernet virtual private network路由类型,用于二层网络中不同站点的MAC地址学习和发布。
- 通过在VTEP之间交换BGP ethernet virtual private network路由实现VTEP的自动发现、主机信息相互通告等特性,避免了不必要的数据流量泛洪,同时也将VTEP发现和主机信息学习从数据平面转移到控制平面。
2.2.2.1 ethernet virtual private network路由类型
和VXLAN相关的ethernet virtual private network路由类型包括:
- type 2 :MAC/IP通告路由.MAC/IP地址通告路由可以携带本端PE上ethernet virtual private network实例的RD值、ESI值以及ethernet virtual private network实例对应的私网标签,用于从本端PE向其它PE发布单播MAC,IP地址的可达信息;
type 2 报文如下:
- type 3 :集成多播路由。该类型路由在VXLAN控制平面中主要用于VTEP的自动发现,VXLAN隧道的动态建立,和传递二层VNI和VTEP IP地址信息(用于建立头部复制转发列表)
type 3报文格式如下: - type 4:以太网网段路由。用于CE双宿的场景下进行DF(design forward)选举;
- type 5:IP前缀路由路由,在单纯ethernet virtual private network环境中,用于携带IPv4和IPv6的前缀信息。在VXLAN场景中,如果type 5路由携带主机IP地址,主要用于分布式网关场景中的主机IP路由通告;如果type 5路由网段地址,通过传递该类型路由,可以实现VXLAN网络中的主机访问外部网络。
2.2.2.2 隧道建立
VXLAN隧道建立过程:
- Leaf1和Leaf2之间建立BGP ethernet virtual private network对等体,Leaf1和Leaf2生成BGP ethernet virtual private network路由并发送给对端,该路由携带本端ethernet virtual private network实例的出方向RT和BGP ethernet virtual private network type 3路由。
- Leaf1和Leaf2在收到对端发来的BGP ethernet virtual private network路由后,首先检查该路由携带的ethernet virtual private network实例RT,如果与本端ethernet virtual private network实例的入方向RT相等,则接收该路由,否则丢弃该路由。
- 在接收该路由后,Leaf1和Leaf2将获取其中携带的对端VTEP IP地址和VNI,如果对端VTEP IP地址是三层路由可达的,则建立一条到对端的VXLAN隧道;如果对端VNI与本端相同,则创建一个头端复制表,用于后续BUM报文转发。
2.2.2.3 MAC地址学习
- Host3首次与Leaf1通信时,通过动态ARP报文,Leaf1学习到Host3的MAC地址、BDID(二层广播域标识)和物理口Port1的对应关系;
- Leaf1根据Host3的ARP表项生成BGP ethernet virtual private network路由并发送给对等体Leaf2,该路由携带本端ethernet virtual private network实例的出方向RT、路由下一跳属性以及BGP ethernet virtual private network MAC/IP路由。路由下一跳属性携带的是本端VTEP IP地址;
- Leaf2收到Leaf1发来的BGP ethernet virtual private network路由后,首先检查该路由携带的ethernet virtual private network实例的出方向virtual private network-Target,如果与本端ethernet virtual private network实例的入方向virtual private network-Target相等,则接收该路由,否则丢弃该路由。
- 在接收该路由后,Leaf2获得Host3的MAC地址、BDID和Leaf1上VTEP IP地址的对应关系,并在本地的MAC表中生成Host3的MAC表项,其出接口需根
据下一跳进行迭代,最终迭代结果是指向Leaf1的VXLAN隧道
2.2.2.4 同网段已知单播报文转发
- Leaf1收到来自Host3的报文,根据报文中接入的端口和VLAN信息获取对应
的二层广播域,并在该二层广播域内查找出接口和封装信息。 - Leaf1上VTEP根据查找到的封装信息对数据报文进行VXLAN封装,然后根
据查找到的出接口进行报文转发。 - Leaf2上VTEP收到VXLAN报文后,根据UDP目的端口号、源/目的IP地址、
VNI判断VXLAN报文的合法有效性。然后依据VNI获取对应的二层广播域,
进行VXLAN解封装,获取内层的二层报文。 - Leaf2根据内层二层报文的目的MAC,从本地MAC表找到对应的出接口和
封装信息,为报文添加VLAN Tag,转发给对应的主机Host2。
2.2.2.5 同网段已知单播报文转发
转发过程:
- Leaf1收到来自终端A的报文,根据报文中接入的端口和VLAN信息获取对应
的二层广播域。 - Leaf1上VTEP根据对应的二层广播域获取对应VNI的头端复制隧道列表,依据获取的隧道列表进行报文复制,并进行VXLAN封装。然后将封装后的报文从出接口转发出去。
- Leaf2/Leaf3上VTEP收到VXLAN报文后,根据UDP目的端口号、源/目的IP地址、VNI判断VXLAN报文的合法有效性。然后依据VNI获取对应的二层广播域,进行VXLAN解封装,获取内层二层报文。
- Leaf2/Leaf3检查内层二层报文的目的MAC,发现是BUM MAC,在对应的二层广播域内的非VXLAN隧道侧进行广播处理,即:Leaf2/Leaf3分别从本地MAC表中找到非VXLAN隧道侧的所有出接口和封装信息,为报文添加VLAN Tag,转发给对应的终端B/C。