Linux隧道网络VxLAN
概述
VXLAN(Virtual eXtensible LAN,虚拟可扩展的局域网),是一种虚拟化隧道通信技术。它是一种overlay(覆盖网络)技术,通过三层的网络搭建虚拟的二层网络。
- 由RFC7348中定义:A framework for overlaying virtualized layer 2 networks over lay 3 networks.
- 在底层物理网络(underlay)之上,依托UDP层构建
- 逻辑网络与物理网络解耦
- 对原有的网络架构影响小
- 底层多厂家设备组网需求
- 能适配虚拟机和容器环境
VXLAN封装
VXLAN创建在原来的IP网络(三层)上,只要是三层可达的网络就能部署VXLAN。 在VXLAN网络的每个端点都有一个VTEP设备,负责VXLAN协议报文的封包和解包,也就是在虚拟报文上封装VTEP通信的报文头部。 其封装如下
- VTEP(VXLAN Tunnel Endpoints):VXLAN网络的边缘设备,用来进行VXLAN报文的处理(封包和解包)
- VNI(VXLAN Network Identifier):VNI是每个VXLAN的标识,占24 bits,所以是个24位整数,因此最大值是224=16777216
Underlay交换机(物理或虚拟)MTU 问题,传统网络 MTU 一般为 1500,这里加上 VXLAN 的封装多出的50 或 54 字节,需要调整 MTU 为 1550 或 1554,防止频繁分包。一般设置为1600+。
VXLAN通信双方(一般为虚拟机或容器)都认为在直接通信,并不知道底层网络的存在。从整体看,通过Vtep对包进行封装,每个VXLAN网络像是为通信的终端搭建了一个单独的通信通道,也就是隧道。
Linux对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 | 组播 |
单播模式
- 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
- Host 02配置与Host 01一致,VNI要一致
- 查看端口情况
[root@worker-01 ~]# ifconfig vxlan0 vxlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1450 inet 172.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
- 路由和FDB表项
[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
组播模式
- Host 01配置
[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
- Host 02配置和Host 01类似,VNI=65535 group=228.1.1.1
- 路由
[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
路由表看起来和单播模式没有什么区别
- FDB
[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
以上