Estou tentando conectar diretamente (sem servidor de terceiros) meu computador ao computador de um amigo. Ambos estamos atrás de um roteador ISP e gostaríamos (como um desafio!) de nos conectar sem modificar a configuração do roteador .
Conforme 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
e perfuração 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 doméstico (ainda atrás do roteador) funciona com o mesmo método.
Às vezes, os comandos fornecidos na pergunta funcionarão, mas às vezes não.
Aqui está a razão.
Digamos:
Ao fazer isso no meu computador:
temos, antes da tradução do NAT:
mas após a tradução NAT do roteador doméstico, temos:
ou seja, o IP de origem é reescrito pelo NAT, mas também pela porta de origem .
Portanto, um "buraco" será criado no meu firewall doméstico (aceitando 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 falha quando meu amigo o faz:
Nota (*): Em alguns casos, o roteador pode manter srcport=7777 em vez de reescrevê-lo em uma porta aleatória como 55183. Nesse caso, a solução fornecida na pergunta pode funcionar. Mas este é um comportamento aleatório!