Puncte:-1

Linia de comandă KVM nat

drapel wf
t09

Care este modalitatea corectă de a configura rețeaua NAT între KVM vm și gazdă?

KVM vm:

Niciun firewall instalat

$ sudo arp-scan -r 5 -t 1000 --interface=eth0 --localnet

10.0.2.2 52:55:0a:00:02:02 administrat local
10.0.2.3 52:55:0a:00:02:03 administrat local

$ ip r

implicit prin 10.0.2.2 dev eth0 proto dhcp metric 100
10.0.2.0/24 dev eth0 proto kernel scope link src 10.0.2.15 metric 100

ifconfig

eth0: inet 10.0.2.15 netmask 255.255.255.0 broacast 10.0.2.255
      eter 52:54:00:12:34:56
lo: inet 127.0.0.1 netmask 255.0.0.0
      inet6 ::1

Gazdă:

:~$ ip r

0.0.0.0/1 prin 10.211.1.10 dev tun0 
implicit prin 192.168.1.1 dev wlan0 proto dhcp metric 600 
10.21xxxxxxxx dev tun0 proto kernel scope link src 10.21xxxx 
xxxxxxxxxxxx dev wlan0 
128.0.0.0/1 prin 10.211.1.10 dev tun0 
192.168.1.0/24 dev wlan0 proto kernel scope link src 192.168.1.172 metric 600 
192.168.4.0/22 ​​dev eth0 proto kernel scope link src 192.168.4.8 metric 100 

:~$ ifconfig

 eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
    inet 10.0.2.3 netmask 255.0.0.0 difuzare 10.255.255.255
    inet6 fe80::76c8:79b4:88d4:7f5c prefixlen 64 scopeid 0x20<link>
    ether ec:8e:b5:71:33:6e txqueuelen 1000 (Ethernet)
    Pachete RX 1700 octeți 194730 (190,1 KiB)
    Erori RX 0 a scăzut 0 depășiri 0 cadru 0
    Pachete TX 2862 octeți 246108 (240,3 KiB)
    Erori TX 0 a scăzut 0 depășiri 0 purtător 0 coliziuni 0
    dispozitiv întrerupere 16 memorie 0xe1000000-e1020000  

 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
    inet 127.0.0.1 netmask 255.0.0.0
    inet6 ::1 prefixlen 128 scopeid 0x10<gazdă>
    loop txqueuelen 1000 (Loopback local)
    Pachete RX 13251 octeți 7933624 (7,5 MiB)
    Erori RX 0 a scăzut 0 depășiri 0 cadru 0
    Pachete TX 13251 octeți 7933624 (7,5 MiB)
    Erori TX 0 a scăzut 0 depășiri 0 purtător 0 coliziuni 0

tun0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST> mtu 1500
    inet 10.211.1.69 netmask 255.255.255.255 destinație 10.211.1.70
    inet6 fe80::a920:941c:ffa8:5579 prefixlen 64 scopeid 0x20<link>
    nespecificat 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 100 (UNSPEC)
    Pachete RX 4348 octeți 2242726 (2,1 MiB)
    Erori RX 0 a scăzut 0 depășiri 0 cadru 0
    Pachete TX 3823 octeți 404190 (394,7 KiB)
    Erori TX 0 a scăzut 0 depășiri 0 purtător 0 coliziuni 0

wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
    inet 192.168.1.172 netmask 255.255.255.0 difuzare 192.168.1.255
    inet6 fe80::651b:5014:7929:9ba3 prefixlen 64 scopeid 0x20<link>
    eter d8:55:a3:d5:d1:30 txqueuelen 1000 (Ethernet)
    Pachete RX 114455 octeți 117950099 (112,4 MiB)
    Erori RX 0 a scăzut 0 depășiri 0 cadru 0
    Pachete TX 67169 octeți 14855011 (14,1 MiB)
    Erori TX 0 a scăzut 0 depășiri 0 purtător 0 coliziuni 0 

~$ sudo arp-scan -r 5 -t 1000 --localnet

doar atarna......

Gazda nu poate ping 10.0.2.2

Nu este activat firewall

Încercat

$ sudo ip route add default prin 10.0.2.0
$ sudo ip route add default prin 10.0.2.2
$ sudo ip route add default prin 10.0.2.0/24

Poate funcționa NAT fără virsh?

