Lab 25 – IPv6: dual stack, RA e SLAAC
Dipendenze
Sezione intitolata “Dipendenze”- Lab precedenti:
- Nodi:
desopve01-04per gli indirizzi statici;desopve04(autonomo) per il riavvio di prova e per il container dual stack. - Router:
rtr-core, il router MikroTik RouterOS del laboratorio (Lab 01, accesso conssh [email protected]), che diventa anche il gateway IPv6 della rete di gestione e annuncia il prefisso. - Template:
debian-13-standard_13.6-1_amd64.tar.zstnello storagelocaldidesopve04(Lab 09, oppurepveam download local debian-13-standard_13.6-1_amd64.tar.zst). - Credenziali:
root/<password-lab>sui nodi,admin/<password-lab>surtr-core,Administratorsul DC → Appendice B.
Obiettivi
Sezione intitolata “Obiettivi”- Capire come un host ottiene un indirizzo IPv6: indirizzi statici, Router Advertisement (RA) e SLAAC.
- Mettere la rete di gestione in dual stack (IPv4 e IPv6) con un prefisso privato (ULA).
- Dare ai nodi indirizzi statici e impedire che si autoconfigurino, con link-local non derivati dal MAC.
- Dare ai guest indirizzi automatici (SLAAC) dal router del laboratorio.
- Aggiungere i nomi IPv6 al DNS e accedere alla GUI di Proxmox in IPv6.
Come funziona
Sezione intitolata “Come funziona”Gli indirizzi IPv6 in breve
Sezione intitolata “Gli indirizzi IPv6 in breve”| Tipo | Esempio | Uso |
|---|---|---|
| Link-local | fe80::…/64 |
sempre presente su ogni interfaccia, vale solo sul link (la rete locale); serve a Neighbor Discovery e come gateway |
| ULA (Unique Local Address) | fd27:199::/64 |
privato, come le reti 10.x o 192.168.x in IPv4: non va su Internet |
| GUA (Global Unicast) | 2001:db8::/32 (documentazione) |
pubblico, assegnato dal provider |
Una rete IPv6 per host è quasi sempre una /64. Nel laboratorio la rete di gestione diventa fd27:199::/64, con lo stesso ultimo numero di IPv4 dove possibile: il nodo 172.27.199.21 diventa fd27:199::21.
Neighbor Discovery, RA e SLAAC
Sezione intitolata “Neighbor Discovery, RA e SLAAC”In IPv6 non c’è ARP: c’è Neighbor Discovery (ND), fatto di messaggi ICMPv6. Due di questi messaggi servono alla configurazione automatica:
- il router manda periodicamente un Router Advertisement (RA), oppure lo manda su richiesta (Router Solicitation): “sono il gateway, il prefisso di questa rete è
fd27:199::/64”; - un host che accetta gli RA si costruisce da solo un indirizzo nel prefisso (SLAAC, Stateless Address Autoconfiguration) e usa il link-local del router come gateway.
| Chi | Come si configura | Perché |
|---|---|---|
| Nodi Proxmox, DC, server | indirizzo statico, RA ignorati | l’indirizzo non deve cambiare: DNS, cluster, firewall e accessi si basano su di esso |
| Guest (VM, container) | SLAAC dagli RA del router | nessuna configurazione nel guest, come il DHCP in IPv4 |
Indirizzi derivati dal MAC
Sezione intitolata “Indirizzi derivati dal MAC”Con il metodo classico (EUI-64) l’host costruisce l’ultima metà dell’indirizzo dal MAC della scheda, con ff:fe in mezzo. Il MAC finisce così negli indirizzi link-local e SLAAC, e rivela il produttore della scheda. Il kernel Linux può invece generare indirizzi stable privacy (RFC 7217) con addr_gen_mode, non legati al MAC. Con addr_gen_mode = 3 il segreto da cui derivano è casuale e viene scelto a ogni avvio: gli indirizzi restano gli stessi finché il nodo è acceso, ma cambiano dopo un riavvio. Per averli uguali anche tra un riavvio e l’altro si imposta un segreto fisso (stable_secret) con addr_gen_mode = 2. Per i nodi è comunque una buona pratica di privacy.
Nei guest di Proxmox il MAC è casuale con il prefisso BC:24:11 di Proxmox: l’indirizzo SLAAC di un container (fd27:199::be24:11ff:fe…) rivela solo che è un guest Proxmox.
Gli RA e gli switch
Sezione intitolata “Gli RA e gli switch”Molti switch hanno una protezione (RA Guard) che scarta gli RA che non arrivano dalle porte autorizzate, per evitare che un host qualsiasi si annunci come router. Se i guest non ricevono gli RA del router, controlla per prima cosa lo switch.
IPv6 e firewall
Sezione intitolata “IPv6 e firewall”IPv6 non usa il NAT come IPv4: con indirizzi raggiungibili, il firewall diventa ancora più importante. Neighbor Discovery è ICMPv6, quindi un firewall che blocca tutto l’ICMPv6 rompe la rete. Il firewall di Proxmox (lab 32-33) ha regole che valgono per entrambe le famiglie e un’opzione dedicata, NDP, attiva per default, che lascia passare Neighbor Discovery.
Procedura
Sezione intitolata “Procedura”1. Prima degli RA: i nodi li ignorano
Sezione intitolata “1. Prima degli RA: i nodi li ignorano”-
Prima di accendere gli RA sul router conviene dire ai nodi di ignorarli: altrimenti ogni interfaccia collegata alla rete si costruisce un indirizzo SLAAC e un default gateway che nessuno ha scelto (e che restano anche dopo aver cambiato idea). Il file
/etc/sysctl.d/90-ipv6-host.conf, uguale su tutti i nodi:# Indirizzi IPv6 del nodo solo statici: nessuna interfaccia accetta gli RA o si autoconfigura (SLAAC).# Il carattere * vale anche per le schede che compaiono dopo l'avvio (systemd le applica a ogni nuova interfaccia).net.ipv6.conf.*.accept_ra = 0net.ipv6.conf.*.autoconf = 0# Link-local non derivati dal MAC (RFC 7217, "stable privacy" con segreto casuale)net.ipv6.conf.all.addr_gen_mode = 3net.ipv6.conf.default.addr_gen_mode = 3root@desopve01 /usr/lib/systemd/systemd-sysctl /etc/sysctl.d/90-ipv6-host.confgrep -l 1 /proc/sys/net/ipv6/conf/*/accept_ra | wc -lOutput 0Se un nodo ha già ricevuto degli RA (per esempio perché il router li annunciava già), togli gli indirizzi e le route che si è preso:
root@desopve01 ip -6 addr flush scope global dynamicip -6 route flush proto ra
2. Il prefisso e gli RA sul router
Sezione intitolata “2. Il prefisso e gli RA sul router”-
Su
rtr-coresi assegna l’indirizzofd27:199::1/64alla porta della rete di gestione conadvertise=yes, così il router annuncia il prefisso negli RA. Nel laboratorio l’intervallo degli RA si accorcia a 20-60 secondi:RouterOS — rtr-core /ipv6 address add address=fd27:199::1/64 interface=ether1 advertise=yes comment="lab 25: rete di gestione"/ipv6 nd set [find default=yes] ra-interval=20s-60s -
Un link-local fisso e facile da ricordare per il gateway,
fe80::1, al posto di quello generato dal MAC. Si disattiva la generazione automatica e si aggiunge l’indirizzo a mano:RouterOS — rtr-core /ipv6 settings set disable-link-local-address=yes/ipv6 address add address=fe80::1/64 interface=ether1 advertise=no comment="link-local fisso del gateway"Il link-local generato sparisce al successivo riavvio della porta del router (o del router stesso). Dalla console del router, non da una sessione SSH che passa da quella porta, disattiva e riattiva
ether1per 2 secondi; la rete di gestione si interrompe per quel tempo:RouterOS — rtr-core /interface disable ether1; :delay 2s; /interface enable ether1RouterOS — rtr-core /ipv6 address printOutput Flags: D - DYNAMIC; G - GLOBAL, L - LINK-LOCALColumns: ADDRESS, INTERFACE, VRF, ADVERTISE, VALID, PREFERRED# ADDRESS INTERFACE VRF ADVERTISE VALID PREFERRED0 D ::1/128 lo main no;;; lab 25: rete di gestione1 G fd27:199::1/64 ether1 main yes forever forever;;; link-local fisso del gateway2 L fe80::1/64 ether1 main no forever forever -
Verifica da un nodo che l’RA arrivi, con
rdisc6(pacchettondisc6).rdisc6chiede e mostra gli RA anche se il nodo è configurato per ignorarli:root@desopve04 apt install ndisc6rdisc6 vmbr0Output Soliciting ff02::2 (ff02::2) on vmbr0...Hop limit : undefined ( 0x00)Stateful address conf. : NoStateful other conf. : NoMobile home agent : NoRouter preference : mediumNeighbor discovery proxy : NoRouter lifetime : 1800 (0x00000708) secondsReachable time : unspecified (0x00000000)Retransmit time : unspecified (0x00000000)Source link-layer address: <MAC del router>Prefix : fd27:199::/64On-link : YesAutonomous address conf.: YesValid time : infinite (0xffffffff)Pref. time : infinite (0xffffffff)from fe80::1Autonomous address conf.: Yessignifica “costruitevi un indirizzo con SLAAC”.Stateful … Nosignifica che non c’è DHCPv6.
3. I nodi: indirizzi statici e link-local non derivati dal MAC
Sezione intitolata “3. I nodi: indirizzi statici e link-local non derivati dal MAC”Prima di modificare la rete, salva una copia del file su ogni nodo:
cp /etc/network/interfaces /root/interfaces.bak-lab25-
desopve04 dalla GUI. System → Network → vmbr0 → Edit: IPv6/CIDR
fd27:199::24/64, Gateway (IPv6)fd27:199::1.

