Desculpe pela longa história, eu tentei ser cristalina.
* Um pouco de fundo *
Como parte de um projeto, precisamos ser capazes de acessar determinados computadores (daqui em diante chamados de clientes) usando o desktop remoto (RDP) de um servidor com um endereço IP válido. Esses clientes estão por trás do NAT (por exemplo, por trás de um DSL Mode + Router), portanto, eles não têm um endereço IP válido, mas o Modem + Router faz isso. Suponha que eles estejam todos rodando no Windows 7 Ultimate e que não haja firewalls, antivírus ou qualquer coisa que bloqueie o tráfego.
* Até agora *
A primeira e mais lógica coisa que vem à mente é usar a opção de encaminhamento de porta no modem. Mas, o cenário da vida real aqui é que esses clientes estão executando um aplicativo (que nós fornecemos) e precisamos que o aplicativo faça o encaminhamento de porta e não o modem, porque depois que implantamos o sistema, não saberemos o roteador modelo, configuração, etc. Além disso, não teremos acesso às configurações do modem. Então, suponha que essa opção não esteja disponível.
* opção viável para nós e, claro, o problema! *
Passando para a próxima opção, que está usando um túnel reverso (também conhecido como encaminhamento de porta remota), nós mudamos o aplicativo para criar 2 soquetes. On é usado para se comunicar com o servidor RDP no cliente e o outro para se conectar ao servidor (aquele com o IP válido) para fazer um túnel. No servidor, há outro aplicativo, que recebe todo o tráfego do cliente e o envia ao cliente de área de trabalho remota (por meio de outro soquete) e vice-versa. Então a arquitetura parece algo como:
|RDP SERVER|<->|Socket1|<->|Socket2|<->The Internet<->|Socket3|<->|Socket4|<->|RDP Client|
------------- Client side ----------- ------------- Server Side -----------
O soquete 1 está na porta 17001 do cliente e está se comunicando com a porta 3389 do cliente (RDP Server)
Soquete 2 está na porta 17002 do cliente e é a comunicação com a porta 17002 do servidor
Soquete 3 está na porta 17002 do servidor e está se comunicando com a porta 17002 do cliente
Soquete 4 está na porta 17002 do servidor e está se comunicando com a porta 3389 do servidor (cliente RDP)
A partir daí, sempre que o usuário no servidor quiser fazer uma conexão remota com o cliente por trás do NAT, ele se conectará ao soquete 4 e todo o tráfego será redirecionado para o soquete 3, que por sua vez transferirá o tráfego para soe 2 e do soquete 2 ao soquete 1 e o contrário.
O problema é que, independentemente de como o cliente e o servidor estão conectados, mesmo quando o servidor e o cliente estão na mesma rede, um após o outro, depois que o RDP me pergunta a senha do cliente, ele faz um dos seguintes base:
Eu verifiquei a conexão, mudei o modem, mudei o cliente e o servidor e ainda é o mesmo. Eu até tentei um servidor ssh no cliente ( freesshd ) e usei massa para porta remota para a frente e o resultado foram erros estranhos em massa que resultaram em conexão para soltar. Estou começando a tirar meu cabelo! Alguma idéia do que está acontecendo?