(Para o seguinte, ignorarei as pesquisas de DNS ou a ação da camada dois, pois essa não é a parte relevante para a história do NAT.)
Qualquer conexão TCP é composta por quatro partes:
<source IP> <source port> <destination IP> <destination port>
Em resumo: o IP de destino é usado para obter o pacote na máquina correta, a porta de destino é usada para obter o pacote nessa máquina no programa / sessão correto O IP de origem é usado para saber para onde enviar respostas. O mesmo vale para a porta de origem. Quando uma resposta é enviada, a origem e o destino são simplesmente trocados.
Vamos começar com dois computadores sem NAT:
- O computador tem IP
1.1.1.1
- O servidor da web tem IP
3.3.3.3
- A porta padrão para HTTP é
80
Quando um computador solicita uma página da Web, ele primeiro seleciona um número de porta aleatório não utilizado do intervalo aleatório (1024-65535). Vamos escolher 2345
. Em seguida, ocorrerá a seguinte sequência: O computador envia seu pacote com: IP de 1.1.1.1
origem 2345
, porta de origem , IP de 3.3.3.3
destino, porta de destino 80
. Os pacotes chegam ao servidor da web, ele vê seu próprio IP e porta 80
, então sabe que isso é uma solicitação para uma página da web. O servidor da Web envia a página da Web de volta em pacotes com IP de 3.3.3.3
origem, porta de origem 80, IP de 1.1.1.1
destino, porta de destino 2345
. O computador recebe esses pacotes e sabe qual foi a página solicitada por causa do número da porta 2345
.
Essas combinações de portas geralmente são escritas da seguinte maneira: 1.1.1.1:2345
e 3.3.3.3:80
.
Agora, o número de computadores na Internet supera em muito o número de endereços IPv4 disponíveis. Para preservar o espaço de endereço, foi introduzido um conjunto de intervalos de endereços privados, que podem ser usados livremente para o compartilhamento de endereços. Estes rangese são referidos como RFC1918 e são os seguintes:
- 192.168.0.0 - 192.168.255.255
- 172.16.0.0 - 172.31.255.255
- 10.0.0.0 - 10.255.255.255
Esses endereços não estão nas tabelas de roteamento da Internet, portanto, se você enviar um pacote com um destino nesses intervalos na espinha dorsal da Internet, eles simplesmente serão descartados. Isso ocorre porque milhões de pessoas usam os mesmos endereços. Esses endereços precisam ser traduzidos para algo útil para a internet. É aqui que entra a Tradução de endereços de rede:
Nós temos dois computadores:
- A:
192.168.0.1
e B:192.168.0.2
- O gateway deles tem um IP público de
1.1.1.1
.
- Mantemos o mesmo servidor da web.
- Ambos os computadores desejam a mesma página da Web do mesmo servidor.
Primeiro, os dois computadores selecionam uma porta aleatória: digamos: 192.168.0.1:2345
e 192.168.0.2:5432
.
Computador A envia seu pacote com origem 192.168.0.1:2345
e destino 3.3.3.3:80
. O gateway converte esse pacote no 1.1.1.1:2345
destino de origem 3.3.3.3:80
e lembra que todas as respostas a essa combinação vão para 192.168.0.1
. Portanto, quando receber uma resposta com origem 3.3.3.3:80
e destino 1.1.1.1:2345
, ela será traduzida para origem 3.3.3.3:80
e destino 192.168.0.1:2345
e enviará o pacote.
O computador B envia seu pacote com origem 192.168.0.2:5432
e destino 3.3.3.3:80
. O gateway converte esse pacote no 1.1.1.1:5432
destino de origem 3.3.3.3:80
e lembra que todas as respostas a essa combinação vão para 192.168.0.2
. Portanto, quando receber uma resposta com origem 3.3.3.3:80
e destino 1.1.1.1:5432
, ela será traduzida para origem 3.3.3.3:80
e destino 192.168.0.2:5432
e enviará o pacote.
Se os dois computadores selecionarem o mesmo número da porta de origem, o gateway simplesmente escolherá outro número de porta de origem aleatória gratuita e lembre-se de traduzir também o número da porta. Às vezes, isso é chamado de PAT (Port Address Translation). Este é basicamente um subconjunto do NAT.
Existem várias implementações para isso tudo. O gateway pode simplesmente lembrar "Computador X usou a porta de origem Y" e encaminhar qualquer coisa com a porta Y para o computador X. Ele pode se lembrar que o Computador X usou a porta de origem Y e o destino Z "e encaminhar apenas qualquer coisa da porta Z para a porta Y de volta para computador X. Ou existe a opção de lembrar toda a tupla e enviar apenas tráfego para o computador X que corresponda a todo o IP e porta de origem / destino.