Puncte:1

Cum rulați un dnsmasq în QEMU, oferind serviciu de pornire prin net altor mașini virtuale

drapel ph

EDIT: WIP: Motivul principal pentru eșecurile explicate mai jos se datorează faptului că nu am afișat interfețele TAP gazdă la momentul potrivit, dacă permit QEMU să se ocupe de crearea dispozitivelor de robinet, totul funcționează conform așteptărilor. Voi investiga eșecul mai detaliat și voi oferi o explicație mai clară a problemei când o voi avea. Mulțumesc @anx pentru sfaturi!

Scop: alerga a dnsmasq în interiorul unei mașini virtuale gazdă QEMU, care deservește boot-urile net de la un alt QEMU VM care rulează pe gazdă.

Aș dori ca VM dnsmasq să acționeze ca un gateway, cu un singur NIC ca interfață WAN în amonte, cu un server DHCP în amonte și cealaltă interfață o interfață LAN privată, la care vor fi alte VM „conectat”, și va porni net de la dnsmasq care ascultă pe acest privat interfață LAN.

În primul rând, pentru a permite VM-urilor să vorbească între ele, îmi creez propria mea punte pe gazda,

link ip adauga nume vivianbr0 tip pod
link-ul ip setați vivianbr0

Pentru ca VM-urile să vorbească între ele prin puntea gazdă, voi avea nevoie de două atingeți dispozitivele, unul pentru interfața LAN privată de pe VM-ul gateway și altul pentru interfața de rețea unică a VM-urilor private,

ip tuntap add mode tap tap0 user cturner
ip tuntap add mode tap tap1 utilizator cturner
link-ul ip setat tap0 up
legătură ip setată tap1 sus
set link ip tap0 master vivianbr0
set link ip tap1 master vivianbr0

Pentru VM-ul gateway, folosesc un ISO Arch Linux în scopuri de testare, VM-ul este pornit cu două NIC-uri, astfel,

 qemu-system-x86_64 \
    -drive file=arch-disk.qcow2,if=none,id=nvm \
    -device nvme,serial=deadbeef,drive=nvm \
    -cdrom archlinux-2021.09.01-x86_64.iso \
    -boot d\
    -device virtio-net-pci,romfile=,netdev=net0,mac="DE:AD:BE:EF:00:11" \
    -device virtio-net-pci,romfile=,netdev=net1,mac="DE:AD:BE:EF:00:12" \
    `# Simulați cablul „în amonte” conectat cu rețea în modul utilizator” \
    -utilizator netdev,id=net0,hostfwd=tcp::60022-:22,hostfwd=tcp::8080-:80,hostfwd=tcp::8081-:8000,hostfwd=tcp::2375-:2375 \
    `# Și acum cel deconectat cu, cu rețele TAP` \
    -netdev tap,id=net1,ifname=tap0,script=nu,downscript=nu \
-net bridge,br=vivianbr0 \
    -m 4G \
    -activare-kvm

Odată ce această mașină a pornit, văd următoarele în configurația podului,

brctl show vivianbr0 

numele podului ID pod Interfețe activate STP
vivianbr0 8000.46954a1ad851 nu tap0
                            atingeți 1
                            atingeți 2

presupun atingeți 2 a fost creat de QEMU...

În interiorul acestui VM, există două ifaces. ens4 cu MAC DE:AD:BE:EF:00:11 și ens5 cu MAC DE:AD:BE:EF:00:12. Înăuntrul acestuia VM, încep dnsmasq,

ip addr add 10.42.0.1/24 dev ens5
dnsmasq -d --dhcp-range=10.42.0.10,10.42.0.100 --dhcp-script=/bin/echo --enable-tftp=ens5 --interface=ens5

Aceasta începe fără eroare.

Acum încerc să pornesc un alt VM, pornit pe gazdă astfel,

qemu-system-x86_64 \
-mașină pc-q35-6.0,accel=kvm \
-m 1024 -smp 2,sockets=2,cores=1,threads=1 \
-netdev tap,id=net0,ifname=tap1,script=nu,downscript=nu \
-device virtio-net-pci,netdev=net0,bootindex=1,mac=DE:AD:BE:EF:00:13 \
-net bridge,br=vivianbr0 \
-enable-kvm \
-vga virtio

