Linux. Сетевой мост и Virtual LAN

24.02.2024

Теги: BridgeLinuxUbuntuVLANКонфигурацияЛокальнаяСеть

Случайно нашел на YouTube интересное видео по настройке сети. Затрагивались темы сетевого моста и виртуальной локальной сети. Так что решил повторить, чтобы разобраться получше. Слышал много раз про мост и VLAN — но сам никогда не сталкивался. При создании виртуальных машин в VirtualBox нам потребуется создать пять внутренних сетей net1, net2, net3, net4 и net5.

Первый этап

Создаем и настраиваем виртуальные машины gateway1, dhcpd1 и pc1.

Настройка шлюза gateway1

Настройка сети с помощью netplan

$ sudo nano /etc/netplan/01-netcfg.yamlf
network:
  ethernets:
    enp0s3:
      dhcp4: true
      dhcp6: false
    enp0s8:
      addresses: [10.1.1.1/24]
      nameservers:
        addresses: [1.0.0.1, 8.8.4.4]
  version: 2

Разрешаем пересылку пакетов между интерфейсами

$ sudo nano /etc/sysctl.conf
net.ipv4.ip_forward=1
$ sudo sysctl -p
net.ipv4.ip_forward=1

Настраиваем netfilter с помощью iptables

$ sudo iptables -P FORWARD DROP  # сначала все запрещаем, потом разрешаем необходимое
$ sudo iptables -A FORWARD -i enp0s3 -o enp0s8 -d 10.1.1.0/24 -j ACCEPT
$ sudo iptables -A FORWARD -i enp0s8 -o enp0s3 -s 10.1.1.0/24 -j ACCEPT

Добавляем маскарадинг (подмена адерса источника)

$ sudo iptables -t nat -A POSTROUTING -o enp0s3 -s 10.1.1.0/24 -j MASQUERADE

Настройка сервера dhcpd1

Настройка сети с помощью netplan

$ sudo nano /etc/netplan/01-netcfg.yaml
network:
  ethernets:
    enp0s3:
      addresses: [10.1.1.2/24]
      nameservers:
        addresses: [1.0.0.1, 8.8.4.4]
      routes:
      - to: default
        via: 10.1.1.1
  version: 2
$ sudo netplan apply

Устанавливаем пакет isc-dhcp-server

$ sudo apt install isc-dhcp-server

Редактируем файлы конфигурации

$ sudo nano /etc/default/isc-dhcp-server
# на каком интерфейсе прослушивать запросы клиентов
INTERFACESv4="enp0s3"
INTERFACESv6=""
$ sudo nano /etc/dhcp/dhcpd.conf
# адреса DNS-серверов
option domain-name-servers 77.88.8.8,77.88.8.1;
# время аренды по умолчанию
default-lease-time 3600;
# максимальное время аренды
max-lease-time 7200;

# локальная сеть: адрес и маска
subnet 10.1.1.0 netmask 255.255.255.0 {
    # пул ip-адресов
    range 10.1.1.5 10.1.1.15;
    # маска подсети
    option subnet-mask 255.255.255.0;
    # ip-адрес шлюза
    option routers 10.1.1.1;
}

Перезагружаем службу для применения настроек

$ sudo systemctl restart isc-dhcp-server.service

Настройка компьютера pc1

Настройка сети виртуальной машины с помощью netplan

$ sudo nano /etc/netplan/01-netcfg.yaml
network:
  ethernets:
    enp0s3:
      dhcp4: true
      dhcp6: false
  version: 2
$ sudo netplan apply

Второй этап

Создаем и настраиваем виртуальные машины gateway2, dhcpd2 и pc2.

Настройка шлюза gateway2

Настройка сети с помощью netplan

$ sudo nano /etc/netplan/01-netcfg.yaml
network:
  ethernets:
    enp0s3:
      dhcp4: true
      dhcp4: false
    enp0s8:
      addresses: [10.2.2.1/24]
      nameservers:
        addresses: [1.0.0.1, 8.8.4.4]
  version: 2
$ sudo netplan apply

Разрешаем пересылку пакетов между интерфейсами

$ sudo nano /etc/sysctl.conf
net.ipv4.ip_forward=1
$ sudo sysctl -p
net.ipv4.ip_forward=1

