Approfondimento tecnico

NAT, spazi privati e port forwarding

Il NAT che tutti chiamano semplicemente "NAT" è in realtà NAPT (Network Address and Port Translation): non traduce solo l'indirizzo, ma anche la porta di origine. È quel dettaglio a permettere a decine di dispositivi di condividere un unico indirizzo pubblico.

Gli spazi riservati

  • 10.0.0.0/8 — 16,7 milioni di indirizzi, tipico delle reti aziendali
  • 172.16.0.0/12 — un milione di indirizzi, usato spesso in virtualizzazione e container
  • 192.168.0.0/16 — 65 mila indirizzi, lo standard di fatto delle reti domestiche
  • 100.64.0.0/10 — spazio condiviso per il CGNAT (RFC 6598): non è privato in senso stretto, è riservato agli operatori
  • 169.254.0.0/16 — autoconfigurazione: se vedi un indirizzo così, il DHCP non ha risposto

Sono definiti dalla RFC 1918. I router Internet li scartano per definizione: un pacchetto con indirizzo sorgente privato non deve uscire dalla rete locale, e i provider filtrano in questo senso (BCP 38).

Come funziona la traduzione

Quando un dispositivo interno apre una connessione, il router sostituisce indirizzo e porta di origine con il proprio indirizzo pubblico e una porta scelta da lui, e annota la corrispondenza in una tabella di stato. Al ritorno del pacchetto legge la porta di destinazione, ritrova la riga e riconsegna al dispositivo giusto.

Tabella di traduzione del NAT che associa indirizzo e porta interni a porte diverse dello stesso indirizzo pubblico tabella di traduzione del router interno visto da Internet 192.168.1.20:51244 93.45.201.7:40001 192.168.1.31:33900 93.45.201.7:40002 192.168.1.44:60100 93.45.201.7:40003 è la porta, non l'indirizzo, a distinguere le connessioni
Ogni connessione occupa una porta diversa sullo stesso indirizzo pubblico: da qui il limite teorico di circa 64.000 connessioni contemporanee.

Perché il traffico in ingresso è il problema

La tabella si crea solo quando è un dispositivo interno ad avviare la connessione. Un pacchetto che arriva dall'esterno senza una riga corrispondente non ha una destinazione: il router lo scarta. È un effetto collaterale del NAT che di fatto funziona da barriera, ma non è un firewall e non va confuso con uno.

Per esporre un servizio interno servono regole esplicite:

  • Port forwarding — si stabilisce che le richieste in arrivo su una certa porta pubblica vadano a un indirizzo interno preciso. Richiede un IP interno stabile, quindi conviene riservarlo nel DHCP
  • UPnP / NAT-PMP / PCP — le applicazioni chiedono da sole l'apertura di una porta. Comodo, ma qualsiasi programma della rete può farlo: sulle reti che ospitano servizi delicati conviene disattivarlo
  • DMZ — inoltra tutto il traffico non altrimenti assegnato a un unico host. Da evitare se non si sa esattamente cosa comporta

I tipi di NAT e perché contano

Non tutti i NAT si comportano allo stesso modo con il traffico non richiesto. La distinzione (RFC 4787) incide su videochiamate, giochi in rete e collegamenti diretti fra dispositivi:

  • Full cone — una volta aperta la porta, chiunque può usarla per raggiungere l'host interno
  • Restricted cone — solo l'indirizzo con cui si è già comunicato
  • Port restricted — solo quella coppia indirizzo e porta
  • Symmetric — a ogni destinazione diversa corrisponde una porta esterna diversa: è il caso peggiore per i collegamenti diretti, e obbliga a passare da un server intermedio (TURN)

È il motivo per cui una videochiamata a volte funziona in modo diretto e a volte transita da un server, con più ritardo.

Il limite dei numeri

Le porte disponibili sono circa 64.000 per indirizzo pubblico. Basta e avanza per una casa, ma non quando un operatore fa condividere lo stesso indirizzo a decine di clienti: è la situazione del CGNAT, dove il problema non è più solo esporre un servizio, ma anche l'esaurimento delle porte disponibili.

In IPv6 il NAT non serve, perché ogni dispositivo ha un indirizzo pubblico proprio. La protezione dal traffico non richiesto torna a essere compito del firewall, che è il posto giusto in cui stare.

Comandi utili

  • ip route get 8.8.8.8 — quale interfaccia e quale gateway vengono usati per uscire
  • conntrack -L (Linux) — le connessioni tradotte in questo momento
  • curl -s mioip.org/ip — l'indirizzo pubblico con cui esci davvero, utile per confrontarlo con quello atteso
  • netstat -rn · route print — tabella di instradamento locale

Vuoi vedere il tuo indirizzo IP in questo momento?

Mostra il mio IP