Dar nu reușește să pornească. Monitorizez vivianbr0 folosind tcpdump și poate vedea cererile DHCP, dar nu există răspunsuri, nimic nu ajunge la dnsmasq care rulează în primul VM,

tcpdump -i vivianbr0 -nN
tcpdump: ieșire verbosă suprimată, utilizați -v[v]... pentru decodarea completă a protocolului
ascultare pe vivianbr0, tip link EN10MB (Ethernet), lungime instantanee 262144 octeți
12:21:39.585229 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Solicitare de la de:ad:be:ef:00:13, lungime 397
12:21:40.587741 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Solicitare de la de:ad:be:ef:00:13, lungime 397
12:21:40.700038 IP6 fe80::6ce2:2aff:fe94:ba48.5353 > ff02::fb.5353: 0 [7q] PTR (QM)? _nfs._tcp.local. PTR (QM)? _ftp._tcp.local. PTR (QM)? _webdav._tcp.local. PTR (QM)? _webdavs._tcp.local. PTR (QM)? _sftp-ssh._tcp.local. PTR (QM)? _smb._tcp.local. PTR (QM)? _afpovertcp._tcp.local. (118)
12:21:42.619968 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Solicitare de la de:ad:be:ef:00:13, lungime 397
12:21:46.684448 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Solicitare de la de:ad:be:ef:00:13, lungime 397
12:22:30.609555 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Solicitare de la de:ad:be:ef:00:12, lungime 289
12:23:33.796148 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Solicitare de la de:ad:be:ef:00:12, lungime 289
12:24:38.673364 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Solicitare de la de:ad:be:ef:00:12, lungime 289

În mod ciudat, văd solicitări BOOTP de la de:ad:be:ef:00:13 (adresa MAC a VM-urilor de pornire prin net) iar din de:ad:be:ef:00:12 (NIC-ul privat al VM-ului gateway), indicând că ceva este prost configurat.

Cum pot face asta să funcționeze?