Настраиваем netfilter с помощью iptables

$ sudo iptables -P FORWARD DROP  # сначала все запрещаем, потом разрешаем необходимое
$ sudo iptables -A FORWARD -i enp0s3 -o enp0s8 -d 10.2.2.0/24 -j ACCEPT
$ sudo iptables -A FORWARD -i enp0s8 -o enp0s3 -s 10.2.2.0/24 -j ACCEPT

Добавляем маскарадинг (подмена адреса источника)

$ sudo iptables -t nat -A POSTROUTING -o enp0s3 -s 10.2.2.0/24 -j MASQUERADE

Созданные правила пропадут при перезагрузке виртуальной машины. Так что их нужно сохранить и восстанавливать при перезагрузке.

$ sudo apt install iptables-persistent

Настройка сервера dhcpd2

Настройка сети с помощью netplan

$ sudo nano /etc/netplan/01-netcfg.yaml
network:
  ethernets:
    enp0s3:
      addresses: [10.2.2.2/24]
      nameservers:
        addresses: [1.0.0.1, 8.8.4.4]
      routes:
      - to: default
        via: 10.2.2.1
  version: 2
$ sudo netplan apply

Устанавливаем пакет isc-dhcp-server

$ sudo apt install isc-dhcp-server

Редактируем файлы конфигурации

$ sudo nano /etc/default/isc-dhcp-server
# на каком интерфейсе прослушивать запросы клиентов
INTERFACESv4="enp0s3"
INTERFACESv6=""
$ sudo nano /etc/dhcp/dhcpd.conf
# адреса DNS-серверов
option domain-name-servers 77.88.8.8,77.88.8.1;
# время аренды по умолчанию
default-lease-time 3600;
# максимальное время аренды
max-lease-time 7200;

# локальная сеть: адрес и маска
subnet 10.2.2.0 netmask 255.255.255.0 {
    # пул ip-адресов
    range 10.2.2.5 10.2.2.15;
    # маска подсети
    option subnet-mask 255.255.255.0;
    # ip-адрес шлюза
    option routers 10.2.2.1;
}

Перезагружаем службу для применения настроек

$ sudo systemctl restart isc-dhcp-server.service

Настройка компьютера pc2

Настройка сети виртуальной машины с помощью netplan

$ sudo nano /etc/netplan/01-netcfg.yaml
network:
  ethernets:
    enp0s3:
      dhcp4: true
      dhcp6: false
  version: 2
$ sudo netplan apply

Третий этап

Создаем виртуальные машины bridge1 и pc3. Сетевые интерфейсы enp0s3 и enp0s8 виртуальной машины bridge1 нужно переключить в неразборчивый режим (promiscuous mode), чтобы принимать весь ethernet-трафик. Эти интерфейсы будут входить в сетевой мост — вместо двух маленьких сетей net1 и net3 получим одну большую сеть (широковещательный домен). И виртуальная машина pc3 получит сетевые настройки от dhcpd1.

Неразборчивый режим для сетевых интерфейсов необходимо еще включить на уровне VirtualBox — иначе сетевой мост работать не будет. Мне этот момент не очень понятен — получается, что включение promiscuous mode внутри виртуальной машины не влияет на promiscuous mode на уровне VirtualBox. Хотя внутри виртуальной машины работает команда tcpdump, которая тоже переводит интерфейс в неразборчивый режим — но без участия VirtualBox.

Настройка моста bridge1

Настройка сети с помощью netplan

$ sudo nano /etc/netplan/01-netcfg.yaml
network:
  ethernets:
    enp0s3:
      dhcp4: false
      dhcp6: flase
    enp0s8:
      dhcp4: false
      dhcp6: flase
    enp0s9:
      dhcp4: false
      dhcp6: flase
  version: 2
$ sudo netplan apply

Включаем неразборчивый режим

$ sudo ip link set enp0s3 promisc on
$ sudo ip link set enp0s8 promisc on

Создаем сетевой мост br13

$ sudo ip link add name br13 type bridge

Добавляем интерфейсы в мост

$ sudo ip link set enp0s3 master br13
$ sudo ip link set ens0s8 master br13

Удалить интерфейсы из моста и удалить сам мост можно с помощью следующих команд

