vxlan

什么是vxlan?

VXLAN(Virtual Extensible LAN)虚拟可扩展局域网是目前NVO3(Network Virtualization Over Layer 3 基于三层IP overlay网络构建虚拟网络技术统称NVO3),它是目前NVO3中影响力最为广泛的一种,它通过L2 over L4 (MAC in UDP)的报文封装方式,实现基于IP overlay的虚拟局域网。

传统网络存在的一些问题

1,传统的二层网络,交换机通过mac地址进行数据转发,mac地址一多会造成交换机的转发速率变慢,同时交换机的mac地址表的大小是有限制的,在云计算中,mac表容量限制了虚拟机的数量。
2,VLAN的vlan id是一个12bit,最大只支持4096个vlan,这在云计算中是远远不够的。

vxlan的提出很好的解决了上述问题

1,vxlan采用MAC in UDP的方式将vm主机的数据报文封装在UDP中,并使用物理网络VTEP的IP和MAC地址在外层包头封装进行数据传输,对外表现为VTEP之间的mac地址,极大的降低了交换机mac地址使用。

2,VXLAN报文中拥有一个24bit vni段,vxlan隔离不同租户就是通过vni来进行,一个vni表示一个租户,不同vni之间二层不能直接通信,但可以通过vxlan三层网关进行通信。即使多个终端用户属于同一个vni也属于同一个租户。

VXLAN的优点

1,基于ip的overlay网络,仅需要边界VTEP设备间可通信
2,ip overlay TTL避免环路。
3,overlay+vni构建虚拟网络支持多达16M的虚拟网络,充分满足多租户的需求
4,接入交换机只需要学习物理服务器的mac地址,不需要学习每台VM的mac地址减轻了交换机的负担

概念

NVE(Network virtrualization Edge网络虚拟边缘节点)是实现网络虚拟化功能的实体。
VTEP(vxlan tunnel end point vxlan 隧道端点)vxlan网络中的NVE以VTEP为标识;每个NVE至少得有一个VTEP;VTEP使用NVE的IP地址表示;两个VTEP之间可以确立一条VXLAN隧道,VTEP间的这条VXLAN隧道将两个NVE之间的所有的VNI所公用。
VTEP可以由专有硬件来实现,也可以使用纯软件实现,硬件的实现是通过一些SDN交换机,软件的实现主要有

1,带vxlan内核模块的Linux
2,openvswitch

vxlan报文格式

端口默认使用4789端口
报文中源IP为报文的虚拟机所属的VTEP的IP地址,目的IP为目的虚拟机所属的VTEP的IP,目标ip地址可以为单播地址也可以为组播地址

vxlan网络架构图

vxlan使用 MAC IN UDP的方式来延伸二层网络,是一种扩展大二层网络的隧道封装技术。

NVE负责将vm的报文封装,建立隧道网络。如服务器上的openvswitch就是一个NVE。

VXLAN报文的转发
一种是BUM(broadcast&unknown-unicast&multicast)报文转发,一种是已知的单播报文转发

BUM报文转发:采用头端复制的方式(vm上层VTEP接口收到BUM报文后本地VTEP通过控制平面获取同一VNI的VTEP列表,将收到的BUM报文根据VTEP列表进行复制并发送给属于同一VNI的所有VTEP)并进行报文封装。

1,switch_1收到来终端A发出的报文后,提取报文信息,并判断报文的目的MAC地址是否为BUM MAC.
是,在对应的二层广播域内广播,并跳转2。
不是,走已知单播报文转发流程。
2,switch_1根据报文中的VNI信息获取同一VNI的VTEP列表获取对应的二层广播域,进行vxlan封装,基于出端口和vxlan封装信息封装vxlan头和外层IP信息,进行二层广播。
3,switch_2和switch_3上VTEP收到VXLAN报文后,根据UDP目的端口号、源和目的IP地址VNI判断VXLAN报文的合法有效性,依据VNI获取对应的二层广播域,然后进行VXLAN解封装,获取内层二层报文,判断报文的目的MAC是否为BUM MAC
是,在对应的二层广播域内非VXLAN侧进行广播处理。
不是,再判断是否是本机的MAC地址。
是,本机MAC,上送主机处理。
不是,在对应的二层广播域内查找出接口和封装信息并跳转4.
4,switch_2和switch_3根据查找到的出接口和封装信息,为报文添加VLAN tag,转发给对应的终端B/C.

