我正在尝试将 vxlan100 添加到 bond0 接口,但似乎不起作用
以下是命令。我有一个 wg0 (wireguard) 接口,正在其上创建 L2 vxlan100。
sudo ip link add vxlan100 type vxlan id 100 dev wg0
sudo ip link add bond0 type bond
echo 0 > /sys/class/net/bond0/bonding/mode
sudo ip link set vxlan100 master bond0
但是最后一行“sudo ip link set vxlan100 master bond0”给了我一个错误
RTNETLINK answers: Invalid argument
请帮忙,我不确定我哪里做错了。
答案1
重现此问题可以通过以下方式获取特定的内核消息dmesg
:
bond0: (slave vxlan100): Error -22 calling dev_set_mtu
(并且我们有 EINVAL = 22 = 无效参数)
所以这是关于 MTU 的问题。WireGuard 确实有 MTU 开销,因此通常为 MTU 1420,并且VXLAN将使用父接口的 MTU 减去 50 字节(20(IP 报头)+ 8(UDP 报头)+ 8(VXLAN 特定报头)+ 14(MAC 报头)= 50)。1420-50=1370 MTU。一些测试表明,VXLAN 的 MTU 不能设置为高于其初始值:1370(但可以设置得更低),否则将得到 EINVAL。
当设置vxlan100
为的bond0
从属时,内核尝试将从属接口的 MTU 设置为其主接口的 MTU(默认值为 1500),但由于上述原因,此操作会失败:vxlan100
的 MTU 不能增加到 1370 以上。
为了使操作成功,必须预先降低主设备的 MTU:
ip link set dev bond0 mtu 1370
因此以下命令(重新排序、缩短和更正以使用 IANA 分配的端口 4789)将起作用:
ip link add name bond0 mtu 1370 type bond mode balance-rr
ip link add name vxlan100 master bond0 type vxlan id 100 dev wg1 dstport 4789
ip -d link show dev vxlan100
注意:中似乎没有关于最大 MTU 的信息maxmtu 65535
。我不知道这是错误还是其他不可用的属性。
为了避免猜测正确的 MTU,可以使用 JSON 输出和jq
命令复制vxlan100
的 MTU 为bond0
:
ip link add name vxlan100 type vxlan id 100 dev wg0 dstport 4789
ip link add name bond0 mtu $(ip -json link show dev vxlan100 | jq -r '.[].mtu') type bond mode balance-rr
ip link set dev vxlan100 master bond0
当然,其他所有相关位置(例如:的其他从属设备bond0
以及与之通信的对等链路bond0
)也应使用类似的 MTU,否则可能会出现其他与 MTU 相关的问题。相反,要保持 1500 MTU bond0
:WireGuard 的 MTU 为 1550,因此外层的 MTU 为 1630,这看起来并不容易实现。