
Estou aprendendo sobre IPs públicos/privados, encaminhamento de porta e NAT, e ainda não consigo ver a resposta para uma pergunta simples:
Suponha que dois usuários na mesma rede estejam se comunicando com um único servidor fora de sua rede (digamos, eu e minha esposa enviamos solicitações http para yahoo.com). O servidor vê ambos os usuários como um único IP público e muitas vezes - como neste caso - comunicando-se na mesma porta. Como o roteador roteia os pacotes de acordo com as duas conexões diferentes? Existe alguma informação de roteamento dentro do pacote além de ip/porta? Existe alguma 'tabela de sessão' mantida em algum lugar? Por quem e o que exatamente inclui?
Responder1
Dentro de um computador, entre processos
Primeiro vamos ver como umsolteirocomputador distingue entre conexões simultâneas.
A maioria dos protocolos de transporte, como TCP, UDP, SCTPusardoisportas, origem e destino– ou seja, um em cada extremidade da conexão. Ou seja, pacotesnãosimplesmente caminhe “através” de uma porta; em vez disso, eles viajamdeporta Xparaporta Y.
Odestinoporta geralmente é bem conhecida (80 para HTTP, 53 para DNS…), mas ofontea porta geralmente é escolhida aleatoriamente pelo próprio sistema operacional, o que também garante que a combinação src/dst seja única.
Portanto, quando o seu navegador faz várias conexões "à porta 80 do Yahoo", todas elas têm conexões diferentes.portas de origem, e o sistema operacional mantém uma tabela de soquetes como:
PROCESS PROTO LOCAL REMOTE STATE
9894/firefox tcp 192.168.6.175:39163 google.server:80 established
9894/firefox tcp 192.168.6.175:52909 yahoo.server:80 established
17463/chrome tcp 192.168.6.175:64981 yahoo.server:80 established
9894/firefox udp 192.168.6.175:4984 8.8.8.8:53 --
Assim, quando o sistema operacional recebe um pacote TCP da yahoo.server:80
porta local 52909, ele pode mapeá-lo para a conexão específica feita pelo Firefox.
Importante notar que isso não tem nada a ver com NATainda, e acontece da mesma maneira mesmo se você estiver conectado diretamente. (No entanto, o NAT fará uso disso.)
(Você pode ver esta tabela usando netstat -n
ou várias ferramentas gráficas no Windows. Muitas vezes, "local/remoto" é rotulado como "origem/destino", embora isso não seja totalmente preciso.)
Dentro de uma rede NAT, entre computadores
A resposta à sua pergunta sobre NAT é muito semelhante, só que tudo é feito em maior escala.
O roteador que executa o NAT mantém uma tabela de "estado" contendo os endereços e portas internos e externos. Por exemplo, se suas duas solicitações HTTP usaram conexões TCP separadas, elas poderão ser rastreadas como:
PROTO ORIG-SRC ORIG-DST REPLY-SRC REPLY-DST
6/tcp 192.168.6.42:52909 yahoo.server:80 yahoo.server:80 your.public.ip.addr:52909
6/tcp 192.168.6.175:39163 yahoo.server:80 yahoo.server:80 your.public.ip.addr:39163
6/tcp 192.168.6.175:52909 yahoo.server:80 yahoo.server:80 your.public.ip.addr:28330
17/udp 192.168.6.175:4984 8.8.8.8:53 8.8.8.8:53 your.public.ip.addr:4984
Quando o roteador recebe um pacote do REPLY-SRC (Yahoo) endereçado ao REPLY-DST (seu endereço IP público), ele sabe que orealo destino deve ser retirado da coluna ORIG-SRC para desfazer o NAT.
(Se não houver nenhum estado correspondente, as regras de encaminhamento de porta configuradas manualmente serão processadas. Se ainda não houver correspondência, o pacote foi realmente destinado ao próprio roteador.)
Observe como a tabela de estado contémendereçoseportos, permitindo que múltiplas conexões com o mesmo servidor sejam diferenciadas pela combinação de portas. No meu exemplo, dois computadores usaram acidentalmente a mesma combinação de portas, então a segunda conexão também teve suas portas traduzidas.
(Na verdade, alguns NATs parecemapenasna porta e ignore completamente o endereço de origem; isso reduz o número de conexões possíveis, mas torna muito mais fácil para programas ponto a ponto realizarem "perfuração NAT".)
Esse estado é mantido mesmo para protocolos sem conexão, como UDP ou ICMP, de modo que as entradas expiram após algum intervalo de inatividade, mesmo que não haja nenhum pacote explícito de "conexão próxima". (A tabela de estados faz parte do firewall, portanto, mesmo que o NAT não seja executado, o roteador ainda poderá usá-lo para distinguir entre conexões "ativas" e pacotes perdidos.)
(Se o seu roteador for baseado em Linux conntrack -L
ou cat /proc/net/nf_conntrack
mostrar esta tabela. Para OpenBSD ou pfSense, tente pfctl -s state
.)