关于NVGRE和VXLAN隧道协议相信大家都不陌生,但是事实上隧道协议只是虚拟化网络中的一部分,它并不提供实质性的功能,只是定义不同虚拟机之间如何封装、转发数据包。本文想强调两点:其一,NVGRE和VXLAN都是用三层协议封装二层协议;其二,这两项技术都解决了VLAN规模固定的问题,不再局限于4094个。随着各种新技术的兴起,一项标准已经无法满足需求,技术巨头们争先恐后的想让自己的标准成为业内统一的标准,其中NVGRE和VXLAN就是典型的例子,那么这两项技术的区别到底在哪里呢?
VXLAN
VXLAN主要是由Cisco推出的,VXLAN的包头有一个24bit的ID段,即意味着1600万个独一无二的虚拟网段,这个ID通常是对UDP端口采取伪随机算法而生成的(UDP端口是由该帧中的原始MAC Hash生成的)。这样做的好处是可以保证基于5元组的负载均衡,保存VM之间数据包的顺序,具体做法是将数据包内部的MAC组映射到唯一的UDP端口组。将二层广播被转换成IP组播,VXLAN使用IP组播在虚拟网段中泛洪而且依赖于动态MAC学习。VXLAN封装将数据包大小扩展到50字节,如下图所示:
由于数据包比较大,所以VXLAN需要借助支持大型帧的传输网络才能支持数据包规模的扩展。
NVGRE
NVGRE主要支持者是Microsoft。与VXLAN不同的是,NVGRE没有采用标准传输协议(TCP/UDP),而是借助通用路由封装协议(GRE)。NVGRE使用GRE头部的低24位作为租户网络标识符(TNI),与VXLAN一样可以支持1600万个虚拟网络。为了提供描述带宽利用率粒度的流,传输网络需要使用GRE头,但是这导致NVGRE不能兼容传统负载均衡,这是NVGRE与VXLAN相比最大的区别也是最大的不足。为了提高负载均衡能力建议每个NVGRE主机使用多个IP地址,确保更多流量能够被负载均衡。
NVGRE不需要依赖泛洪和IP组播进行学习,而是以一种更灵活的方式进行广播,但是这需要依赖硬件/供应商。最后一个区别关于分片,NVGRE支持减小数据包最大传输单元以减小内部虚拟网络数据包大小,不需要要求传输网络支持传输大型帧。
实验
OVS(open Vswitch)可以支持这两种隧道协议。可以实现两个虚拟机的简单通信,在两个主机上面分别运行VM,并且在这个VM之间创建一个隧道。如果没有GRE隧道,两个VM就无法连接。在主机之间创建隧道的简单步骤:
1、主机1配置如下:
ovs-vsctl add-br brgre
ovs-vsctl add-br brvm
ovs-vsctl add-port brgre eth0
ifconfig eth0 0
ifconfig brgre 192.168.1.100 netmask 255.255.255.0
route add default gw 192.168.1.1 brgre
ifconfig brvm 10.1.2.10 netmask 255.255.255.0
ovs-vsctl add-port brvm gre1 — set interface gre1 type=gre options:remoteip=192.168.1.111
2、主机2配置如下:
ovs-vsctl add-br brgre
ovs-vsctl add-br brvm
ovs-vsctl add-port brgre eth0
ifconfig eth0 0
ifconfig brgre 192.168.1.111 netmask 255.255.255.0
route add default gw 192.168.1.1 brgre
ifconfig brvm 10.1.2.11 netmask 255.255.255.0
ovs-vsctl add-port brvm gre1 — set interface gre1 type=gre options:remoteip=192.168.1.100
在每台主机中创建2个桥,其中brvm用于仿真虚拟机,另一个brgre用作与其他主机的做隧道(VTEP)连接。eth0连接brgre,brgre绑定IP用于实现隧道。为了简化实验,我将GRE隧道设置在同一子网中,当然可以放于不同域中使仿真场景更真实。下面就可以进行测试了,10.1.2.10和10.2.1.11应该是可以ping通的,这两个VM域通过隧道连接,同样,也可以改成VXLAN隧道配置。