我正在嘗試將 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。
為了使操作成功,必須事先降低master的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
注意:有關最大 MTU 的資訊似乎不可ip -d link show dev vxlan100
用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
當然,類似的 MTU 應該用在所有其他相關的地方(例如:其他從站bond0
和與之通訊的對等連結bond0
),否則會出現其他與 MTU 相關的問題。保持 1500 MTU 的另一種方法是bond0
:將 WireGuard 設定為 MTU 1550,因此外層的 MTU 為 1630 看起來並不容易實現。