1 problema
Mi objetivo es que todo el tráfico LAN se enrute a través de una máquina virtual (VM) que actúa como enrutador y firewall. Otras máquinas virtuales en el mismo hipervisor también deben enrutarse a través de la máquina virtual del firewall. Ver lo siguienteboceto de red. Los hosts físicos conectados al puente troncal pueden hacer ping entre sí con éxito, pero aún no se pudo contactar con las máquinas virtuales.
2 Detalles
Configuración de red en el hipervisor:
# =======
# Bridges
# =======
# ---------------------
# VLAN bridge br-vlan-3
# ---------------------
ip link add name br-vlan-3 type bridge
ip addr add 10.66.3.11/24 dev br-vlan-3
ip link set dev br-vlan-3 up
# ---------------------
# Trunk bridge Upstream
# ---------------------
ip link add name br-trunk-up type bridge vlan_filtering 1 vlan_default_pvid 0
ip link set br-trunk-up up
# ---------------
# Trunk bridge VM
# ---------------
ip link add name br-trunk-vm type bridge vlan_filtering 1 vlan_default_pvid 0
ip link set br-trunk-vm up
# =====
# Hosts
# =====
# Set physical devices up
ip link set enp5s0 up
ip link set enp9s0f0 up
ip link set enp9s0f1 up
ip link set enp9s0f2 up
ip link set enp9s0f3 up
# ----------------------
# desktop.3 br-vlan-3
# ----------------------
ip link add link enp9s0f1 name enp9s0f1.3 type vlan id 3
ip link set dev enp9s0f1.3 master br-vlan-3
ip link set enp9s0f1.3 up
# --------------------------
# desktop.100 br-trunk-vm
# --------------------------
ip link add link enp9s0f1 name enp9s0f1.100 type vlan id 100
ip link set enp9s0f1.100 master br-trunk-vm
ip link set enp9s0f1.100 up
bridge vlan add vid 100 dev enp9s0f1.100 master
bridge vlan add vid 100 dev br-trunk-vm self
bridge vlan add vid 100 dev fw.100 pvid 100
Mapa de red
=======
DESKTOP
=======
localhost:user ~ $ ip a
2: enp34s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 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
link/ether 1a:b1:36:43:f0:e4 brd ff:ff:ff:ff:ff:ff
inet 10.66.100.44/24 scope global br-vlan-100
valid_lft forever preferred_lft forever
7: enp.100@enp34s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-vlan-100 state UP group default qlen 1000
link/ether 00:d8:61:c4:b1:af brd ff:ff:ff:ff:ff:ff
localhost:~ # cat /proc/net/vlan/enp.100
enp.100 VID: 100 REORDER_HDR: 1 dev->priv_flags: 1221
total frames received 0
total bytes received 0
Broadcast/Multicast Rcvd 0
total frames transmitted 287
total bytes transmitted 53964
Device: enp34s0
INGRESS priority mappings: 0:0 1:0 2:0 3:0 4:0 5:0 6:0 7:0
EGRESS priority mappings:
==========
HYPERVISOR
==========
bridge name bridge id STP enabled interfaces
br-vlan-100 8000.1ab13643f0e4 no enp.100
[root@fedora system]# ip a
4: enp9s0f1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 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
link/ether 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
link/ether 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 state UNKNOWN group default qlen 1000
link/ether fe:54:00:3e:97:72 brd ff:ff:ff:ff:ff:ff
[root@fedora system]# brctl show dev br-trunk-vm
bridge name bridge id STP enabled interfaces
br-trunk-vm 8000.567e226a232d no enp9s0f1.100
fw.100
fw.103
fw.3
===============
VIRTUAL MACHINE
===============
[root@fedora system]# bridge vlan show
port vlan-id
br-trunk-vm 100
enp9s0f1.100 100
virbr0 1 PVID Egress Untagged
fw.100 100 PVID Egress Untagged
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 52:54:00:3e:97:72 brd ff:ff:ff:ff:ff:ff
inet 10.66.100.10/24 scope global enp1s0
valid_lft forever preferred_lft forever
Configuración de red Libvirt XML de la VM del firewall:
<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 intentos
Intenté configurar una NIC etiquetada y sin etiquetar en la máquina virtual del firewall. Para la NIC etiquetada, creé un puente VLAN en la máquina virtual del firewall y creé un dispositivo de derivación virtual a partir de la derivación virtual fw.100
con la VLAN 100: [email protected]
. Luego configuré el puerto troncal de [email protected]
en maestro: . Para el enfoque de NIC sin etiqueta, no configuré ninguna VLAN en la máquina virtual del firewall y configuré su puerto troncal en PVID 100 sin etiquetar . En ambos casos no pude hacer ping entre el host de escritorio y la máquina virtual del firewall.bridge vlan add vid 100 dev [email protected] master
bridge vlan add vid 100 dev fw.100 pvid 100 untagged
Este problema ocurre sólo con la máquina virtual libvirt KVM/QEMU. Dos hosts físicos etiquetados con VLAN conectados al puente troncal del hipervisor como maestro pueden hacer ping entre sí.
4 Actualización
Parece que libvirt no admite puentes de Linux con VLAN. Según el siguiente artículo, la VLAN de las máquinas virtuales deja de funcionar si hay un segundo dispositivo virtual en el hipervisor con la misma VLAN:https://alesnosek.com/blog/2015/09/07/bridging-vlan-trunk-to-the-guest/
Alternativamente, se puede usar openvswitch, pero usar un puente para cada VM y host físico es un mejor enfoque. Luego, el hipervisor permite reenviar los puentes de las máquinas virtuales y los hosts al puente de la máquina virtual del firewall y el enrutamiento restante se realiza dentro de la máquina virtual del firewall.