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: [email protected]
. Apoi am setat portul portbagajului [email protected]
a stăpânii: bridge vlan add vid 100 dev [email protected] 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.