VXLAN(Virtual eXtensible LAN,虚拟可扩展的局域网),是一种虚拟化隧道通信技术。它是一种overlay(覆盖网络)技术,通过三层的网络搭建虚拟的二层网络。
VXLAN创建在原来的IP网络(三层)上,只要是三层可达的网络就能部署VXLAN。
在VXLAN网络的每个端点都有一个VTEP设备,负责VXLAN协议报文的封包和解包,也就是在虚拟报文上封装VTEP通信的报文头部。
其封装如下
Underlay交换机(物理或虚拟)MTU 问题,传统网络 MTU 一般为 1500,这里加上 VXLAN 的封装多出的50 或 54 字节,需要调整 MTU 为 1550 或 1554,防止频繁分包。一般设置为1600+。
VXLAN通信双方(一般为虚拟机或容器)都认为在直接通信,并不知道底层网络的存在。从整体看,通过Vtep对包进行封装,每个VXLAN网络像是为通信的终端搭建了一个单独的通信通道,也就是隧道。
2012 年 Stephen Hemminger 把相关的工作合并到 kernel 中,并最终出现在 kernel 3.7.0 版本。
到了 kernel 3.12 版本,Linux 对 VXLAN 的支持已经完备,支持单播和组播,IPv4 和 IPv6。
静态配置vxlan
Name | IP Addr | 对端 | 备注 |
---|---|---|---|
主机1 ens33 | Host 01 | 192.168.21.11/24 | vtep |
主机2 ens33 | Host 02 | 192.168.21.12/24 | vtep |
vxlan0@Host 01 | 172.19.1.11/24 | vxlan0@Host 02 | 单播 |
vxlan1@Host 01 | 172.19.2.11/24 | vxlan1@Host 02 | 单播 |
vxlan0@Host 02 | 172.19.1.12/24 | vxlan0@Host 01 | 组播 |
vxlan1@Host 02 | 172.19.2.12/24 | vxlan1@Host 01 | 组播 |
创建VXLAN接口
[root@worker-01 ~]# ip link add vxlan0 type vxlan id 42 dstport 4789 remote 192.168.21.12 local 192.168.21.11 dev ens33
其中,VNI=42,两边要一样
dstport为vtep通讯端口,IANA - Internet Assigned Numbers Authority定义为4789,不指定将使用Linux定义的8472
配置VXLAN接口地址并激活
[root@worker-01 ~]# ip addr add 172.19.1.11/24 dev vxlan0
[root@worker-01 ~]# ip link set vxlan0 up
[root@worker-01 ~]# ifconfig vxlan0
vxlan0: flags=4163mtu 1450
inet172.19.1.11
netmask 255.255.255.0 broadcast 0.0.0.0
inet6 fe80::1407:1aff:fe7e:bf23 prefixlen 64 scopeid 0x20
ether 16:07:1a:7e:bf:23 txqueuelen 1000 (Ethernet)
RX packets 39 bytes 5097 (4.9 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 6351 bytes 1067978 (1.0 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@worker-01 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.21.2 0.0.0.0 UG 100 0 0 ens33
...
172.19.1.0 0.0.0.0 255.255.255.0 U 0 0 0 vxlan0
[root@worker-01 ~]# ip route
default via 192.168.21.2 dev ens33 proto static metric 100
...
172.19.1.0/24 dev vxlan0 proto kernel scope link src 172.19.1.11
[root@worker-01 ~]# bridge fdb
...
00:00:00:00:00:00 dev vxlan0 dst 192.168.21.12 via ens33 self permanent
[root@worker-01 ~]# ping 172.19.1.12
PING 172.19.1.12 (172.19.1.12) 56(84) bytes of data.
64 bytes from 172.19.1.12: icmp_seq=1 ttl=64 time=0.620 ms
64 bytes from 172.19.1.12: icmp_seq=2 ttl=64 time=1.67 ms
64 bytes from 172.19.1.12: icmp_seq=3 ttl=64 time=1.16 ms
64 bytes from 172.19.1.12: icmp_seq=4 ttl=64 time=3.13 ms
^C
--- 172.19.1.12 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3010ms
rtt min/avg/max/mdev = 0.620/1.648/3.137/0.937 ms
[root@worker-01 ~]# ip link add vxlan1 type vxlan id 65535 dstport 4789 local 192.168.21.11 group 228.1.1.1 dev ens33
[root@worker-01 ~]# ip addr add 172.19.2.11/24 dev vxlan1
[root@worker-01 ~]# ip link set vxlan1 up
228.1.1.1为组播组,范围为224.0.0.0~239.255.255.255
[root@worker-01 ~]# ip route
default via 192.168.21.2 dev ens33 proto static metric 100
...
172.19.1.0/24 dev vxlan0 proto kernel scope link src 172.19.1.11
172.19.2.0/24 dev vxlan1 proto kernel scope link src 172.19.2.11
[root@worker-01 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.21.2 0.0.0.0 UG 100 0 0 ens33
...
172.19.1.0 0.0.0.0 255.255.255.0 U 0 0 0 vxlan0
172.19.2.0 0.0.0.0 255.255.255.0 U 0 0 0 vxlan1
路由表看起来和单播模式没有什么区别
[root@worker-01 ~]# bridge fdb
...
00:00:00:00:00:00 dev vxlan0 dst 192.168.21.12 via ens33 self permanent
00:00:00:00:00:00 dev vxlan1 dst 228.1.1.1 via ens33 self permanent
多播模式下,vxlan的广播包会转发到多播组。
一般在事先不知道MAC地址和VTEP IP信息,可以使用多播。
但是,多播方式会带来报文浪费,在实际生产中VXLAN的多播模式很少被采用。
[root@worker-01 ~]# ping 172.19.2.12 -c 3
PING 172.19.2.12 (172.19.2.12) 56(84) bytes of data.
64 bytes from 172.19.2.12: icmp_seq=1 ttl=64 time=0.404 ms
64 bytes from 172.19.2.12: icmp_seq=2 ttl=64 time=1.81 ms
64 bytes from 172.19.2.12: icmp_seq=3 ttl=64 time=0.747 ms
--- 172.19.2.12 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2006ms
rtt min/avg/max/mdev = 0.404/0.988/1.813/0.599 ms
以上