Como um servidor da Internet responde a uma solicitação de um IP privado?

0

Estou aprendendo sobre IPs privados / públicos, 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 envíemos solicitações http para yahoo.com). O servidor vê os dois usuários como um único ip público e frequentemente - como neste caso - comunicando-se na mesma porta. Como o roteador rotear os pacotes de acordo com as duas conexões diferentes? Existe alguma informação de roteamento dentro do pacote além do ip / port? Existe alguma 'tabela de sessão' mantida em algum lugar? Por quem e o que exatamente isso inclui?

    
por Ofek Shilon 23.09.2017 / 17:46

1 resposta

2

Dentro de um computador, entre processos

Primeiro, vamos ver como um computador único distingue entre conexões simultâneas.

A maioria dos protocolos de transporte, como TCP, UDP, SCTP , usam duas portas, origem e destino , ou seja, um em cada extremidade da conexão. Ou seja, os pacotes não simplesmente andam "por" uma porta; em vez disso, eles viajam da porta X para a porta Y

.

A porta destination é geralmente bem conhecida (80 para HTTP, 53 para DNS…) mas a porta source é geralmente escolhida aleatoriamente pelo próprio SO, que também garante que a combinação src / dst seja única.

Assim, quando o seu navegador faz múltiplas conexões "para a porta 80 do Yahoo", todas elas têm diferentes portas de origem , e o SO mantém uma tabela de socket 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 de yahoo.server:80 para a 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 o NAT ainda , e acontece da mesma maneira mesmo se você estiver conectado diretamente. (NAT fará uso disso, no entanto.)

(Você pode ver essa tabela usando netstat -n ou várias ferramentas gráficas no Windows. Muitas vezes, "local / remoto" são rotulados como "origem / destino", embora isso não seja inteiramente exato.)

Dentro de uma rede NATed, entre computadores

A resposta à sua pergunta sobre o NAT é muito semelhante, apenas tudo é feito em uma escala maior.

O roteador que executa o NAT mantém uma tabela de "estado" contendo os endereços interno e externo & portas. Por exemplo, se suas duas solicitações HTTP usassem conexões TCP separadas, elas poderiam 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 para o REPLY-DST (seu endereço IP público), ele sabe que o destino real deve ser obtido da coluna ORIG-SRC a fim de desfazer o NAT.

(Se não houver um estado correspondente, as regras de encaminhamento de porta configuradas manualmente serão processadas. Se ainda não houver nenhuma correspondência, o pacote foi realmente destinado ao próprio roteador.)

Observe como a tabela de estados contém endereços e ports , permitindo que várias conexões ao 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 parecem somente na porta e ignoram completamente o endereço de origem; isso reduz o número de conexões possíveis, mas torna muito mais fácil para os programas ponto-a-ponto realizar "perfuração de furos NAT".)

Esse estado é mantido mesmo para protocolos sem conexão, como UDP ou ICMP; portanto, as entradas expiram após algum intervalo de inatividade, mesmo que não exista um pacote "conexão próxima" explícito. (A tabela de estados é, na verdade, parte do firewall, portanto, mesmo que o NAT não esteja pronto, o roteador ainda poderá usá-lo para distinguir entre conexões "ativas" e pacotes dispersos).

(Se o seu roteador é baseado em Linux, conntrack -L ou cat /proc/net/nf_conntrack mostraria esta tabela. Para o OpenBSD ou pfSense, tente pfctl -s state .)

    
por 23.09.2017 / 18:01