$ sudo ip link set enp0s3 nomaster
$ sudo ip link set enp0s8 nomaster
$ sudo ip link del br13 type bridge

Посмотрим, что получилось в итоге

$ bridge link
2: enp0s3: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 master br13 state forwarding priority 32 cost 4
3: enp0s8: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 master br13 state forwarding priority 32 cost 4

Сейчас мост в состоянии DOWN, переключим его в состояние UP

$ sudo ip link set dev br13 up
Чтобы было понятно, откуда такое имя моста — br означает bridge, число 1 означает net1, число 3 означает net3.

Настройка компьютера pc3

Настройка сети с помощью netplan

$ sudo nano /etc/netplan/01-netcfg.yaml
network:
  ethernets:
    enp0s3:
      dhcp4: true
      dhcp6: false
  version: 2
$ sudo netplan apply

Четвертый этап

Создаем виртуальные машины bridge2 и pc5. Сетевые интерфейсы enp0s3 и enp0s8 виртуальной машины bridge2 нужно переключить в неразборчивый режим (promiscuous mode), чтобы принимать весь ethernet-трафик. Эти интерфейсы будут входить в сетевой мост — наша большая сеть станет еще больше. И виртуальная машина pc5 получит сетевые настройки от dhcpd1.

Неразборчивый режим для сетевых интерфейсов необходимо еще включить на уровне VirtualBox — иначе сетевой мост работать не будет.

Настройка моста bridge2

Настройка сети с помощью netplan

$ sudo nano /etc/netplan/01-netcfg.yaml
network:
  ethernets:
    enp0s3:
      dhcp4: false
      dhcp6: false
    enp0s8:
      dhcp4: false
      dhcp6: false
    enp0s9:
      dhcp4: false
      dhcp6: false
  version: 2
$ sudo netplan apply

Включаем неразборчивый режим

$ sudo ip link set enp0s3 promisc on
$ sudo ip link set enp0s8 promisc on

Создаем сетевой мост br35

$ sudo ip link add name br35 type bridge

Добавляем интерфейсы в мост

$ sudo ip link set enp0s3 master br35
$ sudo ip link set ens0s8 master br35

Удалить интерфейсы из моста и удалить сам мост можно с помощью следующих команд

$ sudo ip link set enp0s3 nomaster
$ sudo ip link set enp0s8 nomaster
$ sudo ip link del br35 type bridge

Посмотрим, что получилось в итоге

$ bridge link
2: enp0s3: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 master br35 state forwarding priority 32 cost 4
3: enp0s8: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 master br35 state forwarding priority 32 cost 4

Сейчас мост в состоянии DOWN, переключим его в состояние UP

$ sudo ip link set dev br35 up
Чтобы было понятно, откуда такое имя моста — br означает bridge, число 3 означает net3, число 5 означает net5.

Настройка компьютера pc5

Настройка сети с помощью netplan

$ sudo nano /etc/netplan/01-netcfg.yaml
network:
  ethernets:
    enp0s3:
      dhcp4: true
      dhcp6: false
  version: 2
$ sudo netplan apply

Пятый этап

Между bridg1 и bridge2 есть только один канал связи. Но у нас две локальные сети, в первую входят pc1, pc3, pc5, во вторую должны входить pc2 и pc4. Как присоединить pc4 ко второй локальной сети, используя один канал связи?

Между bridg1 и bridge2 все ethernet-кадры будут помечены специальным тегом. Кадры, которые относятся к первой локальной сети — будут помечены тегом с идентифкатором 11. Кадры, которые относятся ко второй локальной сети — будут помечены тегом с идентифкатором 22.

На виртуальной машине bridge1

  • физический интерфейс enp0s8 получает тегированные ethernet-кадры с идентификаторами 11 и 22
  • виртуальный интерфейс vlan11@enp0s8 получает ethernet-кадры с удаленным тегом (которые в enp0s8 были с тегом 11)
  • виртуальный интерфейс vlan22@enp0s8 получает ethernet-кадры с удаленным тегом (которые в enp0s8 были с тегом 22)
  • физический интерфейс enp0s3 и виртуальный интерфейс vlan11@enp0s8 входят в сетевой мост br1v11
  • физический интерфейс enp0s9 и виртуальный интерфейс vlan22@enp0s8 входят в сетевой мост br2v22
  • enp0s3 передает полученные извне кадры в vlan11@enp0s8, оттуда они попадат в enp0s8 — уже с тегом 11
  • enp0s9 передает полученные извне кадры в vlan22@enp0s8, оттуда они попадат в enp0s8 — уже с тегом 22

