Не могу добавить vxlan в интерфейс связи

Я пытаюсь добавить 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 не может быть установлен выше исходного значения: 1370 (но может быть установлен ниже), иначе он получит EINVAL.

При установке в качестве подчиненного устройства ядро ​​пытается установить MTU подчиненного интерфейса равным MTU главного интерфейса со значением по умолчанию 1500, но это не удается из-за вышеизложенного: 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команда для копированияvxlan100MTU для:

      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 следует использовать во всех других связанных местах (например, в других подчиненных устройствах и одноранговом канале связи), иначе следует ожидать других проблем, связанных с MTU. И наоборот, чтобы сохранить MTU 1500 дляbond0: наличие WireGuard с MTU 1550 и, следовательно, с внешним слоем с MTU 1630, кажется непростым.

Другие вопросы по тегам