在 Linux 上配置 VXLAN

介绍

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.100192.168.1.101,然后在这两个主机之间建立一个 点对点 的 VXLAN 网络。

1
2
3
4
5
6
$ ip link add vxlan0 type vxlan \
id 1 \
remote 192.168.1.101 \
local 192.168.1.100 \
dstport 4789 \
dev eth0

使用上面的指令,我们在 192.168.1.100上建立了一个名叫 vxlan0的 inferface,后面是配置 VXLAN时的参数:

  • id 1: 代表的是当前 VXLAN 的 VNI,可以看做是 VXLAN 的ID
  • remote:代表的是远端主机的 IP
  • local:代表的是本地主机的IP
  • dev:代表的是 VXLAN 这个 interface 的数据要从哪个 interface 传输

执行完这个指令之后,我们可以用 ip -d link show dev vxlan0 看到 vxlan0 这个 interface 的详细信息。

接着,给刚刚创建的 vxlan0 配置 IP,并启用它。

1
2
$ ip addr add 10.0.0.1/24 dev vxlan0
$ ip link set vxlan0 up

这个时候 vxlan0 这个 interface 就已经被启用了,IP 为 10.0.0.1。我们可以用 ip route 查看,能够发现 10.0.0.0/24 网段的 IP 都会通过 vxlan0 这个 interface 来转发。同时,vxlan0fdb 表项可以通过 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
2
3
4
5
$ ip link add vxlan0 type vxlan \
id 1 \
group 239.1.1.1 \
dstport 4789 \
dev eth0

上面的命令和之前的区别在于,点对点指定的是两端的 IP,多播指定的是多播组的IP。这里的 239.1.1.1 就是多播IP。这个时候查看 vxlan0 的 fdb 就能发现,fdb 指向的不再是对端的 IP,而是多播地址。

接着,添加 vxlan0fdb 表项,目的是能让 vxlan0 的报文到达所属机器上。以 192.168.1.100为例:

1
2
$ bridge fdb append to 00:00:00:00:00:00 dst 192.168.1.101 dev vxlan0
$ bridge fdb append to 00:00:00:00:00:00 dst 192.168.1.102 dev vxlan0

这里需要解释一下,VXLAN 实际上就是一个运行在 三层网络 上的 二层网络。而我们知道,二层网络 的通信都是通过 MAC地址 来寻址的。所以,我们需要预先添加 fdb 表项,让 vxlan0ARP 报文能够到达所属机器上,从而获取 MAC地址,才能完成接下来的通信。

最后,给 vxlan0 添加 IP,并启用 vxlan0:

1
2
$ ip addr add 10.0.0.1/24 dev vxlan0
$ ip link set vxlan0 up

再另外两台机器上做类似的配置之后,一个多播模式的 VXLAN 就配置完成了。

额外的参数

  • proxy: 开启 ARP 压缩
  • learning: 学习远端主机的 MAC地址,也就是 VXLAN 的 flood and learn
  • ageing: 学习到本地 fdb 的主机 MAC地址 的超时时间
  • maxaddress: fdb 表项的最大数目

参考

使用 Linux Bridge 搭建 VXLAN Overlay 网络

linux 上实现 vxlan 网络

How to configure linux vxlans with multiple unicast endpoints