Технология реверсных соединений (reverse backconnect connections)

Вячеслав Волынец, 2010

В этой статье я расскажу немного о теории реверсных соединений, и, главное, покажу пример такой реализации — Реверсный бэк-коннект сокс сервер (Reverse back-connect socks server)

Немного теории

Классический сервер — это открытый порт, слушаемый определенной службой. Клиент подключается к открытому порту, если нужно — авторизуется, делает запрос, получает ответ.

Я хотел бы рассказать о backconnect сервере, или как его еще называют, реверсный сервер. Такой сервер порт не открывает, а подключается к открытому порту на клиенте. Звучит немного странно и непонятно, но сама эта технология не такая сложная как кажется на первый взгляд.

Итак, самый простой классический вариант:

Есть сервер, например HTTP, без открытого порта, или без возможности открытия порта (например, за NAT’ом или Firewall’ом)
Есть клиент, который хочет воспользоваться услугой сервера. Клиент имеет возможность открыть порт.
Сценарий их работы примерно такой:

  1. Серверу сообщают альтернативным способом (о нем я напишу позже), что его услугу (HTTP) ждёт клиент, имеющий адрес 192.168.1.5 и открытый порт, например, 65080
  2. Сервер подключается к клиенту простым TCP соединением
  3. Клиент принимает соединение и отправляет на сокет соединения данные для сервера, например HTTP запрос
  4. Сервер обрабатывает запрос и отправляет клиенту ответ
  5. Далее, в случае HTTP 1.0 — сервер разрывает соединение

Вопросы и ответы

Однако, на практике сценарий работы бэк-коннект сервера не так-то просто реализовать. Я, например, наткнулся на такой вопрос:

Каким таким «альтернативным способом» сервер, не имея открытого порта, должен понимать, что ему нужно подключиться на определенный адрес клиента?
А ответ такой: использовать промежуточный сервер. Тогда сценарий будет выглядеть так:

  1. Есть промежуточный сервер, который без проблем может открыть порт, например, 65080 для сервера, и 80 для клиентов
  2. Есть сервер (HTTP), который не может открыть порт, но он знает адрес промежуточного сервера, и его «серверный» порт 65080. Он подключается к промежуточному серверу Соединением 1.
  3. Есть обычный клиент, например браузер
  4. Клиент подключается к промежуточному серверу на порт 80 Соединением 2, и делает запрос
  5. Далее промежуточный сервер сообщает непосредственному исполнителю запроса, подключенному на порт 65080 Соединением 1, что появился запрос, и надо-бы его отработать
  6. Сервер получает запрос, подключается к промежуточному серверу еще одним Соединением 3, спрашивает у промежуточного сервера запрос, отрабатывает его и отправляет ответ на промежуточный сервер
  7. Промежуточный сервер пересылает ответ сервера (из Соединения 3) клиенту (на Соединение 2)
  8. Клиент завершает соединение

Вот такой способ решает вопрос альтернативного канала связи для сервера, не имеющего возможности открыть порт. Конечно, это не догма. Можно в качестве альтернативного способа использовать, например, электронную почту — сервер в цикле 1 раз в 1 минуту проверяет ящик, а клиент, когда хочет подключиться к серверу, отправляет на этот ящик письмо со своим адресом и открытым портом.

Reverse back-connect socks server (реверсный бек-коннект сокс сервер)

На практике мы реализовали реверсный бэк-коннект сокс-сервер (Reverse back-connect socks server).

reverse1

Reverse socks server

На компьютере, имеющем возможность открыть порт в качестве промежуточного сервера, запускается программа localserver (на рисунке), которая открывает 3 порта:

  1. для имитации socks сервера, например 1080
  2. для передачи команд на подключение удаленному реверсному socks серверу (1081)
  3. третий для для создания туннеля между удаленным соксом и промежуточным сервером (1082)

На компьютере-сервере ставится remoteclient. Он подключается к промежуточному серверу на порт 1081 и ждет команд на создание туннеля. Получив команду, создает туннель на порт 1082.
Клиентом может выступить любое приложение, работающее по протоколу SOCKS версий 4,4а,5. Настраивать такое приложение нужно на сокс [IP адрес промежуточного сервера]:1080.

Программа бесплатная и предоставлена исключительно для ознакомления с технологией работы. Если у вас появятся какие либо пожелания по усовершенствованию — пишите, звоните, обсудим.

Скачать можно здесь: reverseproxybeta.rar (пароль на архив: reverse_proxy)