(Per quanto segue ignorerò qualsiasi ricerca DNS o azione di livello due, poiché questa non è la parte rilevante per la storia NAT.)
Qualsiasi connessione TCP è una tupla di quattro parti:
<source IP> <source port> <destination IP> <destination port>
In breve: l'IP di destinazione viene utilizzato per ottenere il pacchetto sulla macchina corretta, la porta di destinazione viene utilizzata per ottenere il pacchetto su quella macchina nel programma / sessione corretto L'IP di origine viene utilizzato per sapere dove inviare eventuali risposte. Lo stesso vale per la porta di origine. Quando viene inviata una risposta, l'origine e la destinazione vengono semplicemente scambiate.
Cominciamo con due computer senza NAT:
- Il computer ha IP
1.1.1.1
- Il server web ha IP
3.3.3.3
- La porta standard per HTTP è
80
Quando un computer richiede una pagina Web, seleziona prima un numero di porta casuale inutilizzato dall'intervallo casuale (1024-65535). Scegliamo 2345
. Quindi si verificherà la seguente sequenza: Il computer invia il pacchetto con: IP di 1.1.1.1
origine 2345
, porta di origine , IP di 3.3.3.3
destinazione, porta di destinazione 80
. I pacchetti arrivano al server web, vede il proprio IP e la propria porta 80
, quindi sa che questa è una richiesta per una pagina web. Il server web quindi invia nuovamente la pagina Web in pacchetti con IP di 3.3.3.3
origine, porta di origine 80, IP di 1.1.1.1
destinazione, porta di destinazione 2345
. Il computer riceve questi pacchetti e sa quale pagina Web richiesta era, a causa del numero di porta 2345
.
Queste combinazioni di porte sono spesso scritte come tali: 1.1.1.1:2345
e 3.3.3.3:80
.
Ora, il numero di computer su Internet supera di gran lunga il numero di indirizzi IPv4 disponibili. Per preservare lo spazio degli indirizzi, è stata introdotta una serie di intervalli di indirizzi privati, che possono essere liberamente utilizzati per la condivisione degli indirizzi. Questi rangese sono chiamati RFC1918 e sono i seguenti:
- 192.168.0.0 - 192.168.255.255
- 172.16.0.0 - 172.31.255.255
- 10.0.0.0 - 10.255.255.255
Questi indirizzi non si trovano da nessuna parte nelle tabelle di routing di Internet, quindi se invii un pacchetto con una destinazione in questi intervalli sul backbone di Internet, verranno semplicemente eliminati. Questo perché milioni di persone usano gli stessi indirizzi. Questi indirizzi devono essere tradotti in qualcosa di utile per Internet. È qui che arriva la traduzione dell'indirizzo di rete:
Abbiamo due computer:
- A:
192.168.0.1
e B:192.168.0.2
- Il loro gateway ha un IP pubblico di
1.1.1.1
.
- Manteniamo lo stesso server web.
- Entrambi i computer desiderano la stessa pagina Web dallo stesso server.
Prima entrambi i computer selezionano una porta casuale: diciamo: 192.168.0.1:2345
e 192.168.0.2:5432
.
Computer A invia un pacchetto con origine 192.168.0.1:2345
e destinazione 3.3.3.3:80
. Il gateway traduce questo pacchetto nella 1.1.1.1:2345
destinazione di origine 3.3.3.3:80
e ricorda che le risposte a questa combinazione vanno a 192.168.0.1
. Pertanto, quando riceve una risposta con origine 3.3.3.3:80
e destinazione 1.1.1.1:2345
, la tradurrà in origine 3.3.3.3:80
e destinazione 192.168.0.1:2345
e invierà il pacchetto.
Il computer B invia il suo pacchetto con origine 192.168.0.2:5432
e destinazione 3.3.3.3:80
. Il gateway traduce questo pacchetto nella 1.1.1.1:5432
destinazione di origine 3.3.3.3:80
e ricorda che le risposte a questa combinazione vanno a 192.168.0.2
. Pertanto, quando riceve una risposta con origine 3.3.3.3:80
e destinazione 1.1.1.1:5432
, la tradurrà in origine 3.3.3.3:80
e destinazione 192.168.0.2:5432
e invierà il pacchetto.
Se entrambi i computer selezionano lo stesso numero di porta di origine, il gateway selezionerà semplicemente un altro numero di porta di origine casuale gratuito e ricorderà di tradurre anche il numero di porta. Questo a volte viene indicato come PAT (Port Address Translation). Questo è fondamentalmente un sottoinsieme di NAT.
Ci sono diverse implementazioni per tutto questo. Il gateway potrebbe semplicemente ricordare "Computer X ha utilizzato la porta di origine Y" e inoltrare qualsiasi cosa con la porta Y al computer X. Potrebbe ricordare che il Computer X ha utilizzato la porta di origine Y e la destinazione Z "e inoltrare qualsiasi cosa dalla porta Z alla porta Y di nuovo a computer X. Oppure esiste l'opzione che ricorda l'intera tupla e invia solo traffico al computer X che corrisponde all'intero ip e porta di origine / destinazione.