已知单播报文转发

1,switch_1收到来自终端A的报文,根据报文信息接入端口和VLAN信息获取对应的二层广播域,并判断报文的目的MAC是否为已知的单播MAC
是,在判断是否为本机MAC.
是,上送主机处理。
不是,在对应的二层广播域内查找出接口和封装信息,并跳装到2.

2, switch_1上VTEP根据查找到的出接口和封装信息进行VXLAN封装和报文转发。
3,switch_2上VTEP收到VXLAN报文后,根据UDP目的端口号,源/目的IP地址,VNI判断VXLAN报文的合法有效性,依据VNI获取对应的二层广播域,然后进行VXLAN解封装、获取内层二层报文,判断报文的目的MAC是否为已知单播报文MAC。
是,在对应的二层广播域内查找出接口和封装信息,并跳转到4.
不是,在判断是否是本机的mac。
是,上送主机处理。
不是,走BUM报文转发流程。
4,switch_2根据查找的出接口和封装信息,为报文添加VLAN tag,转发给对应的终端B。

为了防止不同vm之间通信发送arp广播引发广播风暴,vtep有一个arp proxy的功能也就是说在请求这个VTEP节点上的虚拟机的mac地址都是由VTEP的mac地址应答。也就是l2population。

vxlan网关

vxlan下vm之间的通信方式有3种,同VNI下不同VM,不同VNI下跨网访问,vxlan和非vxlan之间访问。

vxlan网关分为
二层网关、三层网关。
二层网关:主要用于解决同VNI下不同VM之间通信,一般为vetp IP
三层网关:用于解决不同VNI下跨网访问,和vxlan和非vxlan之间访问。

通俗理解就是
在一台实体服务器上可以虚拟出一个交换机来,这个交换机就是VSwitch,而这个VSwitch下挂的不再是实体服务器,而是一个个VM,一个VM其实就是一个租户租用的服务器,不同租户之间肯定是不能互访的,要不然租户数据的安全性如何保障,这个隔离就是靠的VNI这个ID,其实这个你可以向下VLAN是如何隔离的,目的就是为了隔离租户。我一个租户有2个VM的话,那么我这2个之间应该可以互访吧。所以说基于VNI定义的租户,而非基于VM。内部的结构说清楚了再来说上行如何访问,在一个L2交换机你要跨网访问必然要经过网关,这个网关的IP地址就是VTEP IP,在网络上有个概念叫arp-proxy,一般用途是为了保护内部私有网络,外界的所有应答都有网关来代替回答(可以理解为门卫)。在这里外界只需要你的VTEP IP即可,对端报文到达VTEP这个网关后自己在内部走L2进行转发。因此VXLAN报文中的目的IP就是对端的网关(VTEP IP),而源地址自然也是自己的网关(VTEP IP)。而对于不同leaf上的同一VNI的VM来说,他们的VTEP IP肯定要配置相同,想下同一vlan下的服务器的网关是如何配置的就明白了

http://www.cnblogs.com/hbgzy/p/5279269.html
http://blog.csdn.net/zztflyer/article/details/51883523

vxlan实验

环境
操作系统:centos7.2
内核版本:3.10
openvswitch版本:2.5

在两台虚拟机上安装好ovs,并启动
这个实验目的,就是HOST 1的 br1,没有根物理网卡绑定,但可以通过建利vxlan隧道与HOST2的br1通信。

配置host1
创建两个网桥br0、br1
ovs-vsctl add-br br0
ovs-vsctl add-br br1
将eth0挂载到br0上
ovs-vsctl add-port br0 eth0

