Do meu computador doméstico (192.168.0.2), que fica atrás de um roteador doméstico e o roteador está, é claro, usando NAT, quero me conectar ao google.com (o ping retorna 216.58.204.78). 192.168.0.2 abre uma porta TCP local, por exemplo, 60000, e uma mensagem é enviada para 216.58.204.78:80 por meio do NAT do meu roteador, que se traduz, por exemplo, em :60010. Entendo que as respostas para 192.168.0.2:60000 serão, na verdade, para :60010 e meu roteador usará a tabela NAT para encaminhar a resposta para 192.168.0.2.
Minhas perguntas são sobre o que acontece quando essa mensagem chega no lado do Google. O roteador do Google apenas envia a mensagem para o servidor do Google usando a porta 80 e, se sim, o que acontece quando o servidor do Google responde? O servidor responde em uma porta diferente, que é então traduzida na saída e, portanto, outras respostas da minha máquina não são mais para a porta 80 e são para qualquer porta 'pública'? Estou um pouco perdido no que acontece no lado do Google em relação ao NAT.
Esse tipo de NAT geralmente é stateful e mantém o controle de conexões ou "fluxos". O primeiro pacote faz com que o estado de tradução seja lembrado (por exemplo, para que o roteador saiba para qual endereço interno entregar as respostas), e todos os pacotes subsequentes em ambas as direções reutilizam o mesmo mapeamento, desde que façam parte do mesmo fluxo.
Por exemplo, no lado do cliente, se o roteador tiver decidido traduzir a origem de
internal:60000
paraexternal:61000
, ele fará isso consistentemente durante toda a duração da conexão e, claro, usará o mesmo mapeamento para encaminhar as respostas recebidas de volta para internal:60000.O mesmo se aplica se o servidor estiver atrás de NAT: o primeiro pacote de entrada estabelece o estado (neste caso, de acordo com uma regra estática de "encaminhamento de porta") e todas as respostas de saída seguem automaticamente o mesmo mapeamento ao contrário.
Portanto, se o primeiro pacote de entrada foi para
external:80
e foi traduzido parainternal:8989
, todas as respostas de saída deinternal:8989
(para o mesmo endereço de cliente:porta) serão NAT para aparecerem como se viessem deexternal:80
– a porta de origem não mudará porque o mapeamento já foi estabelecido.(Dito isso: não presuma que o servidor esteja por trás do NAT! Na escala do Google, eles provavelmente estão, mas também é comum que servidores web tenham um endereço IP público só para eles, sem nenhum NAT.)
Não. Há apenas um protocolo que faz isso – TFTP – enquanto todos os outros protocolos que vi responderão da mesma porta que o original. (Na verdade, isso significa que os NATs têm que reconhecer especificamente o TFTP, e às vezes o TFTP simplesmente não funciona por meio do NAT.)
(Além disso, o método que você descreve era aparentemente como o ARPANET ICP funcionava antes da invenção do TCP/IP, mas isso realmente não conta mais...)