Я пытаюсь добавить 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 overhead, поэтому обычно он составляет 1420, иVXLANбудет использовать MTU родительского интерфейса минус 50 байт (20 (заголовок IP) + 8 (заголовок UDP) + 8 (специфический заголовок VXLAN) + 14 (заголовок MAC) = 50). 1420-50=1370 MTU. Несколько тестов показывают, что MTU VXLAN не может быть установлен выше его начального значения: 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
Примечание: информация о максимальном 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. Наоборот, сохранить MTU 1500 для bond0
: имея WireGuard с MTU 1550 и, таким образом, с внешним слоем с MTU 1630, не выглядит легкодостижимым.