На виртуальной машине bridge2

  • физический интерфейс enp0s3 получает тегированные ethernet-кадры с идентификаторами 11 и 22
  • виртуальный интерфейс vlan11@enp0s3 получает ethernet-кадры с удаленным тегом (которые в enp0s3 были с тегом 11)
  • виртуальный интерфейс vlan22@enp0s3 получает ethernet-кадры с удаленным тегом (которые в enp0s3 были с тегом 22)
  • физический интерфейс enp0s8 и виртуальный интерфейс vlan11@enp0s3 входят в сетевой мост br5v11
  • физический интерфейс enp0s9 и виртуальный интерфейс vlan22@enp0s3 входят в сетевой мост br4v22
  • enp0s8 передает полученные извне кадры в vlan11@enp0s3, оттуда они попадат в enp0s3 — уже с тегом 11
  • enp0s9 передает полученные извне кадры в vlan22@enp0s3, оттуда они попадат в enp0s3 — уже с тегом 22

На виртуальной машине bridge1

Создаем интерфейс vlan11 типа vlan, который будет составной частью интерфейса enp0s8.

$ sudo ip link add link enp0s8 name vlan11 type vlan id 11

Сетевые интерфейсы vlan11@enp0s8 и enp0s3 будут входить в состав сетевого моста br1v11.

$ sudo ip link add name br1v11 type bridge
$ sudo ip link set vlan11 master br1v11
$ sudo ip link set enp0s3 master br1v11

Создаем интерфейс vlan22 типа vlan, который будет составной частью интерфейса enp0s8.

$ sudo ip link add link enp0s8 name vlan22 type vlan id 22

Сетевые интерфейсы vlan11@enp0s8 и enp0s9 будут входить в состав сетевого моста br2v22.

$ sudo ip link add name br2v22 type bridge
$ sudo ip link set vlan22 master br2v22
$ sudo ip link set enp0s9 master br2v22

Включаем неразборчивый режим для enp0s9

$ sudo ip link set enp0s9 promisc on

Изменяем состояние интерфейсов с DOWN на UP

$ sudo ip link set dev vlan11 up
$ sudo ip link set dev vlan22 up
$ sudo ip link set dev br1v11 up
$ sudo ip link set dev br2v22 up

На виртуальной машине bridge2

Создаем интерфейс vlan11 типа vlan, который будет составной частью интерфейса enp0s3.

$ sudo ip link add link enp0s3 name vlan11 type vlan id 11

Сетевые интерфейсы vlan11@enp0s3 и enp0s8 будут входить в состав сетевого моста br5v11.

$ sudo ip link add name br5v11 type bridge
$ sudo ip link set vlan11 master br5v11
$ sudo ip link set enp0s8 master br5v11

Создаем интерфейс vlan22 типа vlan, который будет составной частью интерфейса enp0s3.

$ sudo ip link add link enp0s3 name vlan22 type vlan id 22

Сетевые интерфейсы vlan11@enp0s3 и enp0s9 будут входить в состав сетевого моста br4v22.

$ sudo ip link add name br4v22 type bridge
$ sudo ip link set vlan22 master br4v22
$ sudo ip link set enp0s9 master br4v22

Включаем неразборчивый режим для enp0s9

$ sudo ip link set enp0s9 promisc on

Изменяем состояние интерфейсов с DOWN на UP

$ sudo ip link set dev vlan11 up
$ sudo ip link set dev vlan22 up
$ sudo ip link set dev br2v11 up
$ sudo ip link set dev br4v22 up

Шестой этап

Непонятная ситуация с виртуальной машиной pc3 — она получает тегированный трафик из двух виртуальных сетей, но правильно работать с ним не умеет. Самый простой вариант — подключить ее к внутренней сети VirtualBox net1 или net5 вместо net3. Но можем научить pc3 работать с тегированным трафиком и сделать из нее маршрутизатор.

