Специальной обработки виртуальных двойных интерфейсов не предусмотрено type veth
. Так что нужно немного повозиться, в основном используя опцию pre-up
. Я оставил veth0
и veth1
здесь, но вам действительно следует подумать о выборе любых других имен (, например veth-br0
и veth-lanbr0
), потому что это имена по умолчанию, выбранные, если они не указаны (, например :ip link add type veth
), и они могут столкнуться.
Для интерфейсов veth
:
iface veth0 inet manual
pre-up ip link add veth0 type veth peer name veth1 || :
hwaddress 02:00:00:01:00:00
iface veth1 inet manual
pre-up ip link add veth1 type veth peer name veth0 || :
hwaddress 02:00:00:01:00:01
Это включает оба интерфейса при вызове любого из них. || :
здесь, чтобы не дать сбой, потому что одноранговый интерфейс уже настроен «другим» интерфейсом. Обратите внимание, что ради внутреннего состояния ifup
оба должны быть подняты в конце, даже если поднятие одного вызовет появление другого. Для предполагаемого использования hwaddress
, вероятно, является необязательным и в любом случае может быть установлено любое другое правильное значение. Мост принимает MAC-адрес первого подчиненного интерфейса.
Теперь используйте их на мостах. Я не буду приводить все ваши настройки (, потому что вы на самом деле не дали ), а только связанные с veth
части. Вам придется адаптировать то, что я не мог догадаться, и где я оставил некоторые XXXX
или ...
(, например,inet XXXX
inet manual
inet static
или inet dhcp
?)
auto br0
iface br0 inet XXXX
pre-up ifup veth0
bridge_ports eth0 veth0
...
auto lanbr0
iface lanbr0 inet XXXX
pre-up ifup veth1
bridge_ports veth1 eth1
address xx.xx.xx.xx
netmask 255.255.255.0
...
Примечание. Я добавил команду ifup vethX
внутри, потому что в противном случае она будет жаловаться на то, что интерфейс не существует, вызовет мост без этого интерфейса и будет считать, что это сделано. Мне не нужно было использовать || :
здесь, потому что вызов уже логически (означающего ifupdown
состояние )up интерфейса не является ошибкой.
После завершения недостающих частей поместите их в отдельные (или не )файлы конфигурации в/etc/network/interfaces.d
(или даже /etc/network/interfaces
), и это должно работать.
Если сначала это не сработало, попробуйте логически отключить все интерфейсы (, логически я имею в виду использованиеifdown
)и повторите попытку :, что может быть из-за неправильного логического состояния, не позволяющего некоторым интерфейсам (re )настроены правильно.
Также обратите внимание, что возможны взаимодействия с другими сетевыми менеджерами, такими как... NetworkManager. Вероятно, есть варианты, чтобы они игнорировали некоторые интерфейсы, но это выходит за рамки этого ответа.
Для справки, вот полный скрипт интерфейсов (добавление xx для некоторых адресов):
# The loopback network interface
auto lo
iface lo inet loopback
# IPv4 address
auto enp8s0
iface enp8s0 inet manual
offload-gro off
offload-lro off
auto enp0s31f6
iface enp0s31f6 inet manual
iface veth0 inet manual
pre-up ip link add veth0 type veth peer name veth1 || :
hwaddress 02:00:00:01:00:00
iface veth1 inet manual
pre-up ip link add veth1 type veth peer name veth0 || :
hwaddress 02:00:00:01:00:01
# Bridge setup
auto br0
iface br0 inet static
pre-up ifup veth0
bridge_ports enp8s0 veth0
bridge_fd 0
bridge_maxwait 0
address 192.168.xx.xx
broadcast 192.168.xx.xx
network 192.168.xx.xx
netmask 255.255.255.0
gateway 192.168.xx.xx
dns-nameservers xx.xx.xx.xx xx.xx.xx.xx
auto lanbr0
iface lanbr0 inet manual
pre-up ifup veth1
bridge_ports veth1 enp0s31f6
Еще раз спасибо А.Б.