Извините за длинную историю, я пытался быть кристально чистым.
* Немного задом наперед *
В рамках проекта нам необходимо иметь доступ к определенным компьютерам (далее называемым клиентами) с помощью удаленного рабочего стола (RDP) с сервера с действительным IP-адресом. Эти клиенты находятся за NAT (например, за режимом DSL + маршрутизатор), поэтому у них нет действительного IP-адреса, но есть модем + маршрутизатор. Предположим, что все они работают на Windows 7 Ultimate, и в них нет брандмауэров, антивирусов или чего-либо, что блокирует трафик.
* До сих пор *
Первая и самая логичная вещь, которая приходит на ум, это использование опции перенаправления портов на модеме. Но реальный сценарий здесь заключается в том, что на этих клиентах запущено приложение (которое мы предоставили), и нам нужно приложение для переадресации портов, а не модем, потому что после развертывания системы мы не будем знать маршрутизатор модель, конфигурация и т. д. Кроме того, у нас не будет доступа к настройкам модема. Итак, предположим, что эта опция недоступна.
* выполнимый для нас вариант и конечно же проблема! *
Переходя к следующей опции, которая использует обратный туннель (или переадресацию удаленного порта), мы изменили приложение, чтобы создать 2 сокета. On используется для связи с сервером RDP на клиенте, а другой - для подключения к серверу (тот, который имеет действительный IP-адрес) для создания туннеля. На сервере есть другое приложение, которое получает весь трафик от клиента и отправляет его клиенту удаленного рабочего стола (через другой сокет) и наоборот. Так что архитектура выглядит примерно так:
|RDP SERVER|<->|Socket1|<->|Socket2|<->The Internet<->|Socket3|<->|Socket4|<->|RDP Client|
------------- Client side ----------- ------------- Server Side -----------
Сокет 1 находится на порту 17001 клиента и обменивается данными с портом 3389 клиента (RDP-сервер)
Сокет 2 находится на порту 17002 клиента и связан с портом 17002 сервера
Сокет 3 находится на порту 17002 сервера и обменивается данными с портом 17002 клиента
Сокет 4 находится на порту 17002 сервера и обменивается данными с портом 3389 сервера (клиент RDP)
С этого момента всякий раз, когда пользователь на сервере хочет установить подключение удаленного рабочего стола к клиенту за NAT, он подключается к сокету 4, и весь трафик перенаправляется на сокет 3, который, в свою очередь, передает трафик на сокет 2 и от розетки 2 до розетки 1 и наоборот.
Проблема заключается в том, что независимо от того, как клиент и сервер соединены, даже когда сервер и клиент находятся в одной сети, просто рядом друг с другом, после того, как RDP запросит у меня пароль для клиента, он случайным образом выполняет одно из следующих действий:
- иногда он подключается без проблем, я могу взаимодействовать с компьютером
- иногда это останавливается там
- иногда он входит и перед тем, как показать экран клиента, умирает.
Я проверил соединение, изменил модем, изменил клиент и сервер, и он все тот же. Я даже попробовал ssh-сервер на клиенте (freesshd) и использовал putty для удаленного переноса портов, и в результате получились странные ошибки на putty, которые привели к обрыву соединения. Я начинаю вырывать волосы! Есть идеи, что происходит?