Na verdade, você pode (mais ou menos)
É um pouco complicado e não funciona o tempo todo, mas aqui está a essência de como funciona:
Dado:
Routera com IP público 1.2.3.4
PC1 com IP privado ABCD (atrás do roteador A)
Routerb com IP público 5.6.7.8
PC2 com IP privado EFGH (atrás do roteador B)
Agora, dada uma solução ideal (ou seja, sem pat) ...
Etapa A:
Envie qualquer mensagem do PC1 em qualquer porta (10000 para este exemplo) para o IP público para o Routerb (4.5.6.7). Isso registrará o ABCD: 10000 -> 4.5.6.7:10000 no Nat e Pat for Routera. O Routerb descartará este pacote (como esperado porque não foi solicitado).
Etapa B: Ao mesmo tempo, envie continuamente um pacote do PC2 para o IP público do roteador A (1.2.3.4) na mesma porta (10000). Isso registrará EGFH: 10000 -> 1.2.3.4:10000 no NAT e Pat do roteador.
Etapa C:
Agora, aqui é onde acontece a mágica:
O PC2 está constantemente enviando pacote para o Routera, mantendo o 'buraco' aberto no roteador para que uma resposta volte. Quando o PC1 envia seu pacote único para o Routerb, ele parecerá o Routerb como uma resposta e, portanto, será encaminhado ao PC2. Depois que o PC2 receber essa 'resposta', verifique se mais um pacote sai e para de enviar pacotes contínuos. Este último pacote atuará como 'resposta' ao PC1 e passará pelo 'Hole' criado na Etapa A. e pronto! Agora você tem NAT transversal. Você só precisa enviar um único pacote a cada minuto ou mais, ambas as direções para manter o 'buraco' aberto.
Nota: Isso funciona apenas com o UDP, pois não tem conexão (os pacotes caídos estão ok).
Agora, quase todos os roteadores usam Pat, então você precisa 'adivinhar' qual porta 'responder' à maioria dos roteadores fará um deslocamento de +-10 (IEABCD: 10000 -> 5.6.7.8:10010).
Basta tentar alguns nesse intervalo (-10 a +10 até obter uma resposta)
O restante dos roteadores é aleatório em seu PAT. Nesse caso, você está ferrado ... tente a outra direção (ou seja, inicie a conexão na outra direção). Se isso falhar, você não pode se conectar ... desculpe)