NAT poate fi remediat numai din linia de comandă?

Actualizați:

$ sudo ip link add natbr0 tip bridge
$ sudo ip link set dev natbr0 up
$ sudo ip link set dev eth0 up
$ sudo ip link set dev eth0 master natbr0

care funcționează pentru a conecta eth0 slave la kvm - vm poate ping alte computere din rețea. dar nu gazda @Tom Yan răspuns combinat cu archlinux-Network_bridge a creat comenzile de mai sus care pot trimite ping la alte ip-uri de rețea

Așa că am încercat să schimb conexiunea bridge de lucru pentru a permite gazdei și kvm să vorbească.

Scop: gazdă$ ping kvm

$ sudo ip link add natbr0 tip bridge
$ sudo ip link set dev natbr0 up
$ sudo ip a add 10.0.2.1/24 dev natbr0
$ sudo kvm -m 3G -hdb /dev/sde -nic bridge,br=natbr0
kvm$ sudo ip link add natbr0 tip bridge
kvm$ sudo ip a add 10.0.2.2
kvm$ sudo ip link set dev natbr0 up
kvm poate face ping singur 

$ ping 10.0.2.2

PING 10.0.2.2 (10.0.2.2) 56(84) octeți de date
64 de octeți din 10.0.2.2: icmp_seq=1 ttl=64 time=0,027 ms

dar kvm$ping 10.0.2.1

Destinatie finala negasita

gazdă$ ping 10.0.2.2

(doar se blocheaza)

Preferați linia de comandă pentru a testa rezistența procesului/sistemului față de o mulțime de scripturi care pot prezenta mai multă vulnerabilitate la eșec. - linia de comandă funcționează sau nu și erorile sunt mai ușor de urmărit, izolat și reproductibil. În funcție de aroma linux, anumite scripturi/părți de script-uri (cum ar fi cele încorporate în soluțiile alternative xml oferite) pot funcționa sau nu. Dacă legătura cu kvm poate fi reprodusă pe orice aromă Linux urmând comenzile de mai sus.... atunci se pare posibil ca kvm NAT să poată fi realizat și folosind comenzi cli - doar pentru a clarifica ideea acestei postări, pașii cli către NAT kvm vor fi mai standardizat, deci preferabil.

în general, răspunsul @NikitaKipriyanov a fost drumul corect, acesta a fost răspunsul, dar a necesitat o modificare pentru a comanda

$ sudo kvm -m 3G -hdb /dev/sde -net nic -net user,hostfwd=tcp::1810-:22

folosind comanda tweak vm poate comunica cu internet ca implicit și, de asemenea, poate comunica cu gazda prin ssh. merită lui @NikitaKipriyanov și @cnst pentru modificare https://stackoverflow.com/a/54120040

Utilizatorul va trebui să ssh folosind portul 1810 folosind adresa localhost

$ ssh p@localhost -p 1810

