1.什么是VXLAN?
具体而言,就是基于IPV4实现跨节点的二层网络,有点类似于IPSec的作用,只不过UDP包裹着的是二层报文,与VLAN相比,VXLAN具有以下几个优势:
支持更多的二层网段
VLAN使用12bit标记VLAN ID最多支持4096个VLAN,这对于大型云部署会成为瓶颈。VXLAN的ID(VNI或者VNID)使用24bit标记,支持16777216(2的24方)个二层网段
更好的利用已有的网络路径
VLAN利用生成树协议避免环路,VXLAN的数据包是通过封装到UDP通过三层传输和转发的,可以使用三层路径。
不使用MAC信息
由于采用隧道机制,TOR(Top on Rack)交换机无须在MAC表中记录虚拟机的信息
VXLAN的传输协议是IP+UDP,通过MAC in UDP封装,VXLAN在Layer 3网络上建立起一条Layer2隧道。
报文的结构如下:
如图所示,原始的L2 flame被封装到UDP包中,外面还有IP包和MAC包。
2.为什么要写这篇文章?
我在进行vxlan的实验时,发现了这篇文章
https://www.sdnlab.com/15731.html
这篇实验报告里面有很多东西没有说明清楚,很多命令由于最新mininet版本的更迭已经无法使用,对于初学者而言非常难以理解。因此我重新写了一篇文章进行讲解。
3. 实验环境如下图所示
mininet版本 2.3.0d4
ovs 版本 2.0.2
server1与server2是一台物理机上的两台虚拟机
eth1与eth2的ip为192.168.1.0/24网段。
实验需要验证通过建立vxlan隧道,使得server1上的vm1(10.0.0.1)能够ping通server2上的vm2(10.0.0.2)
4.实验过程
0)在server1 与 server2上, 分别执行
root@MyNewUbuntu:/home/user# ps -aux | grep controller
root 23213 0.0 0.0 6612 856 pts/2 S+ 05:43 0:00 controller -v ptcp:6653
root 23323 0.0 0.0 10472 940 pts/9 S+ 05:44 0:00 grep --color=auto controller
root@MyNewUbuntu:/home/user# kill 23213
root@MyNewUbuntu:/home/user# ps -aux | grep controller
root 23330 0.0 0.0 10472 940 pts/9 S+ 05:48 0:00 grep --color=auto controller
来关闭控制器,使得每个网桥的流量只能通过手工配置流表的方式进行转发
1)在ovs1与ovs2上分别创建一个vxlan端口,作为VxLAN通信的端口
mininet> sh ovs-vsctl add-port s1 vxlan
2)mininet中默认的有h1这台主机(即图中的server1),其对应的网卡为h1-eth0,我们为vm1与vm2的网卡配上ip。
在server1中
mininet> h1 ifconfig h1-eth0 10.0.0.1
在server2中
mininet> h1 ifconfig h1-eth0 10.0.0.2
这时在server1中让h1 ping server2中的h1,其实是ping不通的
3)配置ovs1与ovs2上的vxlan接口规则
这一步创建了VNID为100的vxlan隧道的一个端口
以server1上的vxlan端口为例:由于远程主机的目的ip为192.168.1.220,所以remote_ip处填192.168.1.220,然后vxlan_id设置成100,该端口序号设置为10
mininet> sh ovs-vsctl set interface vxlan type=vxlan \
option:remote_ip=192.168.1.220 option:key=100 ofport_request=10
(注意:在隧道另一头的主机配置上,remote_ip应该为192.168.1.215)
这样做的目的是,配置一个vxlan端口,
1.使得所有从该端口发出的报文,经过添加VXLAN首部、外部UDP首部、外部IP首部后,以为VXLAN格式的报文发送给目的地址
2.同时该端口只能接受VXLAN类型的流入的报文
4)分别给ovs1与ovs2配置如下的规则
1.对于从1号端口出的报文(即从主机h1发出的报文),设置VXLAN_ID为100,从10号口(上文创建的vxlan端口)发出
mininet> sh ovs-ofctl add-flow s1 'in_port=1,actions=set_field:100->tun_id,output:10'
2.对于从vxlan口流入,且vxlan_id为100的报文, 转发到1号口(流入h1的端口)
mininet>sh ovs-ofctl add-flow s1 in_port=10,tun_id=100,actions=output:1
3.查看规则
mininet>sh ovs-ofctl dump-flows s1
5)查看此时是否能连通
mininet> h1 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: h1-eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether fa:0a:9c:ad:bd:6a brd ff:ff:ff:ff:ff:ff
inet 10.0.0.2/8 brd 10.255.255.255 scope global h1-eth0
valid_lft forever preferred_lft forever
inet6 fe80::f80a:9cff:fead:bd6a/64 scope link
valid_lft forever preferred_lft forever
mininet> h1 ping 10.0.0.1
PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data.
64 bytes from 10.0.0.1: icmp_seq=1 ttl=64 time=2.02 ms
64 bytes from 10.0.0.1: icmp_seq=2 ttl=64 time=0.890 ms
64 bytes from 10.0.0.1: icmp_seq=3 ttl=64 time=0.935 ms
ok,实验结束