Создаем интерфейсы vlan11 и vlan22, которые будет составной частью интерфейса enp0s3. Вместо выполнения команд будем редактировать файл конфигурации сети.

$ sudo nano /etc/netplan/01-netcfg.yaml
network:
  ethernets:
    enp0s3:
      dhcp4: false
      dhcp6: false
  vlans:
    vlan11:
      id: 11
      link: enp0s3
      dhcp4: true
      dhcp6: false
    vlan22:
      id: 22
      link: enp0s3
      dhcp4: true
      dhcp6: false
  version: 2
$ sudo netplan apply

Проверим, что получилось в итоге

$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:57:b9:8b brd ff:ff:ff:ff:ff:ff
    inet6 fe80::a00:27ff:fe57:b98b/64 scope link 
       valid_lft forever preferred_lft forever
3: vlan11@enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 08:00:27:57:b9:8b brd ff:ff:ff:ff:ff:ff
    inet 10.1.1.11/24 metric 100 brd 10.1.1.255 scope global dynamic vlan11
       valid_lft 3254sec preferred_lft 3254sec
    inet6 fe80::a00:27ff:fe57:b98b/64 scope link 
       valid_lft forever preferred_lft forever
4: vlan22@enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 08:00:27:57:b9:8b brd ff:ff:ff:ff:ff:ff
    inet 10.2.2.6/24 metric 100 brd 10.2.2.255 scope global dynamic vlan22
       valid_lft 3254sec preferred_lft 3254sec
    inet6 fe80::a00:27ff:fe57:b98b/64 scope link 
       valid_lft forever preferred_lft forever

Интерфейс vlan11@enp0s3 получил сетевые настройки от dhcp-сервера dhcpd1, интерфейс vlan22@enp0s3 получил сетевые настройки от dhcp-сервера dhcpd2. А вот с маршрутами беда — есть два default, по одному от каждого dhcp-сервера.

$ ip route
default via 10.1.1.1 dev vlan11 proto dhcp src 10.1.1.11 metric 100 
default via 10.2.2.1 dev vlan22 proto dhcp src 10.2.2.6 metric 100 
10.1.1.0/24 dev vlan11 proto kernel scope link src 10.1.1.11 metric 100 
10.1.1.1 dev vlan11 proto dhcp scope link src 10.1.1.11 metric 100 
10.2.2.0/24 dev vlan22 proto kernel scope link src 10.2.2.6 metric 100 
10.2.2.1 dev vlan22 proto dhcp scope link src 10.2.2.6 metric 100 
77.88.8.1 via 10.1.1.1 dev vlan11 proto dhcp src 10.1.1.11 metric 100 
77.88.8.1 via 10.2.2.1 dev vlan22 proto dhcp src 10.2.2.6 metric 100 
77.88.8.8 via 10.1.1.1 dev vlan11 proto dhcp src 10.1.1.11 metric 100 
77.88.8.8 via 10.2.2.1 dev vlan22 proto dhcp src 10.2.2.6 metric 100 

Если мы делаем маршрутизатор — он не должен получать случайный ip-адрес от dhcp-сервера

$ sudo nano /etc/netplan/01-netcfg.yaml
network:
  ethernets:
    enp0s3:
      dhcp4: false
      dhcp6: false
  vlans:
    vlan11:
      id: 11
      link: enp0s3
      dhcp4: false
      addresses: [10.1.1.3/24]
      routes:
      - to: default
        via: 10.1.1.1
        metric: 50
      nameservers:
        addresses: [77.88.8.8, 77.88.8.1]
      dhcp6: false
    vlan22:
      id: 22
      link: enp0s3
      dhcp4: false
      addresses: [10.2.2.3/24]
      routes:
      - to: default
        via: 10.2.2.1
        metric: 100
      nameservers:
        addresses: [77.88.8.8, 77.88.8.1]
      dhcp6: false
  version: 2
$ sudo netplan apply

Проверим, что получилось в итоге

