À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!