dstport: 指定目的端口为4789。因为当Linux内核3.7版本首次实现VXLAN时,UDP端口还并没有规定下来。很多厂商利用了8472这个端口,Linux也采用了相同的端口。后来IANA分配了4789作为VXLAN的目的UDP端口。如果你需要使用IANA端口,需要用dstport指定。
dev: 指定VTEP通过哪个物理device来通信,这里是使用eth0。
第二条命令让vxlan1接口up起来。第三条命令给设备分配IP地址10.0.0.106, 子网掩码为24 (255.255.255.0)。
在vm2上,利用类似方法创建名为vxlan1的网络接口。
# ip link add vxlan1 type vxlan id 1 remote 172.31.0.106 dstport 4789 dev eth0 # ip link set vxlan1 up # ip addr add 10.0.0.107/24 dev vxlan1
以上简单的命令就完成了所有配置。用ifconfig可以看到vxlan1网络接口,如下:
# ifconfig vxlan1 vxlan1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1450 inet 10.0.0.106 netmask 255.255.255.0 broadcast 0.0.0.0 ether 22:2d:c4:f0:c7:29 txqueuelen 1000 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
看下vm1的如下路由表,去往目的网段10.0.0.0/24的报文将走vxlan1接口。
# route -n
Kernel IP routing table
Destination
Gateway
Genmask
Flags Metric Ref Use Iface
0.0.0.0
172.31.0.253 0.0.0.0
UG 0
0
0 eth0
10.0.0.0
0.0.0.0
255.255.255.0 U
0
0
0 vxlan1
169.254.0.0
0.0.0.0
255.255.0.0
U
1002 0
0 eth0
172.31.0.0
0.0.0.0
255.255.255.0 U
0
0
0 eth0
在vm1上ping overlay网络的对端IP地址10.0.0.107,可以ping通。
# ping 10.0.0.107 -c 3 PING 10.0.0.107 (10.0.0.107) 56(84) bytes of data. 64 bytes from 10.0.0.107: icmp_seq=1 ttl=64 time=0.447 ms 64 bytes from 10.0.0.107: icmp_seq=2 ttl=64 time=0.361 ms 64 bytes from 10.0.0.107: icmp_seq=3 ttl=64 time=0.394 ms --- 10.0.0.107 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2000ms rtt min/avg/max/mdev = 0.361/0.400/0.447/0.042 ms
在ping包的同时,用tcpdump抓vm1 eth0网卡的包。因为报文到达eth0前经过了网络接口vxlan1, 完成了VXLAN的封装,所以在抓包结果里应该能看到完整的VXLAN报文。
抓包时可以只抓和对端172.31.0.107通信的报文,如下:
# tcpdump -i eth0 host 172.31.0.107 -s0 -v -w vxlan_vni_1.pcap
抓包结果如下,wireshark自动将UDP目的端口为4789的报文识别成VXLAN报文,直接显示内层的报文,protocol为ICMP协议。如果使用Linux默认接口8472,显示的应该是UDP协议,还需要修改wireshark的协议设置,让其识别成VXLAN。
场景2: 容器跨主机通信上面最简单的点对点VXLAN实验只是个简答的演示,没有太多实际工程意义,本节用容器通信来演示一个更加完整的场景。