Apply Configuration:

In
/etc/network/interfacescompare un secondo blocco pervmbr0, con la famigliainet6:iface vmbr0 inet6 staticaddress fd27:199::24/64gateway fd27:199::1 -
desopve01-03 da riga di comando. Lo stesso blocco (
fd27:199::21,::22,::23) subito dopo il bloccoiface vmbr0 inet static, poiifreload -a. Aggiungere un indirizzo avmbr0non interrompe Corosync né Ceph:root@desopve01 ifreload -aip -6 addr show dev vmbr0 scope global | grep inet6Output inet6 fd27:199::21/64 scope globalroot@desopve01 ip -6 route | grep defaultOutput default via fd27:199::1 dev vmbr0 proto kernel metric 1024 onlink pref mediumroot@desopve01 ping -6 -c2 -W1 fd27:199::24 | tail -1Output rtt min/avg/max/mdev = 0.502/1.256/2.010/0.754 msroot@desopve01 pvecm status | grep ^Quorate; ceph -s | grep healthOutput Quorate: Yeshealth: HEALTH_OK -
Il riavvio di prova su
desopve04conferma tre cose: le impostazioni restano, nessuna interfaccia accetta gli RA, e i link-local non contengono più il MAC.root@desopve04 ip -6 addr show dev vmbr0 scope link | grep inet6 # primaOutput inet6 fe80::<derivato dal MAC, con ff:fe in mezzo>/64 scope link proto kernel_llroot@desopve04 systemctl rebootOutput ...root@desopve04 grep -l 1 /proc/sys/net/ipv6/conf/*/accept_ra | wc -lOutput 0root@desopve04 ip -6 route | grep defaultOutput default via fd27:199::1 dev vmbr0 proto kernel metric 1024 onlink pref mediumroot@desopve04 ip -6 addr show dev nic1 scope link | grep inet6Output inet6 fe80::3aea:589e:ff57:62eb/64 scope link stable-privacy proto kernel_llIl link-local ora è
stable-privacy, senzaff:fee senza il MAC (e, conaddr_gen_mode = 3, cambierà a ogni riavvio). Sui nodi del cluster il file è già attivo per gli RA; i nuovi link-local si applicheranno al prossimo riavvio, che non serve fare ora.Al riavvio tornano anche le configurazioni dei lab 23 e 24 (OVS, NAT e port forwarding): sono tutte nei file di rete. I container non hanno l’avvio automatico e vanno riaccesi con
pct start.
4. Un guest dual stack con SLAAC
Sezione intitolata “4. Un guest dual stack con SLAAC”-
Il CT 404 su
vmbr0, con IPv4 statico e IPv6 automatico (ip6=auto, cioè SLAAC):root@desopve04 pct create 404 local:vztmpl/debian-13-standard_13.6-1_amd64.tar.zst \--hostname v6-ct1 --memory 512 --cores 1 --rootfs local-lvm:4 \--net0 name=eth0,bridge=vmbr0,ip=172.27.199.125/24,gw=172.27.199.1,ip6=auto \--nameserver 172.27.199.20 --searchdomain proxmox.community \--unprivileged 1 --features nesting=1 --password '<password-lab>' --start 1Dalla GUI: scheda di rete del container → IPv6 → SLAAC.

