1 Problemă
Scopul meu este ca tot traficul LAN să fie direcționat printr-o mașină virtuală (VM) care acționează ca router și firewall. Alte VM de pe același hypervisor ar trebui să fie, de asemenea, direcționate prin firewall-ul VM. Vezi următoarele schiță de rețea. Gazdele fizice conectate la podul trunk se pot ping reciproc cu succes, dar VM-urile nu au putut fi încă contactate.
2 Detalii
Configurarea rețelei pe hypervisor:
# =======
# Poduri
# =======
# ---------------------
# VLAN bridge br-vlan-3
# ---------------------
link ip adăugați nume br-vlan-3 tip pod
ip addr add 10.66.3.11/24 dev br-vlan-3
IP link set dev br-vlan-3 up
# ---------------------
# Trunk bridge Upstream
# ---------------------
link ip adăugare nume br-trunk-up tip punte vlan_filtering 1 vlan_default_pvid 0
IP link set br-trunk-up up
# ---------------
# Trunk bridge VM
# ---------------
link ip adăugați nume br-trunk-vm tip pod vlan_filtering 1 vlan_default_pvid 0
legătura ip setată br-trunk-vm sus
# =====
# Gazde
# =====
# Configurați dispozitivele fizice
link-ul ip a setat enp5s0
link-ul ip a setat enp9s0f0
link-ul ip a setat enp9s0f1
link-ul ip a setat enp9s0f2
link-ul ip a setat enp9s0f3
# ----------------------
# desktop.3 br-vlan-3
# ----------------------
link ip adăugați link enp9s0f1 nume enp9s0f1.3 tip vlan id 3
set link ip dev enp9s0f1.3 master br-vlan-3
legătura ip setată enp9s0f1.3 sus
# --------------------------
# desktop.100 br-trunk-vm
# --------------------------
link ip adăugați link enp9s0f1 nume enp9s0f1.100 tip vlan id 100
set de legături ip enp9s0f1.100 master br-trunk-vm
link ip 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
Harta rețelei
=======
DESKTOP
=======
localhost:utilizator ~ $ ip a
2: enp34s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP grup implicit 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 stare UP grup implicit 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 pentru totdeauna preferred_lft pentru totdeauna
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 de cadre primite 0
total de octeți primiți 0
Broadcast/Multicast Rcvd 0
total de cadre transmise 287
total de octeți transmiși 53964
Dispozitiv: enp34s0
Mapări prioritare INGRESS: 0:0 1:0 2:0 3:0 4:0 5:0 6:0 7:0
Mapări prioritare EGRESS:
==========
HIPERVIZITOR
==========
numele podului ID pod Interfețe activate STP
br-vlan-100 8000.1ab13643f0e4 nu enp.100
[root@fedora system]# ip a
4: enp9s0f1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq stare UP grup implicit 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 stare UP grup implicit 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
numele podului ID pod Interfețe activate STP
br-trunk-vm 8000.567e226a232d nu enp9s0f1.100
fw.100
fw.103
fw.3
================
MAȘINĂ VIRTUALĂ
================
[root@fedora system]# bridge vlan show
port vlan-id
br-trunk-vm 100
enp9s0f1.100 100
virbr0 1 Ieșire PVID Neetichetat
fw.100 100 PVID Ieșire Neetichetat
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 pentru totdeauna preferred_lft pentru totdeauna
Configurarea rețelei XML Libvirt a mașinii virtuale 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 încercări
Am încercat să configurez atât un NIC etichetat, cât și cel neetichetat pe VM-ul firewall. Pentru NIC-ul etichetat am creat o punte VLAN pe VM-ul firewall și am creat un dispozitiv de atingere virtuală din robinetul virtual fw.100 cu VLAN 100: vlan100@fw.100. Apoi am setat portul portbagajului vlan100@fw.100 a stăpânii: bridge vlan add vid 100 dev vlan100@fw.100 master. Pentru abordarea NIC neetichetat, nu am configurat niciun VLAN pe VM-ul firewall și am setat portul trunk la PVID 100 neetichetat bridge vlan add vid 100 dev fw.100 pvid 100 neetichetat. În ambele cazuri, nu am putut face ping între gazda desktop și VM-ul firewall.
Această problemă se întâmplă numai cu mașina virtuală libvirt KVM/QEMU. Două gazde fizice etichetate VLAN conectate la podul trunk al hipervizorului, deoarece masterul poate ping reciproc.
4 Actualizare
Se pare că libvirt nu acceptă poduri Linux cu VLAN-uri. Conform articolului următor, VLAN-ul VM nu mai funcționează dacă există un al doilea dispozitiv virtual pe hypervisor cu același VLAN: https://alesnosek.com/blog/2015/09/07/bridging-vlan-trunk-to-the-guest/
Alternativ, openvswitch poate fi utilizat, dar utilizarea unei punți pentru fiecare VM și gazdă fizică este o abordare mai bună. Hypervisorul permite apoi redirecționarea punților VM-urilor și gazdelor către puntea VM-ului firewall, iar rutarea rămasă se face apoi în interiorul VM-ului firewall-ului.