Virtual Extensible LAN虚拟可扩展局域网,采用UDP封装形式。VXLAN是应用最广泛的基于主机的Overlay技术,主机端通过VTEP(Virtual Tunnel EndPoint)实体完成VXLAN的封装解封装等功能。与二层VLAN相似,VXLAN使用VNI来表示一个二层网络,VNI长度为24个bit,可支持16M个不同的网络段,解决了VLAN(4096)容量有限的问题。 VXLAN协议本身并没有定义控制平面,转发信息可通过数据平面流量进行学习。
对于未知单播流量(目的MAC所在VTEP的IP地址未知)或者多播流量,VTEP在进行封装时,设定外层IP头中的目的IP地址为指定IP多播地址,进行发送。
对于已知流量,即学习到(VNI & DMAC)与出口VTEP的IP对应关系的数据帧,在封装时,外层IP头部的目的IP地址使用出口VTEP的IP地址。
为避免未知流量引发的多播,可将(VNI & DMAC <-> 出口VTEP-IP)对应关系存储在中心控制器中(如OpenFlow控制器),发包的VTEP对未知流量可到控制器中查询获取。
VXLAN帧格式
由于VLAN协议将VLAN ID限制在12bit(4096)内,对于当前数据中心来说已然造成瓶颈。并且VLAN不支持VM跨三层网络的移动。新提出的VXLAN协议正为解决VLAN存在的不足。
VXLAN是一种基于主机的Overlay协议,不同于FabricPath或者TRILL等基于网络的Overlay协议,VXLAN不需要在中间核心网络的部署,基于现有网络,VXLAN可部署在服务器上,只需要每个服务器中的VTEP(Virtual Tunnel EndPoint)节点实现VXLAN功能,完成服务器之上的VM虚拟机与外部的通信。对于出方向流量,VTEP将虚拟机的原始数据包封装上VXLAN头,对于入方向,VTEP剥掉VXLAN头部数据。
由以下VXLAN的帧格式可知,VXLAN是一种MAC-in-UDP的数据帧,UDP目的端口号使用4798。
|----------- VXLAN Encap Header ---------||---------- Original Ethernet packet ----------|
|----------|--------|---------|----------||------|------|--------|-------|---------------|-----|
| Outer | Outer | Outer | VXLAN || DMAC | SMAC | 802.1Q | EType | PayLoad | CRC |
| MAC Hdr | IP Hdr | UDP Hdr | Header || | | | | | |
|----------|--------|---------|----------||------|------|--------|-------|---------------|-----|
14B 20B 8B 8B
| |
| |
|------>--| |----------->---------|
| |
| |
|----------|----------|-------| |-------|----------|--------------------|-------|
| Outer | Optional | Ether | | VXLAN | | VXLAN | VXLAN |
| MAC Hdr | VLAN Hdr | Type | | flags | Reserved | Network Identifier | flags |
|----------|----------|-------| |-------|----------|--------------------|-------|
12B 4B 2B 8bit 24bit 24bit 8bit
VXLAN数据转发
如下拓扑,三台服务器S1-S3,分别部署有三个虚拟机VM1-VM3,和三个VTEP接口。三个VTEP同属于一个VXLAN网络,VNI为3001,对此VNI关联了组播地址235.1.1.1。对于广播流量,如ARP,VTEP在VNI对应的多播组内转发流量。如VM1要发起到VM3的访问请求,需要首先获得VM3的IP地址192.168.0.3所对应的MAC地址,于是VM1发送一个ARP请求到VTEP1,VTEP1将添加VXLAN头部信息(如上图所示),其中VNI字段为3001。外部UDP头部信息中的目的端口号为固定的4798,源端口号理论上可为任意值,但是一般情况下会使用对VM1发出的原始数据包头进行hash计算得到的一个端口值,这样对于不同的原始数据包会有不同的源端口值,对支持ECMP的underlay网络,可有助于其根据外层头的五元组信息对数据包选择不同的路径。外层IP头部的源IP地址置为VTEP1的IP地址(10.10.1.1),由于原始数据包的目的MAC地址为广播地址(FF:FF:FF:FF:FF:FF),VTEP1使用组播地址(235.1.1.1)作为目的IP地址。至此,封装好的VXLAN数据包可发送到网络中。
/---------------\
/ \
| IP Core Network |
\ /
\---------------/
/-------------/ | \------------\
/ | \
S1 / S2 | S3 \
+------------+ +------------+ +------------+
| VTEP 1 | | VTEP 2 | | VTEP 3 |
| VNI 3001 | | VNI 3001 | | VNI 3001 |
| 10.10.1.1 | | 10.10.2.1 | | 10.10.3.1 |
+------------+ +------------+ +------------+
| | |
| | |
+--------------+ +--------------+ +--------------+
| VM 1 | | VM 2 | | VM 3 |
| 192.168.0.1 | | 192.168.0.2 | | 192.168.0.3 |
| 0:0:0:0:0:1 | | 0:0:0:0:0:2 | | 0:0:0:0:0:3 |
+--------------+ +--------------+ +--------------+
由于VTEP2和VTEP3都在235.1.1.1的多播组内,二者都将接收到此VXLAN数据帧。此时,VTEP2和VTEP3将根据此数据包学习到VM1的MAC地址与VTEP1的IP的对应关系,即MAC(0:0:0:0:0:1) <-> VTEP1 IP (10.10.1.1) <-> VNI 3001,表明在VNI:3001虚拟网段中,MAC为(0:0:0:0:0:1)的设备可通过VTEP1(10.10.1.1)访问。VTEP2与VTEP3在解封装去掉VXLAN头部之后,分别将数据包转发到其所服务的网络中。由于此ARP数据包请求的为192.168.0.3的MAC地址,仅VM3对其作出回复。当ARP回复到达VTEP3时,VTEP3根据目的MAC地址(0:0:0:0:0:1)查询对应关系列表,找到可通过VTEP1的IP(10.10.1.1)到达此MAC地址,于是将10.10.1.1作为外部IP头中的目的IP地址,进行转发。由于是单播,仅VTEP1将接收到此回复数据包。VTEP1将由此数据包学习到 VM3的MAC地址(0:0:0:0:0:3)和VTEP3的IP(10.10.3.1)的对应关系。之后VM1与VM3的数据包交互,就可通过单播完成。
可见。基于组播地址235.1.1.1的转发和VM3的ARP回复数据包,致使VTEP1和VTEP3学习到了VM1和VM3的MAC与VTEP IP地址的对应关系。对于组播地址与VNI的对应关系,由于VNI为24bit,其容量有16M大小,而组播地址为224.0.0.0-239.255.255.255网段,有三种分配方案。其一所有的VNI共用一个组播地址,缺点很明显将导致VTEP接收到所有VNI的组播报文,即使其仅支持一个VNI网络;其二每个VNI网络分配一个组播地址,缺点是导致underlay网络维护过多的组播状态;最后一种就是在前两种极端的分配方案之间做平衡。
二层VXLAN网关
以上是针对虚拟机而言的网络,在实际应用中,对于不具有VTEP接口的服务器而言,其将不能够接入到VXLAN网络中。这种情况下,需要一种VXLAN网关设备,来联通这些服务器。VXLAN网关实质上未VTEP的实体化,完成VXLAN网络到传统网络的转换。如下网络拓扑,详情不在累述。
/---------------\
/ \
| IP Core Network |
\ /
\---------------/
/------------/ | \------------\
/ | \
S1 / S2 | \
+------------+ +------------+ +------------+
| VTEP 1 | | VTEP 2 | | VXLAN |
| VNI 3001 | | VNI 3001 | | GATEWAY |
| 10.10.1.1 | | 10.10.2.1 | | 10.10.4.1 |
+------------+ +------------+ +------------+
| | |
| | |
+--------------+ +--------------+ | +--------------+
| VM 1 | | VM 2 | +--------------+ | Server 4 |
| 192.168.0.1 | | 192.168.0.2 | | SWITCH |------| 192.168.0.40 |
| 0:0:0:0:0:1 | | 0:0:0:0:0:2 | +--------------+ | 0:0:0:0:0:40 |
+--------------+ +--------------+ +--------------+
VXLAN间三层路由
实际应用中,同一个租户可能需要多个VXLAN网段,而且要求这几个网段直接可以相互连通。本质上VXLAN相当于VLAN网络实现了二层隔离,要达到互通,需要实现类似VLAN间路由的功能,即VXLAN间路由。但是,此路由要局限在同一租户内部,租户之间还是隔离状态。类似于VLAN间通过外部的路由器实现VLAN间路由,VXLAN网络引入三层VXLAN网关来实现VXLAN路由,或者类似于三层交换机,VXLAN网络为VTEP扩展了IRB(Integrated Routing and Bridge)功能,可完成VXLAN间的路由。拓扑如下:
+----------------+
| Layer3 VXLAN |
| GATEWAY |
+----------------+
/ \
/ \
S1 / \ S5
+------------+ +------------+
| VTEP 1 | | VTEP 5 |
| VNI 3001 | | VNI 3005 |
| 10.10.1.1 | | 10.10.3.5 |
+------------+ +------------+
| |
| |
+--------------+ +--------------+
| VM 1 | | VM 5 |
| 192.168.0.1 | | 192.168.5.1 |
| 0:0:0:0:0:1 | | 0:0:0:0:0:5 |
+--------------+ +--------------+
以VM1到VM5之间的流量为例,首先由于VM5与VM1不在同一个网段内,VM1将访问VM5的流量发送到三层VXLAN网关,L3网关根据数据包内容,学习到(源VNI、SMAC)与源VTEP IP地址的对应关系。接着根据源VNI找到为租户预先配置的VRF-ID(Virtual Routing and Forwarding ID),确认其三层转发信息表FIB,以数据包内层的IP头部的目的IP地址查表,找到对应的目的VNI(3005)和目的MAC地址(0.0.0.0.0.5)。最后使用目的VNI与目的MAC地址查询二层转发表,得到目的VTEP的IP地址(10.10.3.5)。得到所有信息之后,将数据包的内层MAC头部的目的MAC地址换成刚刚查询到的目的MAC地址,将源MAC地址替换为L3网关的MAC地址。IP头部的TTL值减一。对于VXLAN头部,VNI字段替换为查询到的目的VNI值,外层IP头部的目的IP替换为查询到的目的VTEP的IP地址(VTEP 5 - 10.10.3.5),源IP地址替换为L3网关的IP地址。最终数据包通过VTEP5到达VM5。VM5的回复流量沿着相同路径返回,过程类似。
VXLAN的移动性
如下图拓扑,将VTEP1下的VM1迁移到VTEP3的网络中。此处的迁移操作是在VM1的工作状态中进行的,所以S1,S2和S3的binding表中在迁移之前已经学习到了VM1的位置信息,即VM1的MAC地址(0.0.0.0.0.1)通过VTEP1(IP-10.10.1.1)可达。VM1在迁移之后,此信息需要马上进行更新,以保证到达VM1的数据流的连续。
/---------------\
/ \
| IP Core Network |
\ /
\---------------/
/-------------/ | \------------\
/ | \
S1 / S2 | S3 \
+------------+ +------------+ +------------+
| VTEP 1 | | VTEP 2 | | VTEP 3 |
| VNI 3001 | | VNI 3001 | | VNI 3001 |
| 10.10.1.1 | | 10.10.2.1 | | 10.10.3.1 |
+------------+ +------------+ +------------+
| | / |
| | / |
+--------------+ +--------------+ / +--------------+
| VM 1 | | VM 2 | / | VM 3 |
| 192.168.0.1 | | 192.168.0.2 | | | 192.168.0.3 |
| 0:0:0:0:0:1 |\ | 0:0:0:0:0:2 | | | 0:0:0:0:0:3 |
+--------------+ \ +--------------+ | +--------------+
\------>----->------>------|
VM1由S1迁移到S3网络中,S3在感知到VM1的迁移事件之后,S3之上的虚拟交换机负责代替VM1发送反向ARP报文,或者免费ARP来刷新VXLAN网络中其它的VTEP节点中已过时的VM1位置绑定信息。Cisco的Nexus 1000V和VMware vsphere分布式交换机广播RARP,微软的Hyper-V发送GARP。以反向ARP为例,其目的MAC为广播地址(ff:ff:ff:ff:ff:ff),源MAC地址为VM1的MAC地址,VTEP3增加VXLAN头部信息,将外部IP头部信息中的源IP设置为VTEP3自身的IP地址10.10.3.1,目的IP设置为组播地址。VXLAN网络中的其它VTEP节点,收到此数据包之后,将会更新VM1的位置信息到VTEP3的IP地址(10.10.3.1)。
VXLAN组播
此处的组播并非VXLAN网络中与VNI对应的用来转发未知流量的组播,而是VXLAN所服务网段内的组播流量。如下拓扑所示,VM1与VM2加入了同一个多播组G1。当VM1向网络中发送组播流量时,L3网关在接收到VXLAN封装的组播流量时,默认情况下将向所有配置的VNI转发此组播流量,在每个具体的VNI中转发时VXLAN封装头部的外层目的IP地址使用此VNI指定的组播地址,这就产生一个问题,要求每个VNI对应一个唯一的组播地址。如果开启了IGMP Snooping功能,L3网关检测到VTEP5网络中并没有注册监听此组播G1流量的主机时,将不转发流量到S5。
+----------------+
| Layer3 VXLAN |
| GATEWAY |
+----------------+
/ | \
/-----/ | \------\
S1 / S2 | \ S5
+------------+ +------------+ +------------+
| VTEP 1 | | VTEP 2 | | VTEP 5 |
| VNI 3001 | | VNI 3002 | | VNI 3005 |
| 10.10.1.1 | | 10.10.2.1 | | 10.10.3.5 |
+------------+ +------------+ +------------+
| | |
| | |
+--------------+ +--------------+ +--------------+
| VM 1 | | VM 2 | | VM 5 |
| 192.168.0.1 | | 192.168.0.2 | | 192.168.5.1 |
| 0:0:0:0:0:1 | | 0:0:0:0:0:2 | | 0:0:0:0:0:5 |
+--------------+ +--------------+ +--------------+
VXLAN控制平面
VXLAN基于数据流量的Flooding Learning功能来学习网络中的拓扑,此基于组播而实现。另外VXLAN可采用Ingress Replication或者称为Head-End Replication来实现单播取代多播转发,当一个未知流量的原始数据包到达VTEP节点时,VTEP节点将数据包复制若干份,通过单播形式发送到VXLAN网络中的所有VTEP节点,达到之前组播的效果。前提是存在一个集中控制器如Openflow控制器来存储某个VNI内所有的VTEP节点信息,可由支持VTEP节点的Openvswitch或者思科的Nexus 1000V虚拟交换机将节点信息上报给集中控制器。VTEP节点在转发时,可到集中控制器查询指定VNI中的VTEP的节点信息(IP地址),为了提高效率,VTEP节点可以缓存查询的结果,不过这将需要和集中控制器进行同步更新,避免缓存信息失效。此种单播方式的数据包复制操作将给VTEP节点带来非常大的压力。
另外使用BGP EVPN协议作为VXLAN的控制层面协议,在网络中发布VTEP节点相关信息和虚拟机绑定信息,在实际网络中使用广泛。
完。