介绍
VXLAN(Virtual Extensible LAN, 虚拟局域网扩展)是一种网络虚拟化技术,它试图改善大云计算部署相关的可扩展性问题。它采用类似 VLAN 的封装技术来封装基于 MAC 含括第4层的 UDP 数据包的 OSI 第2层 以太网帧,使用 4789 作为默认分配的 IANA 目的地 UDP 端口号。
VXLAN 是努力覆盖封装协议的演变,它提高了可扩展性达 1600 万个逻辑网络,并允许透过IP网络邻接第 2 层。使用 HER (Head-End Replication)的 多播 或 单播 是用来淹没 BUM (broadcast, unknown destination address, multicast) 流量。
实践
点对点的 VXLAN
假设我们有两个 Linux 主机,IP 分别为 192.168.1.100
和 192.168.1.101
,然后在这两个主机之间建立一个 点对点 的 VXLAN 网络。
1 | $ ip link add vxlan0 type vxlan \ |
使用上面的指令,我们在 192.168.1.100
上建立了一个名叫 vxlan0
的 inferface,后面是配置 VXLAN时的参数:
id 1
: 代表的是当前 VXLAN 的 VNI,可以看做是 VXLAN 的IDremote
:代表的是远端主机的 IPlocal
:代表的是本地主机的IPdev
:代表的是 VXLAN 这个 interface 的数据要从哪个 interface 传输
执行完这个指令之后,我们可以用 ip -d link show dev vxlan0
看到 vxlan0
这个 interface 的详细信息。
接着,给刚刚创建的 vxlan0
配置 IP,并启用它。
1 | $ ip addr add 10.0.0.1/24 dev vxlan0 |
这个时候 vxlan0
这个 interface 就已经被启用了,IP 为 10.0.0.1
。我们可以用 ip route
查看,能够发现 10.0.0.0/24
网段的 IP 都会通过 vxlan0
这个 interface 来转发。同时,vxlan0
的 fdb
表项可以通过 bridge fdb
来查看。
接着,我们在 192.168.1.101
上也做同样的配置。完成之后,一个 点对点 的 VXLAN 就配置完成了。
多播模式的 VXLAN
如果想要 VXLAN 支持多播模式,需要底层网络支持多播的功能,但是以我目前的实践来看,大部分网络环境都是支持多播的。
要组成同一个 VXLAN 网络,VTEP 就必须能感知到彼此的存在。多播组本来的功能就是把网络中的某些节点组成一个虚拟的组,所以 VXLAN 最初想到用多播来实现是十分自然的事情。
多播模式的 VXLAN 配置,其实和之前的点对点模式的配置十分的相似,只是在某些地方有些许的不同。
我们假设有三个不同的 Linux 主机,分别为 192.168.1.100
192.168.1.101
192.168.1.102
,然后将它们三个加入到同一个 VXLAN 当中。
1 | $ ip link add vxlan0 type vxlan \ |
上面的命令和之前的区别在于,点对点指定的是两端的 IP,多播指定的是多播组的IP。这里的 239.1.1.1
就是多播IP。这个时候查看 vxlan0
的 fdb
就能发现,fdb
指向的不再是对端的 IP,而是多播地址。
接着,添加 vxlan0
的 fdb
表项,目的是能让 vxlan0
的报文到达所属机器上。以 192.168.1.100
为例:
1 | $ bridge fdb append to 00:00:00:00:00:00 dst 192.168.1.101 dev vxlan0 |
这里需要解释一下,VXLAN 实际上就是一个运行在 三层网络
上的 二层网络
。而我们知道,二层网络
的通信都是通过 MAC
地址 来寻址的。所以,我们需要预先添加 fdb
表项,让 vxlan0
的 ARP
报文能够到达所属机器上,从而获取 MAC
地址,才能完成接下来的通信。
最后,给 vxlan0
添加 IP,并启用 vxlan0
:
1 | $ ip addr add 10.0.0.1/24 dev vxlan0 |
再另外两台机器上做类似的配置之后,一个多播模式的 VXLAN 就配置完成了。
额外的参数
proxy
: 开启 ARP 压缩learning
: 学习远端主机的MAC
地址,也就是 VXLAN 的flood and learn
ageing
: 学习到本地fdb
的主机MAC
地址 的超时时间maxaddress
:fdb
表项的最大数目
参考
使用 Linux Bridge 搭建 VXLAN Overlay 网络
How to configure linux vxlans with multiple unicast endpoints