Не могу добавить 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
команда для копированияvxlan100
MTU для:
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, кажется непростым.