drapel in
Informații de la `ip r` și `ip a` cu informații despre care nic este de la KVM-ul dvs. și poate, de asemenea, linia de comandă a mașinilor dvs. kvm ar trebui să vă ajute cu problema dvs. ` -nic user,model=virtio` vă oferă modul utilizator NAT Dacă ceea ce doriți este de fapt nat de la gazdă la rețeaua dvs., atunci: `iptables -t nat -A POSTROUTING -s $vmnet -j MASQUERADE` vă va oferi NAT
Nikita Kipriyanov avatar
drapel za
Răspunde asta la întrebarea ta? [portul gazdă înainte cu qemu prin libvirt în rețea în modul utilizator](https://serverfault.com/questions/890520/host-port-forward-with-qemu-through-libvirt-in-user-mode-networking)
t09 avatar
drapel wf
t09
@NiKiZe : _iptables -t .... MASQUERADE_ dă rezultate: argument greșit `MASQUERADE' . Și _iptables -t nat -A POSTROUTING -o Brii -j MASQUERADE_ este acceptat de gazdă, dar kvm încă nu poate ping gazda sau internetul
Nikita Kipriyanov avatar
drapel za
Observați, bridging-ul nu are nimic de-a face cu NAT și rutare. Nu le amesteca. Dacă doriți crearea de punte, eliminați „NAT” și „ip route” și prietenii de peste tot, nu veți folosi asta. VM-ul dvs. va apărea alături de gazdă într-o rețea (care ar putea fi o rețea privată pentru gazdă și VM, dar aceasta este o altă poveste). Pe de altă parte, dacă intenționați să utilizați modul utilizator NAT, cu siguranță nu aveți nevoie deloc de bridge (deoarece este dezvoltat pentru a ușura nevoia de a utiliza bridge în primul rând).
Nikita Kipriyanov avatar
drapel za
Celălalt răspuns (de @TomYan) este *o altă poveste* pe care am menționat-o. El vă sugerează să urmați această abordare, de exemplu. e. de la utilizarea modului utilizator NAT, utilizați NAT în sistemul de operare gazdă. Aceasta este o abordare viabilă, dar cu siguranță este *mai greu* și *mai greoaie* decât să scrieți corect opțiunile liniei de comandă.
t09 avatar
drapel wf
t09
@Nikita Kipriyanov - făceam teste pe kvm pentru a vedea dacă ar putea NAT ca Virt-Manager fără umflarea și sarcinile grele ale virt-manager în resurse. Voi cerceta aplicația cli a libvirt pentru această problemă și voi posta rezultatele dacă au succes.
Puncte:1
drapel za

Ideea comună a NAT este că tu nu vezi adrese traduse. Nu aveți rute către ei. Ele nu există pentru tine. Vedeți doar adresele în care sunt traduse.

Cazul QEMU nu este nimic diferit.În acest caz, gazda dvs. este „în afara”, VM-ul dvs. este „înăuntru”, astfel încât VM-ul nu ar putea fi accesat niciodată de adresa căreia este alocat. Aveți adresa 10.0.2.2/24 a VM, dar când ajunge la Internet, pachetele sale sunt traduse în 192.168.1.172 prin procesul QEMU, deci host consideră acele pachete ca fiind create de procesul QEMU și le tratează ca orice alte pachete, de exemplu, din browserul web care rulează local sau ceva de genul acesta.

Cum se accesează un VM de pe gazdă? Când avem NAT, pentru a ajunge la gazdele ascunse în spatele lui, instalăm DNAT reguli. Și din nou, cazul QEMU nu este diferit, trebuie să setați niște reguli în el și apoi puteți comunica cu VM-ul de la gazdă (de la alte gazde, dacă doriți) prin trimiterea de pachete către porturile selectate ale serverului. gazdă abordare.

In conformitate cu documentația QEMU, pentru a seta regulile DNAT în modul său NAT utilizator, utilizați hostfwd clauză. Să introducem următoarele în linia de comandă:

    -netdev user,id=usernet0,hostfwd=tcp::11111-:22 \
    -device virtio-net-pci,netdev=usernet0,mac=08:00:27:92:B0:51

Apoi, portul tcp 11111 va fi ocupat de qemu-system-x86_64 proces pe mașina mea, iar dacă vă conectați la gazdă locală portul 11111, conexiunea se va face la portul 22 al VM.

Forma generală este hostfwd=hostip:hostport-guestip:guestport, dar dacă omiteți hostip, va fi localhost, iar dacă omiteți guestip, va fi prima adresă „non-gateway” din rețeaua oaspeților.

Am observat că ești menționat virsh. Tu alergi libvirt? Atunci întrebarea este duplicată; vezi comentarii.

t09 avatar
drapel wf
t09
mulțumesc, răspunsul are sens - încă fac ceva greșit. `$ sudo kvm -m 3G -hdb /dev/sde netdev user,id=usernet0,hostfwd=tcp::11111-:22` Ieșire: `qemu-system-x86_64: netdev: Nu s-a putut deschide 'netdev': Nu există fișier sau director` Am citit linkul documentației QEMU - orice tutorial explică acest pas cu pas pe care îl pot urma?
t09 avatar
drapel wf
t09
`$ sudo kvm -m 3G -hdb /dev/sde netdev user,id=usernet0,hostfwd=tcp::11111-:22 device virtio-net-pci,netdev=usernet0,mac=08:00:27:92: B0:51` Aceeași ieșire: `qemu-system-x86_64: netdev: Nu s-a putut deschide 'netdev': Nu există un astfel de fișier sau director`
Michael Hampton avatar
drapel cz
@t09 Doar remediați greșeala de scriere; ai uitat `-` din `-netdev user,...`
Tom Yan avatar
drapel in
De fapt, `(S)NAT` (în sensul non-specific pentru qemu) nu împiedică VM-ul să poată ajunge la gazdă. Mai degrabă „masquerad” traficurile de la VM astfel încât acestea să pară să provină de la gazda VM către gazdele de rețea din aceeași rețea LAN (de exemplu, gateway-ul implicit). Din punct de vedere tehnic, nici măcar nu împiedică traficul de la acele gazde să ajungă la VM (dar doar că traficurile de răspuns de la VM nu vor părea a fi răspunsuri la ele).
Tom Yan avatar
drapel in
Ceea ce „izolează” de fapt VM-ul este, AFAIK, faptul că `-netdev user` este o stivă de rețea de spațiu utilizator în interiorul qemu însuși: https://wiki.qemu.org/Documentation/Networking#User_Networking_.28SLIRP.29, care este de ce nu veți vedea nimic nou care apare în `ip l` pe gazdă. Doar că mulți utilizatori vor folosi asta doar pentru o configurare „Abordare NAT” (pentru că este implicit), așa că devine ca un sinonim pentru NAT în contextul qemu. Adevărul este că puteți utiliza o punte fără un sclav fizic și se bazează pe redirecționarea IP pentru conexiunea la Internet în VM.
Nikita Kipriyanov avatar
drapel za
@t09 `-netdev` trebuie să fie cu liniuță, într-adevăr. Aceasta este opțiunea de linie de comandă QEMU.
t09 avatar
drapel wf
t09
în general, acesta a fost răspunsul, dar a necesitat o modificare pentru a comanda $ sudo kvm -m 3G -hdb /dev/sde -net nic -net user,hostfwd=tcp::1810-:22
Puncte:0
drapel in

Puteți utiliza o punte fără a-i aservi nici una dintre interfețele fizice Ethernet de pe gazda VM.

Să presupunem că rămânem cu alegerea subrețelei 10.0.2.0/24 (ceea ce NU este necesar):

# ip adaug bridge de tip natbr0
# ip a add 10.0.2.1/24 dev natbr0

Apoi creați următorul fișier:

$ echo 'permite natbr0' | sudo tee /etc/qemu/bridge.conf 
permite natbr0

Apoi începeți qemu cu de ex. -nic pod,br=natbr0 sau -netdev bridge,br=natbr0,id=nb0 -device virtio-net,netdev=nb0, care va Atingeți VM-ul dvs. către punte într-o manieră dinamică (adică, Atingeți interfața va fi eliminată odată ce VM-ul este oprit).

Va trebui să configurați IP-ul static și pe VM:

# ip a add 10.0.2.2/24 dev ens3
# ip r adăugați implicit prin 10.0.2.1

Cu excepția cazului în care configurați și un server DHCP (cu, de exemplu, dnsmasq) pe gazdă. Nu uitați să configurați serverul DNS pentru a fi utilizat și în interiorul VM.

Rețineți că VM-urile care folosesc aceeași punte pot comunica între ele, cu excepția cazului în care blocați o astfel de comunicare prin anumite mijloace (de exemplu, ebtables).

The Mod implicit ruta (și serverul DNS de utilizat) sunt necesare numai dacă doriți ca VM-ul să poată ajunge în „exterior”. Dacă aveți nevoie doar de el pentru a putea comunica cu gazda VM, ar trebui să omiteți a doua comandă și puteți opri citirea. (Ei bine, citește P.S.)


Cel mai bine ar fi probabil să configurați de ex. dnsmasq de pe gazdă să fie un forwarder DNS dacă nu doriți să utilizați un anumit server DNS „public” în VM, deși folosiți DNAT pentru a transmite cereri DNS către, de ex. 192.168.1.1 ar trebui să funcționeze pentru cele de bază.

Apoi va trebui să activați redirecționarea IP:

# sysctl -w net.ipv4.ip_forward=1
net.ipv4.ip_forward = 1

Dacă doriți să evitați redirecționarea IP de la/la o anumită interfață de rețea (de exemplu. tun0) din motive de securitate, va trebui să configurați un firewall. De exemplu:

# iptables -A FORWARD -i tun0 -j DROP
# iptables -A FORWARD -o tun0 -j DROP

Deoarece aveți rute de tunel (VPN) care practic suprascriu Mod implicit rută, traficurile de la VM către Internet vor intra și în tunel (cu excepția cazului în care ați adăugat regulile exemplu de mai sus). Dacă doriți ca traficurile să meargă de ex. prin routerul dvs., veți avea nevoie de rutare a politicii. De exemplu:

# ip ru add iif natbr0 tabelul de căutare 123
# ip r add 192.168.1.1 dev wlan0 tabelul 123 # probabil opțional
# ip r adăugați implicit prin 192.168.1.1 tabelul 123

De asemenea, puteți împiedica VM-urile dvs. să poată ajunge la gazdele dvs. LAN:

# iptables -A FORWARD -i natbr0 -d 192.168.1.0/24 -j DROP

Faceți excepții (rețineți că -Eu) dacă intenționați să redirecționați cererile DNS către router:

# iptables -I FORWARD -i natbr0 -d 192.168.1.1 -p tcp --dport 53 -j ACCEPT
# iptables -I FORWARD -i natbr0 -d 192.168.1.1 -p udp --dport 53 -j ACCEPT

În cele din urmă, configurați iptables pentru a efectua SNAT în mod dinamic (conform interfeței de ieșire) pentru subrețeaua dvs. VM:

# iptables -t nat -A POSTROUTING -s 10.0.2.0/24 -j MASQUERADE

Rețineți că acest lucru NU este destinat și nu va împiedica exact anumite traficuri din „exterior” (gazdele LAN fizice sau Internetul; gazda VM nu contează) pentru a putea ajunge la VM-urile dumneavoastră. Pur și simplu întrerupe comunicarea ca efect secundar atunci când adresa sursă a traficurilor de răspuns de la VM-urile sunt schimbate înainte de a le transmite.Pentru o izolare adecvată, veți avea nevoie de reguli (suplimentare) adecvate în REDIRECŢIONA lanţ. Luați în considerare o configurație „de stat” acolo dacă aveți o astfel de nevoie.

În plus, puteți redirecționa solicitările DNS către gazdă de la VM-uri către router:

iptables -t nat -A PREROUTING -d 10.0.2.1 -p udp --dport 53 -j DNAT --to-destination 192.168.1.1
iptables -t nat -A PREROUTING -d 10.0.2.1 -p tcp --dport 53 -j DNAT --to-destination 192.168.1.1

Care vă va permite mai mult sau mai puțin să utilizați 10.0.2.1 ca server DNS în VM.


P.S. Toate manipulările de mai sus (cu excepția creării / scrie la /etc/qemu/bridge.conf) sunt volatile, adică vor dispărea odată ce reporniți (cu excepția cazului în care distribuția dvs. face ceva prostesc). Nu mă voi scufunda în modul în care le puteți face persistente, deoarece există moduri/abordări diferite și poate fi specific distro.

t09 avatar
drapel wf
t09
a trebuit să creeze /etc/qemu/ dir....Nu sunt sigur că învârt corect vm-ul. Am încercat `sudo kvm -m 3G -hdb /dev/sde -netdev bridge,br=natbr0,id=nb0 -device virtio-net,netdev=nb0` și `$ sudo kvm -m 3G -hdb /dev/sde -nic bridge,br=natbr0,id=usernet0` și `$ sudo kvm -m 3G -hdb /dev/sde -nic bridge,br=natbr0,id=usernet0` vm start
t09 avatar
drapel wf
t09
pe vm: `$ip a ...3: natbr0: ...state UNKOWN group default qlen 1000` _ifconfig_ `natbr0: inet 10.0.2.2 netmask 255.255.255.0 broadcast 0.0.0.0` _$sudo ip r add default via 10.0.2.1/24_ `se așteaptă mai degrabă orice adresă validă: „10.0.2.1/24`
Tom Yan avatar
drapel in
@t09 A fost o greșeală de tipar. `/24` nu ar trebui folosit în acea comandă.
Tom Yan avatar
drapel in
@t09 A mai fost o greșeală de tipar: comanda `ip a add 10.0.2.2/24` ar trebui să aibă ceva de genul `dev ens3`. (Verificați în interiorul VM cu `ip l` pentru a afla numele interfeței de utilizat. Asigurați-vă că știți că *întregul bloc de comandă* care constă din comandă ar trebui să fie rulat *pe VM*.)

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.