Notazione CIDR e maschere di sottorete: come leggere da /8 a /32
Il numero dopo la barra in 192.168.1.0/24 conta bit, non indirizzi. Dice quanti dei 32 bit di un indirizzo IPv4 appartengono alla rete; quello che avanza appartiene agli host. Quella frase, da sola, è quasi tutta la notazione CIDR.
Tutto il resto ne discende. Un /24 lascia 8 bit host, e il blocco contiene 2⁸ = 256 indirizzi. Un /26 ne lascia 6, quindi ne contiene 64. Ogni bit che restituisci al lato host raddoppia il blocco; ogni bit che gli togli raddoppia il numero di blocchi. Il conteggio che puoi davvero assegnare ai dispositivi è normalmente due unità più basso del totale, perché il primo indirizzo dà il nome alla rete e l’ultimo è il broadcast. Un /26 ti dà 62 host utilizzabili, non 64.
Due prefissi rompono di proposito quella regola del meno due. Una maschera wildcard, poi, non è una maschera di sottorete, anche se le due finiscono di continuo nei campi l’una dell’altra. L’aritmetica smette di essere ovvia proprio qui, ed è il motivo per cui conviene saper leggere un prefisso a mano invece di fidarsi a occhio. Se ti serve solo la risposta per un blocco, il calcolatore di sottoreti te la stampa; questo articolo parla di come arrivarci senza.
Cosa dice davvero la notazione CIDR
Una maschera di sottorete è a sua volta un numero a 32 bit, scritto come si scrive un indirizzo. I suoi bit sono una sequenza di 1 seguita da una sequenza di 0. Gli 1 marcano i bit di rete, gli 0 marcano i bit host. Scrivi un /26 per esteso e ottieni:
11111111.11111111.11111111.11000000
255 . 255 . 255 . 192
Riconverti ogni ottetto in decimale ed esce 255.255.255.192. La notazione CIDR conta gli 1 iniziali invece di scriverli tutti e trentadue. 192.168.1.0/26 e 192.168.1.0 255.255.255.192 sono la stessa affermazione in due sintassi, e quale delle due vuole un dispositivo dipende interamente dal comando che stai scrivendo.
Tutto il trucco sta nel conteggio. /8, /16 e /24 cadono sui confini degli ottetti, ed è per questo che in decimale sembrano ordinati: 255.0.0.0, 255.255.0.0, 255.255.255.0. Non c’è niente nella notazione che lo richieda. /22 e /27 sono altrettanto validi. Tagliano in mezzo a un ottetto e producono maschere come 255.255.252.0, che sembrano arbitrarie fino al momento in cui le scrivi in binario.
Perché le classi sono sparite. Prima del 1993 erano i bit iniziali di un indirizzo a decidere la sua dimensione: la classe A prendeva un /8, la classe B un /16, la classe C un /24, e in mezzo non c’era nulla. Un’organizzazione con 300 host doveva farsi assegnare una classe B e sprecare più di 65000 indirizzi, oppure prendere due blocchi di classe C e portarsi dietro due rotte. CIDR (RFC 1519, poi rivisto come RFC 4632) ha spezzato quel legame. Il prefisso viaggia insieme all’indirizzo, quindi un blocco può essere una qualsiasi potenza di due. Le classi compaiono ancora negli esami di certificazione e nella documentazione vecchia, ma il routing classful è obsoleto da allora: è la maschera a decidere dove finisce una rete, non il primo ottetto.
Il prontuario delle maschere di sottorete, da /8 a /32
L’ultima colonna di questo prontuario (cheat sheet) è voluta: mostra cosa produce la formula generica 2ⁿ − 2, che coincide con il conteggio reale degli utilizzabili ovunque tranne che nelle ultime due righe.
| Prefisso | Maschera di sottorete | Maschera wildcard | Indirizzi totali | Host utilizzabili | La formula 2ⁿ − 2 dà |
|---|---|---|---|---|---|
| /8 | 255.0.0.0 | 0.255.255.255 | 16777216 | 16777214 | 16777214 |
| /9 | 255.128.0.0 | 0.127.255.255 | 8388608 | 8388606 | 8388606 |
| /10 | 255.192.0.0 | 0.63.255.255 | 4194304 | 4194302 | 4194302 |
| /11 | 255.224.0.0 | 0.31.255.255 | 2097152 | 2097150 | 2097150 |
| /12 | 255.240.0.0 | 0.15.255.255 | 1048576 | 1048574 | 1048574 |
| /13 | 255.248.0.0 | 0.7.255.255 | 524288 | 524286 | 524286 |
| /14 | 255.252.0.0 | 0.3.255.255 | 262144 | 262142 | 262142 |
| /15 | 255.254.0.0 | 0.1.255.255 | 131072 | 131070 | 131070 |
| /16 | 255.255.0.0 | 0.0.255.255 | 65536 | 65534 | 65534 |
| /17 | 255.255.128.0 | 0.0.127.255 | 32768 | 32766 | 32766 |
| /18 | 255.255.192.0 | 0.0.63.255 | 16384 | 16382 | 16382 |
| /19 | 255.255.224.0 | 0.0.31.255 | 8192 | 8190 | 8190 |
| /20 | 255.255.240.0 | 0.0.15.255 | 4096 | 4094 | 4094 |
| /21 | 255.255.248.0 | 0.0.7.255 | 2048 | 2046 | 2046 |
| /22 | 255.255.252.0 | 0.0.3.255 | 1024 | 1022 | 1022 |
| /23 | 255.255.254.0 | 0.0.1.255 | 512 | 510 | 510 |
| /24 | 255.255.255.0 | 0.0.0.255 | 256 | 254 | 254 |
| /25 | 255.255.255.128 | 0.0.0.127 | 128 | 126 | 126 |
| /26 | 255.255.255.192 | 0.0.0.63 | 64 | 62 | 62 |
| /27 | 255.255.255.224 | 0.0.0.31 | 32 | 30 | 30 |
| /28 | 255.255.255.240 | 0.0.0.15 | 16 | 14 | 14 |
| /29 | 255.255.255.248 | 0.0.0.7 | 8 | 6 | 6 |
| /30 | 255.255.255.252 | 0.0.0.3 | 4 | 2 | 2 |
| /31 | 255.255.255.254 | 0.0.0.1 | 2 | 2 | 0 |
| /32 | 255.255.255.255 | 0.0.0.0 | 1 | 1 | −1 |
Leggi la tabella come un insieme di relazioni, non come una lista di risposte. Ogni riga verso il basso dimezza il blocco: /24 contiene 256 indirizzi, /25 ne contiene 128, /26 ne contiene 64. La colonna wildcard è la maschera di sottorete con ogni bit invertito, motivo per cui 255.255.255.192 e 0.0.0.63 compaiono sempre sulla stessa riga. Le due righe in grassetto sono invece il punto in cui la formula standard smette di descrivere la realtà, e più avanti c’è una sezione dedicata.
Nella colonna della maschera devi memorizzare solo i valori dell’ultimo ottetto, perché si ripetono: 128, 192, 224, 240, 248, 252, 254, 255. Sono gli unici otto valori di byte non banali con cui può finire una maschera valida. Se vuoi vedere da dove escono, il convertitore di basi numeriche te li stampa in binario.
Leggere la tabella al contrario: dalla maschera di sottorete al CIDR
Data una maschera in decimale puntato, conta i bit a 1. Ogni 255 vale 8, e l’unico ottetto interessante porta il resto:
| Ultimo ottetto della maschera | 128 | 192 | 224 | 240 | 248 | 252 | 254 | 255 |
|---|---|---|---|---|---|---|---|---|
| Bit che aggiunge | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
Quindi 255.255.255.192 è 8 + 8 + 8 + 2 = /26, mentre 255.255.252.0 è 8 + 8 + 6 + 0 = /22, perché 252 in binario è 11111100.
Da qui discendono due cose. Qualsiasi ottetto che non sia né 255 né 0 è l’ottetto di confine, e una maschera valida può averne uno soltanto. Il valore di quell’ottetto, poi, ti dà direttamente la dimensione del blocco, ed è da lì che parte il calcolo a mano.
Come calcolare a mano maschera di sottorete e rete
Il metodo meccanico ha tre passaggi e funziona per qualsiasi prefisso. L’esempio svolto qui sotto usa 192.168.1.130/26, ma il punto è la procedura, non questo indirizzo.
Passaggio 1: trova la dimensione del blocco
La dimensione del blocco è 256 − l'ottetto di confine della maschera.
Per un /26 la maschera è 255.255.255.192, quindi la dimensione del blocco è 256 − 192 = 64. Le sottoreti di quella dimensione stanno sui multipli di 64 nel quarto ottetto: 0, 64, 128, 192. Non esistono altri punti di partenza possibili.
Dimensione del blocco e numero di indirizzi sono lo stesso numero, raggiunto dal lato della maschera invece che dal lato del conteggio dei bit.
Passaggio 2: trova in quale blocco cade l’indirizzo
Dividi l’ottetto di confine dell’indirizzo per la dimensione del blocco e arrotonda per difetto.
L’indirizzo è 192.168.1.130, la dimensione del blocco è 64, quindi 130 ÷ 64 = 2.03…, che arrotondato per difetto fa 2. Moltiplica indietro: 2 × 64 = 128. L’indirizzo sta nel blocco che comincia a 128.
Quasi tutti gli errori nascono qui, sempre nella stessa direzione: si dà per scontato che l’indirizzo ricevuto sia l’inizio del suo blocco, e di solito non lo è. 192.168.1.130 è un indirizzo host che vive nel terzo /26 di quel /24.
Passaggio 3: rete, broadcast, primo e ultimo host
L’inizio del blocco è l’indirizzo di rete. Il broadcast è l’inizio del blocco più la dimensione del blocco meno uno. Tutto ciò che sta strettamente in mezzo è assegnabile:
Network 192.168.1.128
Broadcast 192.168.1.191
Usable 192.168.1.129 - 192.168.1.190
Usable 62 (of 64 total)
Netmask 255.255.255.192
Wildcard 0.0.0.63
Il broadcast è 128 + 64 − 1 = 191. Il primo host è rete + 1, l’ultimo host è broadcast − 1, e il conteggio degli utilizzabili è 64 − 2 = 62, che corrisponde alla riga /26 del prontuario.
La versione da ripetersi a mente: la dimensione del blocco è 256 meno l’ottetto della maschera; arrotonda l’indirizzo per difetto a un multiplo di quella dimensione; quella è la tua rete, e l’inizio del blocco successivo meno uno è il tuo broadcast.
Il metodo non è specifico del quarto ottetto. Per un /22 la maschera è 255.255.252.0, quindi l’ottetto di confine è il terzo e lì la dimensione del blocco è 256 − 252 = 4. I blocchi partono perciò da 10.0.0.0, 10.0.4.0, 10.0.8.0, e il blocco 10.0.0.0/22 arriva fino al broadcast 10.0.3.255 con indirizzi utilizzabili da 10.0.0.1 a 10.0.3.254: quattro /24 consecutivi dentro un solo dominio di broadcast. Stessi tre passaggi, ottetto diverso.
Se è il lato binario-decimale a rallentarti, la guida alla conversione tra basi numeriche tratta la conversione in sé con più profondità di quanta ne meriti un articolo sul subnetting.
Per controllare il tuo lavoro in uno script invece che a mente, la libreria standard di Python sa già fare tutto questo:
import ipaddress
net = ipaddress.ip_network("192.168.1.130/26", strict=False)
print(net) # 192.168.1.128/26
print(net.network_address) # 192.168.1.128
print(net.broadcast_address) # 192.168.1.191
print(net.netmask) # 255.255.255.192
print(net.hostmask) # 0.0.0.63
print(net.num_addresses) # 64
print(len(list(net.hosts()))) # 62
strict=False ti permette di passare un indirizzo host invece di un indirizzo di rete; con il valore predefinito strict=True la stessa chiamata solleva ValueError.
Dove la regola del meno due smette di valere
La sottrazione ha una ragione precisa. In una sottorete ordinaria il pattern di host tutto a zeri dà il nome alla rete stessa e il pattern tutto a uni è l’indirizzo di broadcast diretto. Nessuno dei due può essere configurato su un’interfaccia, quindi un blocco di 2ⁿ indirizzi ne offre 2ⁿ − 2 agli host. È per questo che un /24 ne dà 254 e un /26 ne dà 62.
Quella stessa ragione ne segna il limite: quando un blocco è troppo piccolo per contenere i due indirizzi riservati, sottrarli smette di avere senso.
Un /31 ha due indirizzi e due host utilizzabili. L’RFC 3021 definisce il /31 per i collegamenti punto-punto. Un collegamento del genere ha esattamente due estremi e nessun segmento condiviso: un indirizzo di broadcast non avrebbe niente da fare, un indirizzo di rete niente da identificare. Entrambi gli indirizzi vanno alle due estremità. Applicare qui 2ⁿ − 2 restituisce 0, perché la formula sta rispondendo a una domanda su una topologia che il /31 non ha. Quella condizione però conta davvero: il /31 è valido solo su interfacce genuinamente punto-punto. Un segmento LAN ad accesso multiplo ha ancora bisogno di un /30 o più corto, e Windows non accetta un /31 su una NIC.
Un /32 ha un indirizzo e un host utilizzabile. È una rotta verso un singolo host: interfacce di loopback, rotte statiche, indirizzi anycast, regole firewall su un solo indirizzo. Non esiste nessun indirizzo di broadcast, quindi il − 2 della formula restituirebbe −1.
Python è d’accordo con entrambi:
import ipaddress
p2p = ipaddress.ip_network("203.0.113.4/31")
print([str(h) for h in p2p.hosts()]) # ['203.0.113.4', '203.0.113.5']
host = ipaddress.ip_network("10.0.0.1/32")
print([str(h) for h in host.hosts()]) # ['10.0.0.1']
Conviene tenerlo a mente in questa forma: la sottrazione rimuove due indirizzi ben precisi, quindi vale la pena controllare che esistano prima di applicarla. Un /31 e un /32 non hanno alcun indirizzo di broadcast: non c’è niente da rimuovere.
Totale, utilizzabili e numero di sottoreti sono tre numeri diversi
Si confondono facilmente, ed è comprensibile: sono tutti potenze di due ricavate dallo stesso prefisso.
- Gli indirizzi totali in un /p sono
2^(32 − p). Un /26: 64. - Gli host utilizzabili sono quel numero meno 2, tranne che per /31 e /32. Un /26: 62.
- Il numero di sottoreti che ottieni dividendo un /p padre in figli /q è
2^(q − p). Dividere un /24 in /26 prende in prestito due bit, quindi2² = 4sottoreti.
I tre rispondono a domande diverse, quindi una frase come “un /26 te ne dà 4” è vera solo se la domanda riguardava la divisione di un /24. Dividere costa anche indirizzi, perché ogni sottorete figlia riserva la propria coppia rete e broadcast. Quattro /26 ricavati da un /24 contengono 4 × 62 = 248 indirizzi utilizzabili contro i 254 del padre: sei indirizzi spesi per la divisione in sé.
Maschera wildcard e maschera di sottorete: quale comando vuole quale
Una maschera wildcard è l’inverso bit a bit della maschera di sottorete. Dove la maschera di sottorete ha degli 1, la wildcard ha degli 0. Prendi la riga /26 del prontuario: maschera 255.255.255.192, wildcard 0.0.0.63. Inverti ogni bit dell’una e ottieni l’altra.
Le due si usano in sensi opposti, e qui sta la differenza che conta. Una maschera di sottorete si applica con un AND bit a bit, quindi un bit a 1 significa “questo bit fa parte della rete”. Una wildcard è un filtro di corrispondenza, quindi un bit a 0 significa “questo bit deve corrispondere” e un bit a 1 significa “non importa”. Stessa operazione di fondo, polarità opposta. Se la meccanica a livello di bit ti è poco chiara, la guida alle operazioni bit a bit copre AND, OR e NOT in termini più generali.
Quale delle due vuole un dispositivo non è una questione di preferenze. Per il blocco 192.168.1.128/26:
! wants the subnet mask
ip address 192.168.1.129 255.255.255.192
! wants the wildcard mask
access-list 10 permit 192.168.1.128 0.0.0.63
network 192.168.1.128 0.0.0.63 area 0
! Cisco ASA — wants the subnet mask, unlike IOS ACLs
access-list OUT permit ip 192.168.1.128 255.255.255.192 any
# Linux iproute2 — takes the prefix directly
ip addr add 192.168.1.129/26 dev eth0
Le ACL di Cisco IOS e le istruzioni network di OSPF vogliono la maschera wildcard; l’ASA vuole invece la maschera di sottorete. È un solo vendor con due convenzioni nella stessa famiglia di prodotti, e qui nasce l’errore di copia-incolla più comune del subnetting. Altre piattaforme hanno le proprie convenzioni, quindi prima di incollare un valore in un campo che non conosci, verifica quale delle due si aspetta.
È la modalità di fallimento a renderlo pericoloso. Incolla 255.255.255.192 in una ACL IOS e il router lo legge come wildcard: tre ottetti di soli 1 significano “non importa”, quindi i primi tre ottetti smettono del tutto di essere confrontati e la regola arriva molto oltre il blocco che avevi in mente. Non c’è nessun errore di sintassi e nei log non compare niente: solo un permit con l’ambito sbagliato. L’errore inverso ha almeno qualche possibilità di essere intercettato, perché 0.0.0.63 non è una maschera di sottorete valida: non ha una sequenza iniziale di 1. Se una data piattaforma la rifiuti o la accetti in silenzio non è una cosa da scoprire in produzione.
Perché le wildcard delle ACL possono avere buchi e le maschere di sottorete no
Una maschera di sottorete deve essere una sola sequenza contigua di 1 seguita da 0. La contiguità non è una scelta stilistica: senza di essa l’operazione AND non potrebbe dividere un indirizzo in esattamente due parti. Un valore come 255.0.255.0 ha un buco dentro, non descrive nessun confine coerente, e i dispositivi lo rifiutano. Lo rifiuta anche Python:
import ipaddress
ipaddress.ip_network("10.0.0.0/255.0.255.0")
# ValueError: '10.0.0.0/255.0.255.0' does not appear to be an IPv4 or IPv6 network
Le maschere valide sono solo 33, da /0 a /32. Qualsiasi altra cosa è un errore di battitura.
Le wildcard delle ACL non hanno questo vincolo, perché non stanno dividendo un indirizzo in una parte di rete e una parte host. Sono un filtro di corrispondenza bit per bit, quindi i buchi sono legali e ogni tanto utili: una singola wildcard con un buco può corrispondere, per esempio, a tutti gli indirizzi dispari di un intervallo. Quella differenza espressiva è il motivo per cui i due valori non si possono scambiare: non sono lo stesso tipo di oggetto, si limitano a sembrare uguali in decimale puntato.
Indirizzi privati, CGNAT e altri intervalli riservati
Un prefisso ti dice quanto è grande un blocco. Quale blocco sia ti dice se puoi usarlo.
| Blocco | Intervallo | Riservato da |
|---|---|---|
| 10.0.0.0/8 | 10.0.0.0 – 10.255.255.255 | RFC 1918, privato |
| 172.16.0.0/12 | 172.16.0.0 – 172.31.255.255 | RFC 1918, privato |
| 192.168.0.0/16 | 192.168.0.0 – 192.168.255.255 | RFC 1918, privato |
| 100.64.0.0/10 | 100.64.0.0 – 100.127.255.255 | RFC 6598, NAT carrier-grade |
| 169.254.0.0/16 | 169.254.0.0 – 169.254.255.255 | RFC 3927, link-local |
| 255.255.255.255/32 | indirizzo singolo | broadcast limitato |
Gli intervalli RFC 1918 non vengono mai instradati su internet, ed è questo che li rende sicuri per l’indirizzamento interno. Gli altri tre compaiono per ragioni diverse.
100.64.0.0/10 è spazio per il NAT carrier-grade. Se il tuo ISP ti assegna un indirizzo qui dentro, sei dietro il loro NAT e nessuna connessione in ingresso ti raggiungerà senza un tunnel. Non è spazio privato nel senso dell’RFC 1918 e non puoi usarlo in un piano di indirizzamento interno, perché il tuo provider potrebbe già averlo occupato dall’altro lato del tuo router.
169.254.0.0/16 è link-local. Un host se ne assegna uno da solo quando il DHCP fallisce, quindi vedere un indirizzo 169.254 su un’interfaccia è una diagnosi più che una configurazione: nessuno ha risposto alla richiesta DHCP. Il traffico verso questi indirizzi non attraversa mai un router.
Per gli esempi nella documentazione e nei runbook, l’RFC 5737 riserva 192.0.2.0/24, 198.51.100.0/24 e 203.0.113.0/24 proprio perché un esempio copiato e incollato non possa puntare a un host reale.
172.16.0.0/12 sono sedici /16, non uno
È questo l’intervallo riservato che si sbaglia più spesso, e la colpa è del prefisso. Un /12 prende in prestito quattro bit dal secondo ottetto, quindi il blocco va da 172.16.0.0 a 172.31.255.255: sedici /16 consecutivi, non solo 172.16.x.x.
Le conseguenze vanno in entrambe le direzioni. Un indirizzo come 172.20.5.1 è privato a tutti gli effetti, sta comodamente dentro l’intervallo, anche se non inizia per 172.16. Al contrario, 172.15.x.x e 172.32.x.x sono indirizzi pubblici che appartengono a qualcun altro, quindi una regola firewall o un controllo del tipo “fidati dell’intervallo interno” scritto contro 172.0.0.0/8 finisce per fidarsi in silenzio di una bella fetta di internet.
Se ti serve confermare un confine come questo, il prontuario ti dà l’aritmetica: un /12 ha 2^(32−12) indirizzi, il secondo ottetto si muove a passi di 256 − 240 = 16, e 16 + 16 = 32, quindi il blocco finisce subito prima di 172.32.0.0.
VLSM: dividere un blocco in sottoreti disuguali
Le sottoreti di dimensione uguale sono facili e di solito sbagliate. Una filiale a cui viene dato un solo 192.168.1.0/24 potrebbe avere bisogno di quattro segmenti che non hanno niente in comune: cento postazioni di lavoro, cinquanta telefoni, una dozzina di server e una manciata di interfacce di management. Dividi il /24 in quattro /26 uguali e il segmento delle postazioni straborda a 62 host, mentre quello di management ne tiene occupati 62 per servire dieci dispositivi.
Variable Length Subnet Masking significa dare a ogni segmento il prefisso di cui ha davvero bisogno. Ecco lo stesso /24 ritagliato in un /25, un /26 e due /28.
Alloca dal più grande al più piccolo. Ogni blocco deve iniziare su un multiplo della propria dimensione, quindi il blocco più grande sceglie per primo:
| Segmento | Host necessari | Prefisso | Rete | Intervallo utilizzabile | Broadcast | Maschera di sottorete |
|---|---|---|---|---|---|---|
| Postazioni | 100 | /25 | 192.168.1.0 | 192.168.1.1 – 192.168.1.126 | 192.168.1.127 | 255.255.255.128 |
| Voce | 50 | /26 | 192.168.1.128 | 192.168.1.129 – 192.168.1.190 | 192.168.1.191 | 255.255.255.192 |
| Server | 12 | /28 | 192.168.1.192 | 192.168.1.193 – 192.168.1.206 | 192.168.1.207 | 255.255.255.240 |
| Management | 10 | /28 | 192.168.1.208 | 192.168.1.209 – 192.168.1.222 | 192.168.1.223 | 255.255.255.240 |
| non allocato | — | /27 | 192.168.1.224 | 192.168.1.225 – 192.168.1.254 | 192.168.1.255 | 255.255.255.224 |
Riga per riga, con il metodo in tre passaggi:
- Il /25 ha dimensione del blocco
256 − 128 = 128, quindi parte da 0 e il suo broadcast è0 + 128 − 1 = 127. Utilizzabili da 1 a 126, cioè 126 indirizzi: abbastanza per 100 postazioni con spazio che avanza. La riga /25 del prontuario è d’accordo: 128 totali, 126 utilizzabili. - Il primo indirizzo libero successivo è 128. Il /26 ha dimensione del blocco 64, e 128 è un multiplo di 64, perciò ci sta: rete 192.168.1.128, broadcast
128 + 64 − 1 = 191, utilizzabili da 129 a 190. Fanno 62 utilizzabili per 50 telefoni. Riga /26 del prontuario: 64 totali, 62 utilizzabili. - Il libero successivo è 192. Il /28 ha dimensione del blocco 16, e
192 = 16 × 12, quindi ci sta: rete 192.168.1.192, broadcast 207, utilizzabili da 193 a 206, cioè 14 indirizzi per 12 server. Riga /28 del prontuario: 16 totali, 14 utilizzabili. - Il libero successivo è 208, e
208 = 16 × 13, quindi il secondo /28 atterra su 192.168.1.208 con broadcast 223 e utilizzabili da 209 a 222.
Questo copre 128 + 64 + 16 + 16 = 224 dei 256 indirizzi e lascia libero l’intervallo da 192.168.1.224 a 192.168.1.255. Quei 32 indirizzi sono esattamente un /27 allineato, ed è da lì che più avanti arriverebbero i collegamenti punto-punto: al suo interno ci stanno sedici /31, uno per ogni collegamento tra router.
Perché prima i più grandi, e cosa costa non farlo. Supponi di piazzare i due /28 all’inizio del blocco: 192.168.1.0/28 e 192.168.1.16/28. Il primo indirizzo libero è 192.168.1.32, e un /25 deve iniziare su un multiplo di 128, perciò lì non può partire. Deve saltare avanti fino a 192.168.1.128. Gli indirizzi da 32 a 127 non sono persi, ma restano utilizzabili solo come pezzi allineati più piccoli (un /27 a 192.168.1.32 e un /26 a 192.168.1.64), quindi lo spazio che avanza finisce sparpagliato invece di stare in un unico blocco contiguo in cima. Aggiungi un altro segmento alla richiesta e la stessa manovra smette del tutto di funzionare.
Ordinare per dimensione evita tutto questo. Dopo che hai piazzato un blocco, il primo indirizzo libero è un multiplo della dimensione di quel blocco, e un multiplo di una potenza di due più grande è automaticamente un multiplo di tutte quelle più piccole: così ogni blocco successivo, più piccolo, risulta allineato ovunque sia finito il precedente. Non devi mai saltare. Prima di riversare un piano del genere su uno switch, farlo passare per la tabella di suddivisione del calcolatore di sottoreti è più veloce che controllare a mano l’allineamento di ogni segmento.
Cinque errori che sopravvivono fino alla produzione
1. Trattare l’indirizzo che hai scritto come indirizzo di rete
Sintomo: una regola firewall non corrisponde a niente, oppure una rotta copre la metà sbagliata di un segmento.
Causa: 192.168.1.130/26 è stato letto come rete 192.168.1.0, broadcast 192.168.1.255, cioè il confine del /24, perché è quello che si vede in decimale.
Rimedio: applica il passaggio 2. Dimensione del blocco 64, 130 ÷ 64 arrotondato per difetto fa 2, quindi la rete è 2 × 64 = 128. Il blocco va da 192.168.1.128 a 192.168.1.191, e 192.168.1.0 è una sottorete completamente diversa. Ogni volta che un prefisso è più lungo di /24, dai per scontato che l’indirizzo ricevuto sia un indirizzo host finché non lo hai mascherato.
2. Applicare 2ⁿ − 2 a un /31
Sintomo: uno strumento di IPAM o un foglio di calcolo riporta 0 host utilizzabili per un collegamento punto-punto che è attivo e sta passando traffico. Causa: la regola del meno due presume che esistano un indirizzo di rete e uno di broadcast da sottrarre. Su un /31 non esistono. Rimedio: tratta /31 e /32 come le condizioni al contorno della formula, non come anomalie. L’RFC 3021 rende assegnabili entrambi gli indirizzi di un /31, e un /32 è una rotta verso un singolo host con un solo indirizzo. Qualsiasi cosa riporti 0 o −1 ha applicato la formula fuori dal suo dominio. Verifica prima il supporto al /31 sulla specifica interfaccia, dato che l’eccezione vale solo su collegamenti genuinamente punto-punto.
3. Trattare 172.16.0.0/12 come se fosse solo 172.16.x.x
Sintomo: un servizio interno è irraggiungibile da una sede, oppure una regola del tipo “blocca tutti gli intervalli privati” lascia passare qualcosa. Causa: il /12 è stato letto come se fosse un /16. Rimedio: l’intervallo va da 172.16.0.0 a 172.31.255.255. Scrivi le ACL e le allowlist contro il prefisso 172.16.0.0/12 invece che contro un pattern di ottetti, e ricorda che 172.15.x.x e 172.32.x.x stanno fuori, su internet. Se stai facendo la corrispondenza a mano, l’ottetto di confine è il secondo e avanza a passi di 16.
4. Incollare una wildcard in un campo che vuole una maschera di sottorete
Sintomo: una ACL permette molto di più, o molto di meno, di quanto previsto, e nella configurazione non c’è niente che sembri sbagliato. Causa: le ACL IOS e le istruzioni network di OSPF vogliono la wildcard mentre l’ASA vuole la maschera di sottorete, e 0.0.0.63 e 255.255.255.192 a colpo d’occhio sono intercambiabili. Rimedio: controlla il campo prima di incollare, non dopo. Un indizio utile: per qualsiasi prefisso di /8 o più lungo, una maschera di sottorete inizia con 255 e una wildcard inizia con 0. Se un valore che sta in una ACL o in un’istruzione network di OSPF inizia con 255, è una maschera di sottorete finita in un campo wildcard.
5. Scrivere una maschera non contigua, o generarne una per sbaglio
Sintomo: un dispositivo rifiuta una riga di configurazione, oppure uno script fatto in casa produce maschere che sembrano plausibili e sono sbagliate. Causa: un valore come 255.0.255.0 non è una maschera di sottorete valida: ha un buco. La versione da script è più sottile: in JavaScript gli operatori di shift prendono il loro operando destro modulo 32, quindi un prefisso fuori intervallo produce in silenzio una maschera sbagliata dall’aspetto plausibile (33 diventa /1, −1 diventa /31) invece di sollevare un errore. Rimedio: valida l’intervallo del prefisso prima di fare lo shift, e rifiuta qualsiasi maschera che non sia una sequenza compatta di 1 seguita da 0. Qui una libreria che solleva un errore sull’input sbagliato vale più di una che tira a indovinare, perché entrambe le modalità di fallimento sono silenziose.
FAQ
Qual è la differenza tra una sottorete e una VLAN?
Una VLAN è un dominio di broadcast di livello 2 configurato sugli switch; una sottorete è un intervallo di indirizzi di livello 3. Di solito vengono mappate una a una, ma niente lo impone: puoi mettere due sottoreti su una VLAN, oppure portare una VLAN in trunk tra più sedi. Rinumera la sottorete e l’ID della VLAN non cambia.
Quante sottoreti ottengo dividendo un /24 in /26?
Quattro. Il conteggio è 2 elevato al numero di bit presi in prestito, e /26 è due bit più lungo di /24, quindi 2² = 4 sottoreti da 64 indirizzi l’una. Ogni figlia riserva il proprio indirizzo di rete e di broadcast, per cui i quattro /26 contengono 248 indirizzi utilizzabili contro i 254 del /24 padre.
La notazione CIDR funziona allo stesso modo in IPv6?
La barra continua a contare i bit di rete iniziali: /64 significa 64 bit di rete su 128. Quello che non si trasferisce è la regola del meno due: IPv6 non ha indirizzo di broadcast, quindi dal totale non si sottrae niente. Il prontuario qui sopra e il calcolatore che ci sta dietro valgono solo per IPv4.
Cosa significa 0.0.0.0/0?
Zero bit di rete: corrisponde a ogni indirizzo IPv4. In una tabella di routing è la rotta predefinita, usata quando nessun prefisso più specifico corrisponde. Come indirizzo di bind significa “tutte le interfacce”, quindi un servizio in ascolto su 0.0.0.0 è raggiungibile da ogni rete a cui la macchina è collegata.
Cosa succede se due sottoreti sulla stessa rete si sovrappongono?
I router scelgono la rotta con il prefisso corrispondente più lungo, mentre gli host dentro la sovrapposizione non sono d’accordo su quali destinazioni siano locali. Il sintomo è parziale: alcune destinazioni funzionano e altre no, e quali cambia a seconda di dove fai la prova.
Perché gli indirizzi di classe A, B e C sono stati sostituiti dal CIDR?
Perché le classi offrivano solo tre dimensioni: /8, /16 e /24. Un’organizzazione che aveva bisogno di 300 indirizzi doveva prendere una classe B e sprecarne quasi tutta, oppure gestire due rotte di classe C. Il CIDR ha permesso a un prefisso di avere qualsiasi lunghezza, cosa che ha rallentato l’esaurimento degli indirizzi e ha permesso ai provider di riassumere in una sola rotta molti blocchi di clienti.
Posso suddividere un intervallo privato come 192.168.0.0/16 come voglio?
Sì. Lo spazio RFC 1918 puoi dividerlo a qualsiasi lunghezza di prefisso e nessuno fuori dalla tua rete lo vede. Il vincolo è interno: sovrapporsi a una rete partner o a una VPC cloud con cui farai peering più avanti è costoso da sbrogliare, e i piani fatti bene evitano i blocchi che ogni router domestico usa già.
Cosa portarsi a casa. Il prefisso conta i bit di rete, e la dimensione del blocco è 256 − l'ottetto di confine della maschera. Arrotonda l’indirizzo per difetto a un multiplo della dimensione del blocco per ottenere la rete, e aggiungi la dimensione del blocco meno uno per il broadcast. Sottrai due per la coppia riservata, ma solo quando un /31 o un /32 non ha già tolto la ragione per sottrarre. Distingui la wildcard dalla maschera di sottorete guardando come inizia il valore. Alloca i blocchi grandi prima di quelli piccoli.
Una volta che il metodo ce l’hai in testa, niente di tutto questo ha bisogno di uno strumento, ed è proprio questo il senso di ricavarlo a mano. Per controllare un piano prima che arrivi su un router, o per leggere a colpo d’occhio il confine binario di un blocco, il calcolatore di sottoreti fa i conti localmente nel tuo browser.