将eth0的ip分配到br0上
ifconfig eth0 0 && ifconfig br0 192.168.1.2/24

给br1分配一个ip
ifconfig br1 192.168.2.2/24

配置host2
创建两个网桥br0、br1
ovs-vsctl add-br br0
ovs-vsctl add-br br1
将eth0挂载到br0上

ovs-vsctl add-port br0 eth0

将eth0的ip分配到br0上
ifconfig eth0 0 && ifconfig br0 192.168.1.3/24

给br1分配一个ip
ifconfig br1 192.168.2.3/24

此时在hots1上ping host2上的br0的ip是可以通的

ping br1的ip是pint不通的

通过建立vxlan隧道来实现br1之间通信
在host1上执行
给br1上增加一个vxlan0接口类型为vxlan,远程ip为 host2上的br0 ip, vni为100

在host2上执行
远端ip为host1上br0的ip

此时在host1上ping host2的br1的ip


就可以ping通了

在host2上的 eth0上抓包

有两层报文封装第一层源ip为192.168.2.2 目标ip为192.168.2.3,然后被udp封装,走vxlan隧道,第二层源ip为192.168.1.2 目标ip为192.168.1.3


网络包经过 vxlan interface 到达 eth1 的过程中,Linux vxlan 内核模块会将网络包二层帧封装成 UDP 包,因此,vxlan interface 必须设置适当的 MTU 来限制通过它的网络包的大小(vxlan interface 的 MTU 需要比它所绑定的物理网卡的 MTU 小 50),否则,封装后的包会被 eth1 丢弃。

VTEP (vxlan 随道端点)vswitch生成br-tun连接各个节点

像这些

为什么vlan只支持4096个因为vid只有12bit 2的12次方=4096

为什么用vxlan不用vlan?
因为vlan最大只有4096个
虚拟化技术的话用vlan运行vm一多,交换机上的mac地址会很多,影响交换机性能。
stp算法会产生大量多路路径冗余

vxlan:建立在物理网络上的虚拟以太网
vlxan是一种将二层报文用三层协议进行封装的技术,它进行传输的标识是通过VNI vni包含24bit所以vxlan最大支持2的24次方约16m个,会将二层数据包封装成udp报文通过隧道组播传输,一般配置的组播地址224.0.0.1发送arp,udp端口是4789,共50字节封装报头
UDP校验和:一般为0,非0则此包将会被丢弃。

数据包都是通过vtep进行封装传输
在 OVS 中, 有几个非常重要的概念:

Bridge: Bridge 代表一个以太网交换机(Switch),一个主机中可以创建一个或者多个 Bridge 设备。

Port: 端口与物理交换机的端口概念类似,每个 Port 都隶属于一个 Bridge。

Interface: 连接到 Port 的网络接口设备。在通常情况下,Port 和 Interface 是一对一的关系, 只有在配置 Port 为 bond 模式后,Port 和 Interface 是一对多的关系。

Controller: OpenFlow 控制器。OVS 可以同时接受一个或者多个 OpenFlow 控制器的管理。

datapath: 在 OVS 中,datapath 负责执行数据交换,也就是把从接收端口收到的数据包在流表中进行匹配,并执行匹配到的动作。

Flow table: 每个 datapath 都和一个“flow table”关联,当 datapath 接收到数据之后, OVS 会在
flow table 中查找可以匹配的 flow,执行对应的操作, 例如转发数据到另外的端口。

veth-pair:一对接口,一个接口收另外一个接口同时也能收到,用于连接两个Brigge

设置网络接口设备的类型为“internal”。对于 internal 类型的的网络接口,OVS 会同时在 Linux 系统中创建一个可以用来收发数据的模拟网络设备。我们可以为这个网络设备配置 IP 地址、进行数据监听等等。

参考链接
http://www.360doc.com/content/16/0227/12/3038654_537760576.shtml
http://blog.csdn.net/xjtuse2014/article/details/51376123?locationNum=7
http://www.cnblogs.com/hbgzy/p/5279269.html
http://blog.csdn.net/zztflyer/article/details/51883523