$ ip route
default via 10.1.1.1 dev vlan11 proto static metric 50 
default via 10.2.2.1 dev vlan22 proto static metric 100 
10.1.1.0/24 dev vlan11 proto kernel scope link src 10.1.1.3 
10.2.2.0/24 dev vlan22 proto kernel scope link src 10.2.2.3 
Хотя маршрутов по умолчанию два, но у них разные метрики — для выхода в интернет будет использован маршрут с меньшей метрикой. Было бы правильно использовать в данной ситуации policy based routing. Сейчас возможна ситуация, что при получении пакетов на интерфейс vlan22@enp0s3 — виртуальная машина router будет отправлять ответ через vlan11@enp0s3 — если маршрут до ip-адреса отправителя неизвестен. Policy based routing позволяет отправлять ответ через тот же интерфейс, с которого были получены пакеты.

Разрешаем пересылку пакетов между интерфейсами

$ sudo nano /etc/sysctl.conf
net.ipv4.ip_forward=1
$ sudo sysctl -p
net.ipv4.ip_forward=1

Настраиваем netfilter с помощью iptables

$ sudo iptables -P FORWARD DROP  # сначала все запрещаем, потом разрешаем необходимое
$ sudo iptables -A FORWARD -i vlan11 -o vlan22 -s 10.1.1.0/24 -d 10.2.2.0/24 -j ACCEPT
$ sudo iptables -A FORWARD -i vlan22 -o vlan11 -s 10.2.2.0/24 -d 10.1.1.0/24 -j ACCEPT

Созданные правила пропадут при перезагрузке виртуальной машины. Так что их нужно сохранить и восстанавливать при перезагрузке.

$ sudo apt install iptables-persistent

Всем компьютерам первой сети 10.1.1.0/24 нужно добавить маршрут до второй сети 10.2.2.0/24. Всем компьютерам второй сети 10.2.2.0/24 нужно добавить маршрут до первой сети 10.1.1.0/24. Для этого отредактируем файлы конфигурации dhcp-серверов.

Файл конфигурации dhcp-сервера на виртуальной машине dhcpd1

$ sudo nano /etc/dhcp/dhcpd.conf
# адреса DNS-серверов
option domain-name-servers 77.88.8.8,77.88.8.1;
# время аренды по умолчанию
default-lease-time 3600;
# максимальное время аренды
max-lease-time 7200;

# для добавления статических маршрутов
option classless-static-routes code 121 = array of unsigned integer 8;

# Локальная сеть: адрес и маска
subnet 10.1.1.0 netmask 255.255.255.0 {
    # пул ip-адресов
    range 10.1.1.5 10.1.1.15;
    # маска подсети
    option subnet-mask 255.255.255.0;
    # ip-адрес шлюза
    option routers 10.1.1.1;
    # маршрут до 10.2.2.0/24 через 10.2.2.3 + маршрут по умолчанию;
    # согласно RFC3442 опция 3 (маршрут по умолчанию) игнорируется
    # при наличии DHCP-опции 121 (статические маршруты), поэтому
    # кроме маршрута к сети 10.2.2.0/24 добавляем default маршрут
    option classless-static-routes 24, 10,2,2, 10,2,2,3, 0, 10,1,1,1;
}
$ sudo systemctl restart isc-dhcp-server.service

Файл конфигурации dhcp-сервера на виртуальной машине dhcpd2

$ sudo nano /etc/dhcp/dhcpd.conf
# адреса DNS-серверов
option domain-name-servers 77.88.8.8,77.88.8.1;
# время аренды по умолчанию
default-lease-time 3600;
# максимальное время аренды
max-lease-time 7200;

# для добавления статических маршрутов
option classless-static-routes code 121 = array of unsigned integer 8;

# Локальная сеть: адрес и маска
subnet 10.2.2.0 netmask 255.255.255.0 {
    # пул ip-адресов
    range 10.2.2.5 10.2.2.15;
    # маска подсети
    option subnet-mask 255.255.255.0;
    # ip-адрес шлюза
    option routers 10.2.2.1;
    # маршрут до 10.1.1.0/24 через 10.1.1.3 + маршрут по умолчанию;
    # согласно RFC3442 опция 3 (маршрут по умолчанию) игнорируется
    # при наличии DHCP-опции 121 (статические маршруты), поэтому
    # кроме маршрута к сети 10.1.1.0/24 добавляем default маршрут
    option classless-static-routes 24, 10,1,1, 10,1,1,3, 0, 10,2,2,1;
}
$ sudo systemctl restart isc-dhcp-server.service

Заключительный этап

