Perfuração UDP ou TCP para conectar dois peers (cada um por trás de um roteador)

1

Estou tentando conectar diretamente (sem servidor de terceiros) meu computador ao computador de um amigo. Estamos ambos por trás de um roteador ISP e gostaríamos (como um desafio!) De conectar sem modificar a configuração do roteador .

Como sugerido aqui e aqui , tentamos a perfuração TCP:

myself$ nc -p 7777 public-ip-friend 8888
friend$ nc -p 8888 public-ip-myself 7777
Puncionamento

e UDP:

myself$ nc -u -p 7777 public-ip-friend 8888
friend$ nc -u -p 8888 public-ip-myself 7777

mas nenhum deles funcionou.

Como resolver isso?

Nota: VPS (não atrás de um NAT) < - > meu computador de casa (ainda por trás do roteador) funciona com o mesmo método.

    
por Basj 02.02.2018 / 17:07

1 resposta

1

Às vezes, os comandos dados na pergunta funcionam, mas às vezes não.

Aqui está o motivo.

Digamos que:

  • o IP do meu computador na minha rede local: 192.168.1.10
  • meu IP público em casa: 203.0.113.10
  • IP público do meu amigo: 198.51.100.27

Ao fazer isso no meu computador:

myself$ nc -u -p 7777  198.51.100.27 8888

temos, antes da tradução do NAT:

srcip          srcport         destip            destport
192.168.1.10   7777            198.51.100.27     8888

mas depois da tradução NAT do roteador doméstico, temos:

srcip          srcport         destip            destport
203.0.113.10   55183(*)        198.51.100.27     8888

i.e. o IP de origem é reescrito pelo NAT , mas também pela porta de origem .

Assim, um "buraco" será realmente criado no meu firewall (aceitando o tráfego do meu amigo 198.51.100.27), mas para a porta 55183 e não para a porta 7777.

Isso explica por que ele falha quando meu amigo:

friend$ nc -u -p 8888 203.0.113.10 7777

Nota (*): Em alguns casos, o roteador pode manter srcport = 7777 em vez de reescrevê-lo em uma porta aleatória como 55183. Neste caso, a solução dada na pergunta pode funcionar. Mas isso é um comportamento aleatório!

    
por 05.02.2018 / 11:18