-
Il container si è costruito l’indirizzo dal prefisso annunciato e usa il link-local del router come gateway:
root@desopve04 pct exec 404 -- ip -6 addr show dev eth0Output 2: eth0@if19: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 link-netnsid 0inet6 fd27:199::be24:11ff:fe3c:c68c/64 scope global dynamic mngtmpaddr proto kernel_ravalid_lft forever preferred_lft foreverinet6 fe80::be24:11ff:fe3c:c68c/64 scope link proto kernel_llvalid_lft forever preferred_lft foreverroot@desopve04 pct exec 404 -- ip -6 routeOutput fd27:199::/64 dev eth0 proto kernel metric 256 pref mediumfe80::/64 dev eth0 proto kernel metric 256 pref mediumdefault via fe80::1 dev eth0 proto ra metric 1024 expires 1791sec pref mediumroot@desopve04 pct exec 404 -- ping -6 -c2 -W1 fd27:199::21 | tail -1Output rtt min/avg/max/mdev = 0.320/0.579/0.838/0.259 msroot@desopve04 pct exec 404 -- ping -c2 -W1 172.27.199.20 | tail -1Output rtt min/avg/max/mdev = 0.903/1.349/1.795/0.446 msproto kernel_raeproto raindicano indirizzo e gateway arrivati dall’RA;expiresè la durata annunciata dal router (1800 s), rinnovata a ogni RA.
5. Il DC: un effetto inatteso degli RA
Sezione intitolata “5. Il DC: un effetto inatteso degli RA”Windows accetta gli RA per default. Appena il router ha cominciato ad annunciare il prefisso, il DC si è dato un indirizzo SLAAC su entrambe le schede, e il servizio DNS lo ha registrato per il dominio:
Get-NetIPAddress -AddressFamily IPv6 | Where-Object { $_.IPAddress -notlike 'fe80*' -and $_.IPAddress -ne '::1' } | Format-Table InterfaceAlias,IPAddress,PrefixOrigin,SuffixOriginInterfaceAlias IPAddress PrefixOrigin SuffixOrigin-------------- --------- ------------ ------------MGMT fd27:199::e3db:db3d:17e2:9d9a RouterAdvertisement LinkCLUSTER fd27:199::3a51:9d70:251b:f8a3 RouterAdvertisement LinkGet-DnsServerResourceRecord -ZoneName proxmox.community -RRType AAAA | Format-Table HostName,@{n='IPv6';e={$_.RecordData.IPv6Address}}HostName IPv6-------- ----@ fd27:199::e3db:db3d:17e2:9d9adesopve-dc01 fd27:199::e3db:db3d:17e2:9d9aDomainDnsZones fd27:199::e3db:db3d:17e2:9d9aForestDnsZones fd27:199::e3db:db3d:17e2:9d9aUn DC con un indirizzo che dipende da un router non va bene: diamogli un indirizzo statico, disattiviamo gli RA sulle due schede e puliamo i record vecchi. I comandi in PowerShell, sul DC:
foreach ($i in 'MGMT','CLUSTER') { Set-NetIPInterface -InterfaceAlias $i -AddressFamily IPv6 -RouterDiscovery Disabled -Dhcp Disabled }New-NetIPAddress -InterfaceAlias MGMT -IPAddress fd27:199::20 -PrefixLength 64 -DefaultGateway fd27:199::1Set-DnsClientServerAddress -InterfaceAlias MGMT -ServerAddresses 127.0.0.1,::1ipconfig /registerdnsforeach ($z in 'proxmox.community','_msdcs.proxmox.community') { Get-DnsServerResourceRecord -ZoneName $z -RRType AAAA | Where-Object { $_.RecordData.IPv6Address.IPAddressToString -notmatch '^fd27:199::(20|21|22|23|24)$' } | Remove-DnsServerResourceRecord -ZoneName $z -Force}Nel Lab 02 il server DNS ascolta solo su 172.27.199.20. Perché risponda anche in IPv6, aggiungi il nuovo indirizzo all’elenco di ascolto:
$s = Get-DnsServerSetting -All$s.ListeningIPAddress = @('172.27.199.20','fd27:199::20')Set-DnsServerSetting -InputObject $sRestart-Service DNS(Get-DnsServerSetting -All).ListeningIPAddress172.27.199.20fd27:199::20Poi i record AAAA dei nodi, come i record A del lab 02:
foreach ($n in 21,22,23,24) { Add-DnsServerResourceRecordAAAA -ZoneName proxmox.community -Name ("desopve0" + ($n-20)) -IPv6Address ("fd27:199::" + $n)}Il risultato:
Get-NetIPAddress -AddressFamily IPv6 | Where-Object { $_.IPAddress -notlike 'fe80*' -and $_.IPAddress -ne '::1' } | Format-Table InterfaceAlias,IPAddress,PrefixOriginInterfaceAlias IPAddress PrefixOrigin-------------- --------- ------------MGMT fd27:199::20 ManualGet-DnsServerResourceRecord -ZoneName proxmox.community -RRType AAAA | Format-Table HostName,@{n='IPv6';e={$_.RecordData.IPv6Address}}HostName IPv6-------- ----@ fd27:199::20desopve-dc01 fd27:199::20desopve01 fd27:199::21desopve02 fd27:199::22desopve03 fd27:199::23desopve04 fd27:199::24DomainDnsZones fd27:199::20ForestDnsZones fd27:199::20Il DNS ora risponde anche interrogato sul suo indirizzo IPv6:
Resolve-DnsName desopve01.proxmox.community -Type AAAA -Server fd27:199::20 -DnsOnly | Format-Table Name,Type,IPAddress -AutoSizeName Type IPAddress---- ---- ---------desopve01.proxmox.community AAAA fd27:199::216. La GUI di Proxmox in IPv6
Sezione intitolata “6. La GUI di Proxmox in IPv6”pveproxy ascolta su tutti gli indirizzi, IPv4 e IPv6 (*):
ss -ltn '( sport = :8006 )'State Recv-Q Send-Q Local Address:Port Peer Address:PortLISTEN 0 4096 *:8006 *:*Dal container dual stack, per nome (il DNS ora restituisce anche il record AAAA, che ha la precedenza):
pct exec 404 -- getent ahosts desopve01.proxmox.community | sort -u -k1,1172.27.199.21 STREAMfd27:199::21 STREAM desopve01.proxmox.communitypct exec 404 -- wget -6 --no-check-certificate -S -O /dev/null https://desopve01.proxmox.community:8006/ 2>&1 | grep -E "Connecting|HTTP/"Connecting to desopve01.proxmox.community (desopve01.proxmox.community)|fd27:199::21|:8006... connected. HTTP/1.1 200 OKDa un browser l’indirizzo IPv6 si scrive tra parentesi quadre: https://[fd27:199::21]:8006.
Verifica e test
Sezione intitolata “Verifica e test”| Prova | Risultato |
|---|---|
| RA del router sulla rete di gestione | ricevuto, prefisso fd27:199::/64, SLAAC sì, DHCPv6 no, mittente fe80::1 |
| Nodi con indirizzo statico | fd27:199::21-24, default gateway fd27:199::1, nessun indirizzo dinamico |
| Interfacce dei nodi che accettano gli RA | 0, anche dopo un riavvio (con le chiavi *) |
| Link-local dopo il riavvio | stable-privacy, senza MAC |
Container con ip6=auto |
indirizzo SLAAC e gateway fe80::1, raggiunge i nodi in IPv6 e il DC in IPv4 |
| DC con gli RA attivi | indirizzi SLAAC su due schede, registrati nel DNS del dominio |
| DC dopo la correzione | solo fd27:199::20 statico, record AAAA puliti |
GUI di desopve01 per nome dal container |
connessione in IPv6, HTTP 200 |
| Cluster dopo le modifiche | quorum 3/3, Ceph HEALTH_OK, iSCSI con 2 percorsi |
Stato finale del lab
Sezione intitolata “Stato finale del lab”- Rete di gestione dual stack:
172.27.199.0/24efd27:199::/64. rtr-core:fd27:199::1/64suether1con RA (intervallo 20-60 s), link-local fissofe80::1, link-local automatici disattivati.- Nodi
desopve01-04:fd27:199::21-24/64statici suvmbr0, gatewayfd27:199::1;/etc/sysctl.d/90-ipv6-host.conf(RA ignorati,addr_gen_mode3). Copie della rete precedente in/root/interfaces.bak-lab25. Sudesopve01-03i link-local stable privacy si applicheranno al prossimo riavvio. - DC:
fd27:199::20statico suMGMT, RA disattivati suMGMTeCLUSTER, DNS127.0.0.1e::1; server DNS in ascolto su172.27.199.20efd27:199::20; record AAAA perdesopve-dc01edesopve01-04. - Container su
desopve04, accesi:- CT 404
v6-ct1suvmbr0, 172.27.199.125/24 e SLAAC; - CT 401-403 invariati dai lab 23-24.
- CT 404
Cosa hai imparato
Sezione intitolata “Cosa hai imparato”- In IPv6 il router annuncia il prefisso con gli RA, e i guest si configurano da soli con SLAAC.
- I nodi e i server vogliono indirizzi statici: gli RA vanno ignorati in modo esplicito, su tutte le interfacce, anche quelle che esistono all’avvio.
- Con
addr_gen_modegli indirizzi non contengono più il MAC della scheda. - Accendere gli RA su una rete esistente ha effetti su tutti: Windows li accetta per default, e un DC registra subito il nuovo indirizzo nel DNS.
- La GUI di Proxmox risponde in IPv6 senza configurazioni particolari; basta l’indirizzo sul nodo e, per i nomi, il record AAAA.