Nikita Kipriyanov avatar
drapel za
Ce se întâmplă dacă ascultați traficul DHCP la tap0 (port pod)? Ar trebui să arate thaffic care cod bridge a comutat la acel port. De asemenea, verificați tabelul de adrese MAC bridge în timpul solicitărilor; se umple cu MAC-urile necesare? Apropo, bridge-ul setează în mod implicit întârzierile STP standard, ceea ce înseamnă că portul începe să redirecționeze traficul cu doar 30 de secunde mai târziu decât a fost rupt „în sus”. În configurarea bridge-ului, nu am văzut nicăieri să schimbați acest lucru sau să dezactivați STP. Și, în sfârșit, VM-ul care ar trebui să pornească de la dnsmasq VM: ce port bridge folosește? Trebuie să existe o altă interfață de atingere în interiorul podului, pentru un al doilea VM.
drapel ph
@anx În ceea ce privește `-netdev brdige`, cum răspunde acest lucru la întrebare? Îmi permite să atașez dispozitive de atingere la un bridge * numit diferit*, dar problema este că am nevoie de QEMU pentru a trimite un dispozitiv oaspete la un bridge gazdă, astfel încât dnsmasq din interiorul VM să poată deservi cererile gestionate de bridge-ul gazdă.
drapel ph
@NikitaKipriyanov Am răspuns la prima ta întrebare într-o editare. STP nu rulează pe pod. Nu știu cum să verific tabelul de adrese MAC bridge în timpul solicitărilor. Pare o problemă mai simplă a interfețelor care nu pot fi aduse în sus.
drapel ph
@anx Referitor la invocarea `dnsmasq`.Este puțin complicat de defalcat, dar VM-ul meu gateway numește cele două interfețe pe baza acestei reguli: oricare interfață răspunde la o solicitare DHCP, se numește `public`, cealaltă `privată`. Într-o implementare de producție, interfața publică este conectată la un server DHCP din amonte, interfața privată nu. Atunci comanda `dnsmasq` este așa cum am scris în întrebarea mea, dar cu `--interface=private`
anx avatar
drapel fr
anx
Îmi place că întrebarea dvs. menționează toți pașii încercați, dar bănuiesc că faptele cheie sunt oarecum ascunse de diferite versiuni... aveți grijă să adăugați un instantaneu consecvent al situației actuale la întrebarea dvs. (ambele cmdlines qemu, cmdline dnsmasq și toate cele 3) ieșiri de la `ip a l`)?
drapel ph
@anx Da, chiar trebuie să gestionez singur dispozitivele de atingere. Am încercat să fiu cât mai scurt posibil, dar nu mă descurc grozav acolo, așa că este suficient să spun... Există motive :)
drapel ph
@anx „dnsmasq pe oaspete” pur și simplu nu poate funcționa, din același motiv dnsmasq pe `tap0` și nu `br0` nu funcționează. Acesta a fost un exemplu minimizat conform solicitării dvs. Dacă pornesc un dnsmasq în interiorul unei VM QEMU cu `-netdev tap,id=net1,ifname=tap0,script=no,downscript=no`, atunci este același comportament ca exemplul pe care l-am dat la întrebarea mea, doar că există un plus nivel de indirect între rețeaua iface a oaspeților și robinetul gazdei.
Tom Yan avatar
drapel in
Chiar nu ai niciun sens. Legarea dnsmasq la o atingere pe gazdă (ceea ce nu are sens, oricum se așteaptă să NU funcționeze) nu are NIMIC de-a face cu o VM care rulează dnsmasq (care se leagă de NIC-ul virtualizat din interiorul VM), indiferent dacă îl puteți avea pe acesta din urmă lucru. Nu are rost să testați/verificarea/depanarea cu abordarea dvs. „simplificată”, deoarece NU este deloc o simplificare.
Tom Yan avatar
drapel in
Primul lucru care îmi vine în minte este că, qemu nu enumerează sau randomizează adresa MAC a fiecărui VM.Este întotdeauna `52:54:00:12:34:56` dacă nu este setat/schimbat în mod explicit cu opțiunea qemu. Poate doriți să vă asigurați că ați rezolvat, cu opțiunea qemu corespunzătoare sau, configurați sistemul mașinilor virtuale pentru a le configura ele însele pe cele „false”. Asigurați-vă că nu vă mai confundați cu adresele MAC ale robineților de pe gazdă.
Tom Yan avatar
drapel in
Apropo, chiar doriți să vă curățați întrebarea (înlăturând toate prostiile irelevante) dacă tot doriți/aveți nevoie de ajutor suplimentar.
drapel ph
@TomYan Mi-am rescris complet întrebarea. Sper să vă fie mai clar acum. Am încercat să mă asigur că adresele MAC sunt unice, deși poate că nici eu nu am făcut acest lucru corect.
Tom Yan avatar
drapel in
În primul rând, nu trebuie să utilizați `-net(dev) bridge` *în plus față de* `-net(dev) tap`. Ele nu sunt complementare între ele, ci mai degrabă, primul adaugă automat un robinet pentru tine, iar al doilea folosește un robinet existent. Recomand să utilizați comanda rapidă `-nic bridge,model=virtio,mac=SO:ME:MA:CA:DD:RE` pentru a înlocui toate celelalte opțiuni legate de rețea pe care le aveți acum. (`-nic` poate fi folosit și cu `user` și `hostfwd` a acestuia.)
Tom Yan avatar
drapel in
Apoi, „...și de la de:ad:be:ef:00:12 (NIC-ul privat al VM-ului gateway), indicând că ceva este configurat greșit”, aceasta este o presupunere falsă. Dacă vedeți solicitări DHCP de la „gazdă gateway” depinde dacă rulează un client DHCP. Arch ISO folosește `systemd-networkd` pentru asta și, implicit, are DHCP (client) activează pe toate NIC-urile Ethernet IIRC.
Tom Yan avatar
drapel in
În cele din urmă, deși nu sunt familiarizat cu netboot, dar de ce v-ați aștepta să funcționeze ca „out-of-the-box” atâta timp cât există o gazdă de server dnsmasq / DHCP în rețea? Și indiferent, de ce nu începeți pur și simplu să porniți și Arch ISO pentru a confirma că cel puțin o parte a adresei de atribuire a DHCP funcționează mai întâi? A se vedea https://wiki.archlinux.org/title/Netboot btw. (Rețineți că instrucțiunile din interior nu au nimic de-a face cu virtualizarea, așa că toate ar trebui aplicate *în interiorul* unui VM, nu gazdă.)
Puncte:0
drapel fr
anx

