Agora estou convencido de que o "UDP hole punching" direto entre 2 pessoas cada uma delas atrás de um NAT, sem servidor de terceiros, é realmente difícil / algumas vezes impossível (ver pergunta aqui e minha resposta abaixo).
Então, como fazer um furo UDP com um servidor de terceiros?
Exemplo:
peerA$ nc -u -p 7777 serverIP 8888
Agora, esse pacote é traduzido pelo NAT do peerA de localnetworkIP
para peerApublicIP
e a porta de origem é traduzida de 7777 para 55123.
Agora o servidor vê esse pacote chegando e se lembra da porta IP + pública 55er do peerA. Ele fornece essas informações (peerB IP público + 55123) para peerB e vice-versa (o processo semelhante descrito anteriormente acontece para peerB e o servidor lembra peerB public IP + source port que foi traduzido pelo NAT do peerB de 8888 para 42000).
Agora o peerA pode fazer isso
peerA$ nc -u -p 7777 peerBpublicIP 8888 # will be dropped by peerB but at least it will
# punch a hole in peerA's firewall, port 55123
e peerB sabem que, para conectar peerA, ele tem que usar o destino de porta 55123 (esta informação foi dada pelo servidor):
peerB$ nc -u -p 8888 peerApublicIP 55123
Pergunta: isso parece funcionar sob a seguinte suposição:
Se
peerA$ nc -u -p 7777 serverIP 8888
obtém sua porta de origem traduzida de 7777 para 55123, e então
peerA$ nc -u -p 7777 peerBpublicIP 8888
também terá a porta de origem 7777 traduzida para 55123.
Mas isso é realmente verdade na maioria dos roteadores?
Se não (exemplo: ao conectar ao servidor, o NAT traduz o 7777 para o 55123, mas ao conectar ao peerB, o NAT tranlsates 7777 ao 51098), como o furo UDP está funcionando?
TL; DR: Mais geralmente, como fazer um furo UDP com apenas netcat
, envolvendo peerA, peerB e um servidor (este último usado apenas no começo, e não depois)?
Observação: eu já li este artigo , mas não é óbvio se a tradução da porta é feita da mesma forma ao conectar o servidor e, em seguida, peerB.
Tags networking netcat udp