1 проблема
Моя цель состоит в том, чтобы весь трафик локальной сети направлялся через виртуальную машину (ВМ), действующую как маршрутизатор и брандмауэр. Другие виртуальные машины на том же гипервизоре также должны проходить через виртуальную машину брандмауэра. См. следующее эскиз сети. Физические хосты, подключенные к транковому мосту, могут успешно пинговать друг друга, но виртуальные машины пока недоступны.
2 Детали
Конфигурация сети на гипервизоре:
# =======
# Мосты
# =======
# ---------------------
# Мост VLAN br-vlan-3
# ---------------------
ip link add name br-vlan-3 type bridge
IP-адрес добавить 10.66.3.11/24 dev br-vlan-3
ip link set dev br-vlan-3 up
# ---------------------
# Магистральный мост Восходящий поток
# ---------------------
ip link add name br-trunk-up type bridge vlan_filtering 1 vlan_default_pvid 0
ip link set br-trunk-up up
# ---------------
# Магистральный мост ВМ
# ---------------
ip link add name br-trunk-vm type bridge vlan_filtering 1 vlan_default_pvid 0
ip link set br-trunk-vm up
# =====
# Хосты
# =====
# Настроить физические устройства
ip link set enp5s0 up
ip link set enp9s0f0 up
ip link set enp9s0f1 up
ip link set enp9s0f2 вверх
ip link set enp9s0f3 вверх
# ----------------------
# рабочий стол.3 br-vlan-3
# ----------------------
ip ссылка добавить ссылку enp9s0f1 имя enp9s0f1.3 тип vlan id 3
ip link set dev enp9s0f1.3 master br-vlan-3
ip link set enp9s0f1.3 up
# -----------------------------------------
# рабочий стол.100 br-trunk-vm
# -----------------------------------------
ip ссылка добавить ссылку имя enp9s0f1 enp9s0f1.100 тип идентификатор vlan 100
набор IP-ссылок enp9s0f1.100 master br-trunk-vm
ip link set enp9s0f1.100 up
мост vlan добавить мастер vid 100 dev enp9s0f1.100
мост vlan добавить видео 100 dev br-trunk-vm self
мост vlan добавить vid 100 dev fw.100 pvid 100
Карта сети
=======
РАБОЧИЙ СТОЛ
=======
локальный хост: пользователь ~ $ ip a
2: enp34s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast состояние UP группа по умолчанию qlen 1000
ссылка/эфир 00:d8:61:c4:b1:af brd ff:ff:ff:ff:ff:ff
4: br-vlan-100: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
ссылка/эфир 1a:b1:36:43:f0:e4 brd ff:ff:ff:ff:ff:ff
инет 10.66.100.44/24 глобальный охват br-vlan-100
valid_lft навсегда
7: enp.100@enp34s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-vlan-100 состояние UP группа по умолчанию qlen 1000
ссылка/эфир 00:d8:61:c4:b1:af brd ff:ff:ff:ff:ff:ff
локальный хост:~ # cat /proc/net/vlan/enp.100
enp.100 VID: 100 REORDER_HDR: 1 dev->priv_flags: 1221
всего полученных кадров 0
Всего байтов получено 0
Широковещательный/многоадресный Rcvd 0
всего передано кадров 287
всего передано байтов 53964
Устройство: enp34s0
Сопоставления приоритетов ВХОДА: 0:0 1:0 2:0 3:0 4:0 5:0 6:0 7:0
Сопоставления приоритетов EGRESS:
==========
ГИПЕРВИЗОР
==========
имя моста идентификатор моста интерфейсы с поддержкой STP
br-vlan-100 8000.1ab13643f0e4 нет enp.100
[root@fedora system]# ip a
4: enp9s0f1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
ссылка/эфир a0:36:9f:5d:09:19 brd ff:ff:ff:ff:ff:ff
13: br-trunk-vm: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
ссылка/эфир 56:7e:22:6a:23:2d brd ff:ff:ff:ff:ff:ff
16: enp9s0f1.100@enp9s0f1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-trunk-vm state UP group default qlen 1000
ссылка/эфир a0:36:9f:5d:09:19 brd ff:ff:ff:ff:ff:ff
21: fw.100: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-trunk-vm состояние НЕИЗВЕСТНО группа по умолчанию qlen 1000
ссылка/эфир fe:54:00:3e:97:72 brd ff:ff:ff:ff:ff:ff
[root@fedora system]# brctl show dev br-trunk-vm
имя моста идентификатор моста интерфейсы с поддержкой STP
бр-транк-вм 8000.567e226a232d нет enp9s0f1.100
фв.100
фв.103
fw.3
===============
ВИРТУАЛЬНАЯ МАШИНА
===============
[root@fedora system]# bridge vlan show
порт vlan-id
бр-ствол-вм 100
enp9s0f1.100 100
virbr0 1 Выход PVID без тегов
fw.100 100 Выход PVID без тегов
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel состояние UP группа по умолчанию qlen 1000
ссылка/эфир 52:54:00:3e:97:72 брд ff:ff:ff:ff:ff:ff
инет 10.66.100.10/24 глобальная область охвата enp1s0
valid_lft навсегда
Сетевая конфигурация Libvirt XML виртуальной машины брандмауэра:
<interface type='bridge'>
<mac address='52:54:00:3e:97:72'/>
<source bridge='br-trunk-vm'/>
<target dev='fw.100'/>
<model type='virtio'/>
<address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
</interface>
3 попытки
Я попытался настроить как тегированный, так и нетегированный сетевой адаптер на виртуальной машине брандмауэра. Для помеченной сетевой карты я создал мост VLAN на виртуальной машине брандмауэра и создал виртуальное устройство отвода из виртуального отвода. фв.100
с VLAN 100: [email protected]
. Затем я установил магистральный порт [email protected]
освоить: мост vlan добавить видео 100 dev [email protected] master
. Для подхода с нетегированным сетевым адаптером я не настроил VLAN на виртуальной машине брандмауэра и установил для ее магистрального порта значение PVID 100 без тегов. bridge vlan add vid 100 dev fw.100 pvid 100 без тегов
. В обоих случаях мне не удалось пропинговать хост рабочего стола и виртуальную машину брандмауэра.
Эта проблема возникает только с виртуальной машиной libvirt KVM/QEMU. Два физических хоста с тегами VLAN, подключенные к магистральному мосту гипервизора в качестве главного, могут пинговать друг друга.
4 Обновление
Похоже, что libvirt не поддерживает мосты Linux с VLAN. Согласно следующей статье VLAN виртуальных машин перестает работать, если на гипервизоре есть второе виртуальное устройство с той же VLAN: https://alesnosek.com/blog/2015/09/07/bridging-vlan-trunk-to-the-guest/
В качестве альтернативы можно использовать openvswitch, но лучше использовать мост для каждой виртуальной машины и физического хоста. Затем гипервизор позволяет перенаправить мосты виртуальных машин и хостов на мост виртуальной машины брандмауэра, а оставшаяся маршрутизация затем выполняется внутри виртуальной машины брандмауэра.