Pașii tăi pentru doi invitați sunt în regulă, tocmai ți-am replicat configurația până la punctul de leasing adrese.Aș putea distribui IP-uri de la o VM care rulează dnsmasq la o VM care rulează un client dhcp.

Verificați acestea:

  • nu pot afișa dispozitive de atingere neatașate
    • vizibil din JOS stare în ip a l ieșirea gazdei (ar trebui să spunem NECUNOSCUT sau SUS)
      • dacă lăsați qemu să creeze dispozitivul de atingere, qemu-bridge-helper o va aduce în discuție
      • dacă utilizați un script=, aduceți dispozitivul acolo
      • altfel, trebuie setarea link-ului ip tap N sus ceva timp după începerea vm
  • Adresele MAC trebuie să fie unice
    • vizibil în eter adresa in ip a l în oaspeți
    • enumerați mac-urile învățate (non-gazdă), de ex. brctl showmacs br0 ar trebui sa aiba Două intrări cu un temporizator de îmbătrânire diferit de zero
  • eliminarea pachetelor prin iptables
    • Verifica /proc/sys/net/bridge/bridge-nf-call* Si vremea br_netfilter modulul este încărcat
    • adăugați o regulă de înregistrare, pentru IPv4 ceva de genul iptables -A FORWARD -j LOG --log-prefix „forward dropped” înainte de a abandona sau înaintea unei politici DROP pe tabelul FORWARD
    • ignora /sys/class/net/br*/bridge/nf_call_* (Nu știu de ce acestea poate sa fi dezactivat când filtrarea este activată)

Alte notabile pe care le-am găsit în timpul testării:

  • Qemu a adăugat vnet_hdr opțiunea pe dispozitivele mele de atingere. Acest lucru pare rezonabil și ar fi putut fi dezactivat pe linia cmdline qemu, dacă s-a dorit.
  • Uneori, traseul meu (link-ul) pentru pod dispare. Încă nu am stabilit cum s-ar putea întâmpla asta.

Despre încercarea dvs. de a simplifica testarea prin legarea la dispozitivul de atingere..

dnsmasq va rula într-un VM QEMU

Dispozitivele de atingere persistentă AFAIK sunt inutilizabile până când sunt atașate efectiv. Deci, puteți testa în mod semnificativ fie o configurație completă:

  • Doriți să rulați dnsmasq pe gazdă?
    • apoi atașați-l la dispozitivul punte
  • sau vrei să rulezi dnsmasq într-un VM?
    • apoi atașați-l la interfața de rețea respectivă interior acel VM

--interface=tap0

Sugestie: Folosește --bind-interfaces pentru a instrui dnsmasq să treacă de la pur și simplu eliminarea traficului de la alte interfețe la încercarea efectivă de a lega, renunțând astfel în mod verbos atunci când este pornit cu setări inutilizabile.

drapel ph
Întrebarea mea este despre rularea unui dnsmasq *în interiorul unui VM*, exemplele host-dnsmasq au fost doar pentru a vă oferi un exemplu mai simplu al problemei. Dacă știi cum să ai un dnsmasq *în interiorul unei VM* care oferă leasing la un alt VM net-booting, aș fi foarte interesat să aflu!
drapel ph
Doar pentru a fi și mai explicit, mi-am editat din nou întrebarea pentru a da un exemplu de abordare dnsmasq în abordarea pentru oaspeți pe care o încerc
anx avatar
drapel fr
anx
*M-am gândit* că știu cum să o fac pentru că o fac de mulți ani.. dar apoi m-am jucat și am găsit *trei* motive triviale diferite pentru care ar putea eșua.
drapel ph
Mulțumesc mult @anx, am făcut ceva progres datorită notelor tale.Se pare că nu aduc dispozitivele de atingere create manual la momentul potrivit este sursa problemelor mele. Dacă las QEMU să se ocupe de ele, netbooting-ul funcționează într-adevăr. Îmi voi actualiza întrebarea și, probabil, voi oferi o explicație mai clară a eșecului, după ce am săpat un pic mai mult în modul de a gestiona corect cazul meu de utilizare. Mulțumesc frumos, vă datorez câteva beri!

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.