После перезагрузки виртуальных машин bridge1 и bridge2 нужно заново создавать мосты и переключать интерфейсы в неразборчивый режим. Так что редактируем файл конфигурации сети и создаем службу — все будет происходить автоматически при загрузке системы. Давайте сделаем это для bridge1 — для bridge2 все будет аналогично.

Создаем службу для переключения интерфейсов в неразборчивый режим

$ sudo nano /etc/systemd/system/promisc@.service
[Unit]
Description=Set %i interface in promiscuous mode
After=network.target

[Service]
Type=oneshot
ExecStart=/usr/bin/ip link set dev %i promisc on
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

Сообщаем системе о создании новой службы

$ sudo systemctl daemon-reload

Добавляем созданные службы в автозагрузку

$ sudo systemctl enable promisc@enp0s3.service
$ sudo systemctl enable promisc@enp0s8.service
$ sudo systemctl enable promisc@enp0s9.service

Настройка сетевых мостов и vlan с помощью netplan

$ sudo nano /etc/netplan/01-netcfg.yaml
# для виртуальной машины bridge1
network:
  ethernets:
    enp0s3:
      dhcp4: false
      dhcp6: false
    enp0s8:
      dhcp4: false
      dhcp6: false
    enp0s9:
      dhcp4: false
      dhcp6: false
  vlans:
    vlan11:
      id: 11
      link: enp0s8
      dhcp4: false
      dhcp6: false
    vlan22:
      id: 22
      link: enp0s8
      dhcp4: false
      dhcp6: false
  bridges:
    br1v11:
      interfaces: [enp0s3, vlan11]
      dhcp4: false
      dhcp6: false
    br2v22:
      interfaces: [enp0s9, vlan22]
      dhcp4: false
      dhcp6: false
  version: 2
$ sudo netplan apply

Смотрим, что получилось в итоге

$ ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp0s3: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc fq_codel master br1v11 state UP mode DEFAULT group default qlen 1000
    link/ether 08:00:27:1d:7b:bc brd ff:ff:ff:ff:ff:ff
3: enp0s8: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
    link/ether 08:00:27:7b:0f:fb brd ff:ff:ff:ff:ff:ff
4: enp0s9: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc fq_codel master br2v22 state UP mode DEFAULT group default qlen 1000
    link/ether 08:00:27:61:1c:41 brd ff:ff:ff:ff:ff:ff
5: br1v11: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/ether ce:f6:6d:43:0e:62 brd ff:ff:ff:ff:ff:ff
6: br2v22: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/ether e6:6e:df:f6:3b:18 brd ff:ff:ff:ff:ff:ff
7: vlan11@enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br1v11 state UP mode DEFAULT group default qlen 1000
    link/ether 08:00:27:7b:0f:fb brd ff:ff:ff:ff:ff:ff
8: vlan22@enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br2v22 state UP mode DEFAULT group default qlen 1000
    link/ether 08:00:27:7b:0f:fb brd ff:ff:ff:ff:ff:ff
$ bridge link
2: enp0s3: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 master br1v11 state forwarding priority 32 cost 4
4: enp0s9: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 master br2v22 state forwarding priority 32 cost 4
7: vlan11@enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master br1v11 state forwarding priority 32 cost 4
8: vlan22@enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master br2v22 state forwarding priority 32 cost 4

Для виртуальной машины bridge2 все будет аналогично, так что не буду повторять — только файл конфигурации netplan.

# для виртуальной машины bridge2
network:
  ethernets:
    enp0s3:
      dhcp4: false
      dhcp6: false
    enp0s8:
      dhcp4: false
      dhcp6: false
    enp0s9:
      dhcp4: false
      dhcp6: false
  vlans:
    vlan11:
      id: 11
      link: enp0s3
      dhcp4: false
      dhcp6: false
    vlan22:
      id: 22
      link: enp0s3
      dhcp4: false
      dhcp6: false
  bridges:
    br5v11:
      interfaces: [enp0s8, vlan11]
      dhcp4: false
      dhcp6: false
    br4v22:
      interfaces: [enp0s9, vlan22]
      dhcp4: false
      dhcp6: false
  version: 2

Поиск: Linux • Ubuntu • Конфигурация • Локальная сеть • Bridge • Мост • VLAN

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.