Am configurat Linux VM folosind virsh/libvirt/kvm și am probleme cu rețeaua bridge.
Rețeaua NAT implicită de la libvirt funcționa bine, dar am nevoie de o punte către interfața publică.
Am eliminat rețeaua implicită folosind virsh și am schimbat setarea rețelei VM în virsh la:
<interface type='bridge'>
<mac address='02:00:00:c1:8f:95'/>
<source bridge='br0'/>
<model type='virtio'/>
<address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
</interface>
pe sistemul gazdă am configurat bridge:
# brctl arată br0
numele podului ID pod Interfețe activate STP
br0 8000.a0423f494574 da enp97s0f0
vnet0
# brctl showstp br0
br0
ID pod 8000.a0423f494574
rădăcină desemnată 8000.a0423f494574
Portul rădăcină 0 costul căii 0
varsta max 20,00 pod varsta max 20,00
Hello Time 2.00 bridge Hello Time 2.00
întârziere înainte 15.00 pod întârziere înainte 15.00
timp de îmbătrânire 300,00
salut timer 0.86 tcn timer 0.00
cronometru schimbare topologie 0,00 cronometru gc 240,41
steaguri
enp97s0f0 (1)
Port id 8001 redirecționare de stat
rădăcină desemnată 8000.a0423f494574 calea costă 100
punte desemnată 8000.a0423f494574 temporizator de vârstă mesaj 0,00
portul desemnat 8001 temporizator de întârziere înainte 0,00
cost desemnat 0 hold timer 0,00
steaguri
vnet0 (2)
Port id 8002 redirecționare de stat
rădăcină desemnată 8000.a0423f494574 calea costă 100
punte desemnată 8000.a0423f494574 temporizator de vârstă mesaj 0,00
portul desemnat 8002 temporizator de întârziere înainte 0,00
cost desemnat 0 hold timer 0,00
unde enp97s0f0 este un NIC public și vnet0 este un NIC virtual utilizat de libvirt.
Am configurat IP-uri și gateway-uri pe VM, dar nu am primit răspuns la ping-uri.
Am făcut tcpdump pe mașina gazdă în timpul ping-urilor de la VM la 1.1.1.1 cloudflare dns, atât pe vnet0, cât și pe br0. Iată rezultatele:
# tcpdump -i vnet0 -n gazdă VM.VM.VM.VM
a scăpat privs la tcpdump
tcpdump: ieșirea verbosă a fost suprimată, utilizați -v sau -vv pentru decodarea completă a protocolului
ascultare pe vnet0, tip link EN10MB (Ethernet), dimensiunea capturii 262144 octeți
15:13:50.863273 IP VM.VM.VM.VM > 1.1.1.1: Solicitare ecou ICMP, id 2016, secv. 80, lungime 64
15:13:51.887267 IP VM.VM.VM.VM > 1.1.1.1: Solicitare ecou ICMP, id 2016, secv. 81, lungime 64
15:13:52.911271 IP VM.VM.VM.VM > 1.1.1.1: Solicitare ecou ICMP, id 2016, secv. 82, lungime 64
15:13:53.935270 IP VM.VM.VM.VM > 1.1.1.1: Solicitare ecou ICMP, id 2016, secv. 83, lungime 64
# tcpdump -i br0 -n gazdă VM.VM.VM.VM
a scăpat privs la tcpdump
tcpdump: ieșirea verbosă a fost suprimată, utilizați -v sau -vv pentru decodarea completă a protocolului
ascultare pe br0, tip link EN10MB (Ethernet), dimensiunea capturii 262144 octeți
15:12:33.039228 IP VM.VM.VM.VM > 1.1.1.1: Solicitare ecou ICMP, id 2016, secv. 4, lungime 64
15:12:33.045522 IP 1.1.1.1 > VM.VM.VM.VM: răspuns ecou ICMP, id 2016, secv. 4, lungime 64
15:12:33.045532 IP 1.1.1.1 > VM.VM.VM.VM: răspuns ecou ICMP, id 2016, secv. 4, lungime 64
15:12:34.063111 IP VM.VM.VM.VM > 1.1.1.1: Solicitare ecou ICMP, id 2016, secv. 5, lungime 64
15:12:34.069501 IP 1.1.1.1 > VM.VM.VM.VM: răspuns ecou ICMP, id 2016, secv. 5, lungime 64
15:12:34.069510 IP 1.1.1.1 > VM.VM.VM.VM: răspuns ecou ICMP, id 2016, secv. 5, lungime 64
15:12:35.087281 IP VM.VM.VM.VM > 1.1.1.1: Solicitare ecou ICMP, id 2016, secv. 6, lungime 64
15:12:35.093640 IP 1.1.1.1 > VM.VM.VM.VM: răspuns ecou ICMP, id 2016, secv. 6, lungime 64
15:12:35.093649 IP 1.1.1.1 > VM.VM.VM.VM: răspuns ecou ICMP, id 2016, secv. 6, lungime 64
Așa că pot vedea, că VM trimite o cerere ping prin vnet0, bridge br0 redirecționează această solicitare către 1.1.1.1 și 1.1.1.1 trimite răspunsul înapoi către bridge. Apoi pachetul dispare și nu ajunge niciodată la interfața VM.
De aceea cred că această problemă este probabil conectată la un fel de filtrare de pachete pe gazdă, dar am verificat o grămadă de variabile și totul arată ok:
/proc/sys/net/ipv4/ip_forward: 1
/proc/sys/net/ipv4/conf/br0/forwarding: 1
/proc/sys/net/ipv4/conf/vnet0/forwarding: 1
/proc/sys/net/ipv4/conf/enp97s0f0/forwarding: 1
/proc/sys/net/bridge/bridge-nf-call-iptables: Nu există un astfel de fișier sau director
# iptables -L
INTRARE în lanț (politica ACCEPTĂ)
target prot opt sursă destinație
Lanț FORWARD (politica ACCEPT)
target prot opt sursă destinație
Ieșire în lanț (politica ACCEPT)
target prot opt sursă destinație
# ebtables -L
Masa pod: filtru
Lanț de punte: INPUT, intrări: 0, politică: ACCEPT
Lanț de punte: FORWARD, intrări: 0, politică: ACCEPT
Lanț de punte: OUTPUT, intrări: 0, politică: ACCEPT
# set de reguli liste nft
filtru de punte de masă {
lanț INPUT {
tip filtru cârlig intrare filtru prioritar; acceptarea politicii;
}
lanț FORWARD {
tip filtru cârlig înainte filtru prioritar; acceptarea politicii;
}
lanț OUTPUT {
tip filtru cârlig ieșire filtru prioritar; acceptarea politicii;
}
}
filtru ip tabel {
lanț INPUT {
tip filtru cârlig intrare filtru prioritar; acceptarea politicii;
}
lanț FORWARD {
tip filtru cârlig înainte filtru prioritar; acceptarea politicii;
}
lanț OUTPUT {
tip filtru cârlig ieșire filtru prioritar; acceptarea politicii;
}
}
[root@HOST ~] # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue stare UNKNOWN grup implicit 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 pentru totdeauna preferred_lft pentru totdeauna
inet6 ::1/128 scope host
valid_lft pentru totdeauna preferred_lft pentru totdeauna
2: enp97s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq master br0 state UP group default qlen 1000
link/ether a0:42:3f:49:45:74 brd ff:ff:ff:ff:ff:ff
3: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether a0:42:3f:49:45:74 brd ff:ff:ff:ff:ff:ff
inet xxx.xxx.xxx.xxx/24 scope global dynamic noprefixroute br0
valid_lft 71705sec preferred_lft 71705sec
inet6 fe80::6559:22b2:dccd:3b24/64 scope link noprefixroute
valid_lft pentru totdeauna preferred_lft pentru totdeauna
4: vnet0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master br0 state NECUNOSCUT grup implicit qlen 1000
link/ether fe:00:00:c1:8f:95 brd ff:ff:ff:ff:ff:ff
inet6 fe80::fc00:ff:fec1:8f95/64 scope link
valid_lft pentru totdeauna preferred_lft pentru totdeauna
[root@VM ~]# afișare adresă ip
1: lo: mtu 65536 qdisc noqueue stare UNKNOWN grup implicit 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 pentru totdeauna preferred_lft pentru totdeauna
inet6 ::1/128 scope host
valid_lft pentru totdeauna preferred_lft pentru totdeauna
2: enp1s0: mtu 1500 qdisc fq_codel stare UP grup implicit qlen 1000
link/ether 02:00:00:c1:8f:95 brd ff:ff:ff:ff:ff:ff
inet VM.VM.VM.VM/24 scope global enp1s0
valid_lft pentru totdeauna preferred_lft pentru totdeauna
[root@HOST ~]# link bridge
2: enp97s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master br0 state priority forwarding 32 cost 100
8: vnet0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master br0 state priority forwarding 32 cost 100
[root@HOST ~]# show fdb bridge
fc:bd:67:ff:ec:6a dev enp97s0f0 master br0
fc:bd:67:ff:ec:31 dev enp97s0f0 master br0
2c:dd:e9:0d:9d:31 dev enp97s0f0 master br0
fe:ed:de:ad:be:ef dev enp97s0f0 master br0
a0:42:3f:49:45:74 dev enp97s0f0 vlan 1 master br0 permanent
a0:42:3f:49:45:74 dev enp97s0f0 master br0 permanent
01:00:5e:00:00:01 dev enp97s0f0 autopermanent
33:33:00:00:00:01 dev enp97s0f0 autopermanent
01:00:5e:00:00:01 dev br0 autopermanent
33:33:00:00:00:01 dev br0 autopermanent
33:33:ff:cd:3b:24 dev br0 autopermanent
01:00:5e:00:00:6a dev br0 autopermanent
33:33:00:00:00:6a dev br0 autopermanent
02:00:00:c1:8f:95 dev vnet0 master br0
fe:00:00:c1:8f:95 dev vnet0 vlan 1 master br0 permanent
fe:00:00:c1:8f:95 dev vnet0 master br0 permanent
33:33:00:00:00:01 dev vnet0 auto permanent
01:00:5e:00:00:01 dev vnet0 autopermanent
33:33:ff:c1:8f:95 dev vnet0 autopermanent
[root@HOST ~]# show vlan bridge
port vlan-id
enp97s0f0 1 Ieșire PVID Neetichetat
vnet0 1 Ieșire PVID Neetichetat
Sistemul gazdă este Centos8 cu nucleul 5.13.12-1.el8.elrepo.x86_64.
Sistemul VM este instalat implicit Centos8.
EDITAȚI | ×:
Dacă configurez IP-uri de rețea privată pe gazda br0 și pe interfața VM enp1s0, atunci VM poate trimite ping la gazdă, iar gazda poate ping VM. Dar încă nu se poate ping nimic în afara rețelei locale.