Lab 27 – SDN 1: zona Simple con SNAT, DHCP e IPAM
Dipendenze
Sezione intitolata “Dipendenze”- Lab precedenti:
- Lab 06: cluster
deso-clustercondesopve01-desopve03; - Lab 17: storage
rbd-vmper i dischi dei container ecephfs; - Lab 20: il template Debian su
cephfs; - Lab 21 e Lab 22:
vmbr1subond0e le reti dedicate di Corosync, citate nelle verifiche; - Lab 24: routing e NAT sull’host, da confrontare con quello generato dall’SDN.
- Lab 06: cluster
- Nodi:
desopve01,desopve02edesopve03.desopve04è fuori dal cluster e non riceve la configurazione SDN. - Template:
cephfs:vztmpl/debian-13-standard_13.6-1_amd64.tar.zst. - Proxy:
proxy.proxmox.community:3128per i pacchetti. - Credenziali:
root/<password-lab>sui nodi e nei container → Appendice B.
Obiettivi
Sezione intitolata “Obiettivi”- Conoscere i mattoni dell’SDN di Proxmox VE: zona, VNet, subnet, IPAM e DHCP.
- Creare dalla GUI una rete privata presente su tutti i nodi, senza modificare a mano i file di rete.
- Dare ai guest indirizzi automatici con il DHCP dell’SDN e vederli nell’IPAM.
- Capire il limite della zona Simple: la rete esiste su ogni nodo, ma i nodi non sono collegati tra loro.
Come funziona
Sezione intitolata “Come funziona”I mattoni dell’SDN
Sezione intitolata “I mattoni dell’SDN”| Oggetto | Cos’è | Dove si configura |
|---|---|---|
| Zona | il tipo di separazione: Simple, VLAN, QinQ, VXLAN, EVPN. Decide come le VNet arrivano ai nodi | Datacenter → SDN → Zones |
| VNet | una rete virtuale. Su ogni nodo diventa un bridge Linux con lo stesso nome, che si sceglie come Bridge nelle schede dei guest | Datacenter → SDN → VNets |
| Subnet | l’indirizzamento della VNet: rete, gateway, SNAT, intervalli DHCP | Datacenter → SDN → VNets → Subnets |
| IPAM | il registro degli indirizzi assegnati. pve è quello integrato; si possono usare NetBox o phpIPAM |
Datacenter → SDN → IPAM |
| DHCP | un server DHCP automatico per la zona, basato su dnsmasq |
opzione Automatic DHCP della zona |
La configurazione vive nel filesystem del cluster (/etc/pve/sdn/*.cfg) e non è attiva finché non si preme Apply. Con Apply ogni nodo genera /etc/network/interfaces.d/sdn e ricarica la rete; lo stato di ogni zona su ogni nodo compare nella pagina SDN.
La zona Simple
Sezione intitolata “La zona Simple”La zona Simple crea su ogni nodo un bridge isolato, senza porte fisiche. Il nodo ha l’indirizzo del gateway sul bridge e instrada il traffico dei guest; con SNAT lo fa uscire con il proprio indirizzo, come il masquerading del lab 24, ma senza scrivere regole a mano.
Ogni nodo ha lo stesso gateway (10.60.60.1 in questo lab) sul proprio bridge. I guest di nodi diversi sono nella stessa subnet ma non si vedono: non c’è nessun collegamento di livello 2 tra i nodi. Per una rete che attraversa i nodi servono le zone VLAN, QinQ, VXLAN o EVPN (lab 28-30).
DHCP e IPAM
Sezione intitolata “DHCP e IPAM”Con Automatic DHCP Proxmox VE avvia sui nodi un’istanza di dnsmasq per la zona (dnsmasq@simple1). Non è un DHCP “classico” con un pool libero:
- quando si aggiunge a un guest una scheda su una VNet con DHCP, Proxmox VE riserva un indirizzo nell’IPAM e lo lega al MAC della scheda;
- sul nodo dove gira il guest,
dnsmasqriceve la coppia MAC → indirizzo e risponde solo ai MAC conosciuti, con un lease senza scadenza; dnsmasqfa anche da DNS per i guest: inoltra le richieste ai DNS del nodo.
Il pacchetto dnsmasq va installato su tutti i nodi, con il suo servizio predefinito disattivato: Proxmox VE avvia le istanze per zona.
Procedura
Sezione intitolata “Procedura”1. dnsmasq sui nodi
Sezione intitolata “1. dnsmasq sui nodi”Su desopve01, desopve02 e desopve03:
apt-get install -y dnsmasq...Setting up dnsmasq-base (2.91-1+deb13u2) ...Setting up dns-root-data (2025080400~deb13u1) ...Setting up dnsmasq (2.91-1+deb13u2) ...systemctl disable --now dnsmasqRemoved '/etc/systemd/system/multi-user.target.wants/dnsmasq.service'.systemctl is-enabled dnsmasq; systemctl is-active dnsmasqdisabledinactive2. La zona
Sezione intitolata “2. La zona”Datacenter → SDN → Zones → Add → Simple. ID simple1, IPAM pve. Spunta Advanced e attiva Automatic DHCP:

3. La VNet
Sezione intitolata “3. La VNet”SDN → VNets → Create. Name vnsimp1, Zone simple1. Il nome della VNet diventa il nome del bridge Linux sui nodi, quindi deve essere breve.

4. La subnet con SNAT e DHCP
Sezione intitolata “4. La subnet con SNAT e DHCP”-
Seleziona
vnsimp1e, nel pannello Subnets, premi Create. Subnet10.60.60.0/24, Gateway10.60.60.1, SNAT attivo:
-
Scheda DHCP Ranges → Add: da
10.60.60.100a10.60.60.200.
-
Il risultato nei file del cluster:
root@desopve01 cat /etc/pve/sdn/zones.cfg /etc/pve/sdn/vnets.cfg /etc/pve/sdn/subnets.cfgOutput simple: simple1dhcp dnsmasqipam pvevnet: vnsimp1zone simple1subnet: simple1-10.60.60.0-24vnet vnsimp1dhcp-range start-address=10.60.60.100,end-address=10.60.60.200gateway 10.60.60.1snat 1
5. Apply
Sezione intitolata “5. Apply”SDN → Apply. Ogni nodo ricarica la rete (attività SRV networking - Reload) e la zona passa a available:

La zona localnetwork, sempre presente, rappresenta i bridge già configurati sui nodi (vmbr0, vmbr1).
for n in desopve01 desopve02 desopve03; do echo "$n $(pvesh get /nodes/$n/sdn/zones --output-format json | python3 -c 'import sys,json; print([(z["zone"], z["status"]) for z in json.load(sys.stdin)])')"; donedesopve01 [('simple1', 'available')]desopve02 [('simple1', 'available')]desopve03 [('simple1', 'available')]6. Cosa ha generato l’SDN
Sezione intitolata “6. Cosa ha generato l’SDN”-
Il bridge, con il gateway, l’IP forwarding e la regola di SNAT verso l’indirizzo del nodo. È quello che nel lab 24 abbiamo scritto a mano:
root@desopve01 cat /etc/network/interfaces.d/sdnOutput #version:1auto vnsimp1iface vnsimp1address 10.60.60.1/24post-up iptables -t nat -A POSTROUTING -s '10.60.60.0/24' -o vmbr0 -j SNAT --to-source 172.27.199.21post-down iptables -t nat -D POSTROUTING -s '10.60.60.0/24' -o vmbr0 -j SNAT --to-source 172.27.199.21post-up iptables -t raw -I PREROUTING -i fwbr+ -j CT --zone 1post-down iptables -t raw -D PREROUTING -i fwbr+ -j CT --zone 1bridge_ports nonebridge_stp offbridge_fd 0ip-forward onroot@desopve01 iptables -t nat -S | grep 10.60.60Output -A POSTROUTING -s 10.60.60.0/24 -o vmbr0 -j SNAT --to-source 172.27.199.21La regola nella tabella
rawsepara il tracciamento delle connessioni dei guest con firewall (le conntrack zone citate nel lab 24). -
L’istanza di
dnsmasqper la zona. L’intervallo èstatic: si risponde solo ai MAC registrati nel fileethers.root@desopve01 systemctl is-active dnsmasq@simple1Output activeroot@desopve01 ls /etc/dnsmasq.d/simple1/Output 00-default.conf 10-vnsimp1.confroot@desopve01 cat /etc/dnsmasq.d/simple1/10-vnsimp1.confOutput dhcp-range=set:simple1-10.60.60.0-24,10.60.60.0,static,255.255.255.0,infinitedhcp-option=tag:simple1-10.60.60.0-24,option:router,10.60.60.1interface=vnsimp1root@desopve01 grep -E "hostsfile|ignore=tag" /etc/dnsmasq.d/simple1/00-default.confOutput dhcp-hostsfile=/etc/dnsmasq.d/simple1/ethersdhcp-ignore=tag:!known
7. Due container sulla VNet
Sezione intitolata “7. Due container sulla VNet”-
Un container su
desopve01e uno sudesopve02, con la scheda suvnsimp1in DHCP:root@desopve01 pct create 271 cephfs:vztmpl/debian-13-standard_13.6-1_amd64.tar.zst --hostname simple-ct1 \--unprivileged 1 --features nesting=1 --cores 1 --memory 512 --rootfs rbd-vm:4 \--net0 name=eth0,bridge=vnsimp1,ip=dhcp --passwordpct start 271root@desopve02 pct create 272 cephfs:vztmpl/debian-13-standard_13.6-1_amd64.tar.zst --hostname simple-ct2 \--unprivileged 1 --features nesting=1 --cores 1 --memory 512 --rootfs rbd-vm:4 \--net0 name=eth0,bridge=vnsimp1,ip=dhcp --passwordpct start 272Nella GUI la VNet compare tra i bridge selezionabili:

-
I container ricevono il primo e il secondo indirizzo dell’intervallo, con il gateway del nodo:
root@desopve01 pct exec 271 -- ip -4 -brief addr show eth0Output eth0@if72 UP 10.60.60.100/24root@desopve01 pct exec 271 -- ip routeOutput default via 10.60.60.1 dev eth010.60.60.0/24 dev eth0 proto kernel scope link src 10.60.60.100root@desopve02 pct exec 272 -- ip -4 -brief addr show eth0Output eth0@if28 UP 10.60.60.101/24
8. L’IPAM
Sezione intitolata “8. L’IPAM”SDN → IPAM mostra, per zona, VNet e subnet, il gateway e gli indirizzi assegnati con VMID e MAC:

Lo stesso dalla riga di comando. Il file ethers di ogni nodo contiene solo i guest che girano su quel nodo:
pvesh get /cluster/sdn/ipams/pve/status --output-format json | python3 -c "import sys,json; [print(e.get('ip'), e.get('mac',''), e.get('vmid',''), e.get('hostname',''), 'gateway' if e.get('gateway') else '') for e in json.load(sys.stdin)]"10.60.60.1 gateway10.60.60.100 BC:24:11:64:2E:99 271 simple-ct110.60.60.101 BC:24:11:2F:15:79 272 simple-ct2cat /etc/dnsmasq.d/simple1/ethersBC:24:11:64:2E:99,10.60.60.100Verifica e test
Sezione intitolata “Verifica e test”-
Gateway, DNS e SNAT. Il container raggiunge il gateway e il DC; il DNS è il gateway stesso, cioè
dnsmasq:root@desopve01 pct exec 271 -- ping -c2 -W1 10.60.60.1Output 2 packets transmitted, 2 received, 0% packet loss, time 1026msroot@desopve01 pct exec 271 -- grep nameserver /etc/resolv.confOutput nameserver 10.60.60.1root@desopve01 pct exec 271 -- ping -c3 -W1 172.27.199.20Output 3 packets transmitted, 3 received, 0% packet loss, time 2047msSulla rete di gestione il traffico esce con l’indirizzo del nodo:
root@desopve01 tcpdump -lni vmbr0 -c2 icmp and host 172.27.199.20Output 20:54:22.383353 IP 172.27.199.21 > 172.27.199.20: ICMP echo request, id 372, seq 1, length 6420:54:22.384284 IP 172.27.199.20 > 172.27.199.21: ICMP echo reply, id 372, seq 1, length 64 -
Pacchetti dal proxy: il nome del proxy si risolve tramite
dnsmasqeaptfunziona:root@desopve01 pct exec 271 -- sh -c 'echo "Acquire::http::Proxy \"http://proxy.proxmox.community:3128\";" > /etc/apt/apt.conf.d/80proxy && apt-get update'Output ...Reading package lists... -
I nodi non sono collegati. Il container 271 su
desopve01non raggiunge il 272 sudesopve02, anche se sono nella stessa subnet:root@desopve01 pct exec 271 -- ping -c3 -W1 10.60.60.101Output 3 packets transmitted, 0 received, 100% packet loss, time 2043ms -
Migrazione. Spostato su
desopve02(migrazione con riavvio, disco su Ceph), il container mantiene l’indirizzo, perché l’IPAM è del cluster, e ora vede il 272:root@desopve01 pct migrate 271 desopve02 --restartOutput ...2026-11-09 20:54:48 migration finished successfully (duration 00:00:09)root@desopve02 cat /etc/dnsmasq.d/simple1/ethersOutput BC:24:11:2F:15:79,10.60.60.101BC:24:11:64:2E:99,10.60.60.100root@desopve02 pct exec 271 -- ip -4 -brief addr show eth0Output eth0@if29 UP 10.60.60.100/24root@desopve02 pct exec 271 -- ping -c3 -W1 10.60.60.101Output 3 packets transmitted, 3 received, 0% packet loss, time 2068msroot@desopve02 pct exec 271 -- getent hosts proxy.proxmox.communityOutput 172.27.199.250 netsvc.proxmox.community proxy.proxmox.communityAnche sul nuovo nodo il DNS del container è il
dnsmasqlocale, che inoltra al DC.
| Prova | Risultato |
|---|---|
| Apply della zona | available su desopve01-desopve03 |
| Indirizzi DHCP | .100 e .101 dall’IPAM, gateway 10.60.60.1 |
| Container → DC | 0% di perdita, con l’indirizzo del nodo (SNAT) |
DNS e apt tramite dnsmasq e proxy |
funzionano |
| Container su nodi diversi | 100% di perdita: nessun collegamento tra i nodi |
Migrazione su desopve02 |
9 s, stesso indirizzo; ora i due container si vedono |
Stato finale del lab
Sezione intitolata “Stato finale del lab”- Pacchetti:
dnsmasqinstallato sudesopve01-desopve03, servizio predefinito disattivato. - SDN:
- zona
simple1(Simple, DHCPdnsmasq, IPAMpve); - VNet
vnsimp1con subnet10.60.60.0/24, gateway10.60.60.1, SNAT, DHCP.100-.200; - applicata su
desopve01-desopve03, con l’istanzadnsmasq@simple1attiva.
- zona
- Container su
desopve02, entrambi accesi, senza avvio automatico, disco surbd-vm:- CT 271
simple-ct1, 10.60.60.100 (migrato dadesopve01), con il proxy diaptconfigurato; - CT 272
simple-ct2, 10.60.60.101.
- CT 271
- La rete dei nodi (
vmbr0,vmbr1, Corosync, Ceph) non è cambiata: l’SDN aggiunge solo il fileinterfaces.d/sdn.
Cosa hai imparato
Sezione intitolata “Cosa hai imparato”- L’SDN separa come si trasporta la rete (zona) da quale rete è (VNet) e da come è indirizzata (subnet).
- La configurazione SDN è del cluster ma diventa attiva solo con Apply, che genera i file di rete su ogni nodo.
- La zona Simple dà a ogni nodo la stessa rete isolata, con gateway, SNAT e DHCP senza regole scritte a mano.
- Il DHCP dell’SDN assegna gli indirizzi dall’IPAM, legati al MAC del guest;
dnsmasqrisponde solo ai MAC conosciuti. - In una zona Simple i guest di nodi diversi non si vedono: per una rete che attraversa i nodi servono le altre zone.