Vxlan 原理
openstack understand neutron
https://www.gitbook.com/book/yeasy/openstack_understand_neutron/details
自己总结一下:
分析 VTEP的情况, 即Vxlan跟VXLAN通信的情况(非SDN的情况下)。
VXLAN 在linux下可以使用 ovs支持,也可以使用linux-bridge支持。
张华的博客 http://blog.csdn.net/quqi99/article/details/9170109, 好像也是IBMer, 写了很多网络相关的博客。
基本原理: L2 in L4的原理。
先做个实验(组播方式):
host1:
创建vtep(vxlan的tunnel)及其bridge
NIC=ens3 sudo brctl addbr br1 # sudo ifconfig br1 192.169.0.6/24 sudo ip link set br1 up sudo ip link add vxlan100 type vxlan id 100 group 239.1.1.1 dev $NIC # sudo ip link add vxlan100 type vxlan id 100 remote 10.0.0.28 dstport 4789 dev $NIC # 单播 sudo ip link set vxlan100 up sudo brctl addif br1 vxlan100
模拟一个VM的nic
1 sudo ip link add type veth 2 sudo ifconfig veth0 192.167.0.6/24 up 3 sudo ifconfig veth0 mtu 1450 4 sudo ifconfig veth1 up 5 sudo ifconfig veth1 mtu 1450 6 sudo brctl addif br1 veth1
$ sudo ip link 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000 link/ether fa:16:3e:05:aa:28 brd ff:ff:ff:ff:ff:ff 3: br1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1400 qdisc noqueue state UP mode DEFAULT group default qlen 1000 link/ether 62:d2:a5:91:6a:8c brd ff:ff:ff:ff:ff:ff 4: vxlan100: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1400 qdisc noqueue master br1 state UNKNOWN mode DEFAULT group default qlen 1000 link/ether 62:d2:a5:91:6a:8c brd ff:ff:ff:ff:ff:ff 5: veth0@veth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP mode DEFAULT group default qlen 1000 link/ether aa:e6:2e:9b:62:0c brd ff:ff:ff:ff:ff:ff 6: veth1@veth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master br1 state UP mode DEFAULT group default qlen 1000 link/ether 8e:a5:ec:e4:7f:0d brd ff:ff:ff:ff:ff:ff
$ ip add show ens3 |grep inet inet 10.0.0.32/24 brd 10.0.0.255 scope global ens3
$ route Destination Gateway Genmask Flags Metric Ref Use Iface default localhost 0.0.0.0 UG 0 0 0 ens3 10.0.0.0 * 255.255.255.0 U 0 0 0 ens3 169.254.169.254 localhost 255.255.255.255 UGH 0 0 0 ens3 192.167.0.0 * 255.255.255.0 U 0 0 0 veth0 192.169.0.0 * 255.255.255.0 U 0 0 0 br1
sudo netstat -ulp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name udp 0 0 *:bootpc *:* 923/dhclient udp 0 0 *:8472 *:* -
host2:
创建vtep(vxlan的tunnel)及其bridge
NIC=ens3 sudo brctl addbr br1 # sudo ifconfig br1 192.169.0.7/24 sudo ip link set br1 up sudo ip link add vxlan100 type vxlan id 100 group 239.1.1.1 dev $NIC \ # sudo ip link add vxlan100 type vxlan id 100 remote 10.0.0.32 dstport 4789 dev $NIC sudo ip link set vxlan100 up sudo brctl addif br1 vxlan100
模拟一个VM的nic
1 sudo ip link add type veth 2 sudo ifconfig veth0 192.167.0.7/24 up 3 sudo ifconfig veth0 mtu 1450 4 sudo ifconfig veth1 up 5 sudo ifconfig veth1 mtu 1450 6 sudo brctl addif br1 veth1
$ sudo ip link 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000 link/ether fa:16:3e:72:0e:58 brd ff:ff:ff:ff:ff:ff 3: br1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1400 qdisc noqueue state UP mode DEFAULT group default qlen 1000 link/ether 5a:8e:c9:5f:53:d6 brd ff:ff:ff:ff:ff:ff 4: vxlan100: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1400 qdisc noqueue master br1 state UNKNOWN mode DEFAULT group default qlen 1000 link/ether 5a:8e:c9:5f:53:d6 brd ff:ff:ff:ff:ff:ff 5: veth0@veth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP mode DEFAULT group default qlen 1000 link/ether 2a:b4:c1:16:6e:47 brd ff:ff:ff:ff:ff:ff 6: veth1@veth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master br1 state UP mode DEFAULT group default qlen 1000 link/ether e2:21:11:b3:9d:73 brd ff:ff:ff:ff:ff:ff
$ ip add show ens3 |grep inet inet 10.0.0.28/24 brd 10.0.0.255 scope global ens3
网络测试:
host2 $ ping 192.167.0.6
host1 $ sudo tcpdump -i veth0 -vvv
tcpdump: listening on veth0, link-type EN10MB (Ethernet), capture size 262144 bytes
17:33:55.276520 IP (tos 0x0, ttl 64, id 27270, offset 0, flags [DF], proto ICMP (1), length 84)
192.167.0.7 > 192.167.0.6: ICMP echo request, id 12626, seq 1, length 64
17:33:55.276633 IP (tos 0x0, ttl 64, id 56736, offset 0, flags [none], proto ICMP (1), length 84)
192.167.0.6 > 192.167.0.7: ICMP echo reply, id 12626, seq 1, length 64
host1 $ sudo tcpdump -i vxlan100 -vvv
tcpdump: listening on vxlan100, link-type EN10MB (Ethernet), capture size 262144 bytes
17:48:32.437673 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 192.167.0.7 tell 192.167.0.6, length 28
17:48:32.439064 ARP, Ethernet (len 6), IPv4 (len 4), Reply 192.167.0.7 is-at 2a:b4:c1:16:6e:47 (oui Unknown), length 28
host1 $ sudo tcpdump -i ens3 -vvv -p udp -w eth0_vxlan.cap
$ sudo tcpdump host 10.0.0.28 -i ens3 -vv 15:35:30.857397 IP (tos 0x0, ttl 64, id 19875, offset 0, flags [none], proto UDP (17), length 134) localhost.55482 > localhost.8472: [no cksum] OTV, flags [I] (0x08), overlay 0, instance 100 IP (tos 0x0, ttl 64, id 14017, offset 0, flags [DF], proto ICMP (1), length 84) 192.167.0.7 > 192.167.0.6: ICMP echo request, id 12933, seq 187, length 64 15:35:30.857589 IP (tos 0x0, ttl 64, id 23656, offset 0, flags [none], proto UDP (17), length 134) localhost.58224 > localhost.8472: [no cksum] OTV, flags [I] (0x08), overlay 0, instance 100 IP (tos 0x0, ttl 64, id 1851, offset 0, flags [none], proto ICMP (1), length 84) 192.167.0.6 > 192.167.0.7: ICMP echo reply, id 12933, seq 187, length 64
删除创建的接口
sudo ip link set veth1 down sudo ip link delete veth1 type veth sudo ip link set vxlan100 down sudo ip link delete vxlan100 sudo ip link set br1 down sudo ip link delete br1
原理
在不同host上的VM 通信, ARP通过所在的host的VTEP(用来封包解包记录流表)封包(UDP)完之后, 进行IP组播, 整个网络中,在同一IP组播内的VTEP收到广播后,解包。
然后发给VM,VM 进行ARP响应。
流表格式 【(VNI,内层MAC1,外层vtep_ip),(VNI,内层MAC2,外层vtep_ip)】。
以后的通信,通过流表,根据 目地VM的MAC地址,源VETP找到对应目的VTEP的IP地址 行封包, 目的VTEP进行解包。
具体查看。
http://network.51cto.com/art/201312/425388.htm
VTEP负责原始以太报文的VXLAN封装和解封装,可以是虚拟交换机,也可以是物理交换机. 在openstack中, 通常是ovs提供该功能。
VXLAN GW除了具备VTEP的功能外,还负责VLAN报文与VXLAN报文之间的映射和转发,主要以物理交换机为主。
VXLAN IP GW具有VXLAN GW的所有功能,此外,还负责处理不同VXLAN之间的报文通信,同时也是数据中心内部服务向往发布业务的出口,主要以高性能物理交换机为主。
VxlanARP请求
(1) vxlan初始化
VM1和VM2连接到VXLAN网络(VNI)100,两个VXLAN主机加入IP多播组239.119.1.1
(2) ARP请求
1) VM1以广播的形式发送ARP请求;
2) VTEP1封装报文。打上VXLAN标识为100,外层IP头DA为IP多播组(239.119.1.1),SA为IP_VTEP1.
3) VTEP1在多播组内进行多播;
4) VTEP2解析接收到多播报文。填写流表(VNI, 内层mac地址,外层Ip地址),并在本地VXLAN标识为100的范围内
广播(是VXLAN的用武之地)。
5) VM2对接收到的ARP请求进行响应;
(3) ARP应答
1) VM2准备ARP响应报文后向VM1发送响应报文
2)VTEP2接收到VM2的响应报文后把它封装在ip单播报文中(VXLAN标识依然为100),然 后向VM1发送单播
3)VTEP1接收到单播报文后,学习内层MAC到外层ip地址的映射,解封装并根据被封装内容的目的MAC地址转发给VM1
4)VM1接收到ARP应答报文,ARP交互结束
四:数据传输
(1) ARP请求应答之后,VM1知道了VM2的Mac地址,并且要向VM2通信(注意,VM1是以TCP的方法向VM2发送数据的)。
VTEP1 收到VM1发送数据包,用MAC地址从流表中检查VM1与VM2是否属于用一个VNI。两个VM不但位于同一个VNI中(不在同一个VNI中出网关),并且VTEP1已经知道了VM2的所有地址信息(MAC和VTEP2_IP)。VTEP1封装新的数据包。然后交给上联交换机。
(2) 上联交换机收到服务器发来的UDP包,对比目的IP地址和自己的路由表,然后将数据报转发给相应的端口。
(3) 目的VTEP收到数据包后检查器VNI,如果UDP报中VNI与VM2的VNI一致,则将数据包解封装后交给VM2进一步处理。至此一个数据包传输完成。整个Vxlan相关的行为(可能穿越多个网关)对虚拟机来说是透明的,虚拟机不会感受传输的过程。虽然VM1与VM2之间启动了TCP来传输数据,但数据包一路上实际是以UDP的形式被转发,两端的VTEP并不会检查数据是否正确或者顺序是否完整,所有的这些工作都是在VM1和VM2在接收到解封装的TCP包后完成的。也就是说如果说如果被UDP封装的是TCP连接,那么UDP和TCP将做为两个独立的协议栈各自工作,相互之间没有交互。
五:Vxlan网关
如果需要VXLAN网络和非VXLAN网络连接,必须使用VXLAN网关才能把VXLAN网络和外部网络进行桥接和完成VXLAN ID和VLAN ID之间的映射和路由,和VLAN一样,VXLAN网络之间的通信也需要三层设备的支持,即VXLAN路由的支持。同样VXLAN网关可由硬件和软件来实现。从封装的结构上来看,VXLAN提供了将二层网络overlay在三层网络上的能力,VXLAN Header中的VNI有24个bit,数量远远大于4096,并且UDP的封装可以穿越三层网络,比VLAN有更好的扩展性。