vxlan
Last updated
Last updated
Vxlan的目的是:creating vritual L2 network over physical L3 network。这也间接说明了VTEP的ip必须是一个网段的。
Vxlan报文如下所示:
实验环境:Mac, Vagrant
从内核3.12版本开始对vxlan的支持才比较完整,下面的实验选择了新版本的内核ubuntu16(ubuntu 14的ip link命令不支持dstport)
通过这个Vagrantfile创建有三个节点(安装vagrant,创建一个目录,将该Vagrant文件放进去,然后执行vagrant up即可),下面的实验都将使用这三个节点。
分别在node0和node1创建点对点的vxlan设备(VTEP)
enp0s8为local后面那个ip所对应的网卡?想知道enp0s8为什么这么命名,可以看看Understanding systemd’s predictable network device names。
现在我们可以在node0上ping 10.20.1.3这个ip了:
同时,我们可以通过tcpdump -i enp0s8
查看vxlan包:
如果要更详细地过滤,可以使用下面的命令(见:https://github.com/the-tcpdump-group/tcpdump/issues/611,https://www.wains.be/pub/networking/tcpdump_advanced_filters.txt):
tcpdump -l -n -i <if> 'port 4789 and udp[8:2] = 0x0800 & 0x0800 and udp[11:4] = <vni> & 0x00FFFFFF'
该命令的的几个参数解释:udp[8:2]表示udp包的第8字节(字节数从0开始)开始的2个字节,即第8字节和第9字节,这正是VXLAN flags,根据RFC7348可知,该值为0x0800;udp[11:4]表示udp包的第11字节开始的4个字节,正是VNI的值。
分别在node0、node1、node2创建多播的vxlan设备(VTEP)
在node1和node2上执行类似的命令,将第二条中的ip addr add
里的ip地址改为10.20.1.3/24
(node2)和10.20.1.4/24
。
现在我们可以在node0上ping 10.20.1.3和10.20.1.4这两个ip了。
分别在node0、node1、node2下创建多播vxlan设备,同时vxlan与bridge docker0相连。
注:本文主要参考https://cizixs.com/2017/09/28/linux-vxlan/。
linux 上实现 vxlan 网络: https://cizixs.com/2017/09/28/linux-vxlan/
VXLAN & Linux: https://vincent.bernat.ch/en/blog/2017-vxlan-linux
Flannel对vxlan的支持:https://github.com/coreos/flannel/blob/master/backend/vxlan/vxlan.go
RFC7348 for vxlan: https://tools.ietf.org/html/rfc7348
tcpdump advanced filters: https://www.wains.be/pub/networking/tcpdump_advanced_filters.txt
What are the ARP and FDB tables?: https://blog.michaelfmcnamara.com/2008/02/what-are-the-arp-and-fdb-tables/