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

Тема в разделе "Статьи", создана пользователем KaeraK, 23 янв 2012.

  1. KaeraK
    KaeraK Guest
    Нашел интересную статейку, которая четко дает возможность понять суть работы back-connect, в нашем случае в области Socks-серверов.

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

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

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

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

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

    Сценарий их работы примерно такой:
    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).

    [​IMG]​

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

    На компьютере-сервере ставится remoteclient. Он подключается к промежуточному серверу на порт 1081 и ждет команд на создание туннеля. Получив команду, создает туннель на порт 1082.

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

    Скачать
    Пароль на архив: reverse_proxy

     
    Последнее редактирование модератором: 23 янв 2012
    23 янв 2012
    1 человеку нравится это.
  2. digimon
    digimon Новичок
    Симпатии:
    6
    KaeraK,
    Интересно,возникли вопросы?
    можно ли организовать реверсный сокс сервер без промежуточного сервера,если да то как?
     
    23 янв 2012
  3. KaeraK
    KaeraK Guest
    Без промежуточного сервера, реверсный сокс, организовать нельзя. Если и можно, то наверное что-то с *NIX мудрить нужно, но я пока в этом мало чего понимаю =\
     
    23 янв 2012
  4. Дмитр
    Дмитр Новичок
    Симпатии:
    4
Загрузка...