HTTP-туннель

HTTP-туннель — технология создания сетевого соединения между двумя компьютерами в условиях ограниченной сетевой доступности, включая межсетевые экраны, NAT и ACL, а также другие ограничения. Туннель создаётся с помощью посредника — прокси-сервера, который обычно размещается в DMZ.

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

Метод HTTP CONNECT

Наиболее распространённой формой HTTP-туннелирования является стандартизированный метод HTTP CONNECT[1].[2] В данном механизме клиент запрашивает у HTTP-прокси-сервера переадресацию TCP-соединения к нужному адресу назначения. Сервер устанавливает соединение от имени клиента, после чего продолжает проксировать TCP-поток между клиентом и назначением. Только начальный запрос выполняется через HTTP — затем прокси просто пересылает TCP-трафик без изменений.

Этот механизм позволяет клиенту, находящемуся за HTTP-прокси, получать доступ к сайтам, использующим TLS или SSL (то есть к HTTPS). Прокси-серверы могут ограничивать соединения, разрешая доступ только к стандартному порту HTTPS 443, создавая белый список определённых серверов либо блокируя трафик, который не выглядит как SSL.

Метод HTTP CONNECT не может перенаправлять соединения по протоколу UDP.

Пример установления соединения

Клиент подключается к прокси-серверу и запрашивает туннелирование, указывая порт и адрес компьютера назначения. Порт служит индикатором требуемого протокола[3].

CONNECT streamline.t-mobile.com:22 HTTP/1.1
Proxy-Authorization: Basic encoded-credentials

Если соединение разрешено и прокси подключился к указанному хосту, то будет возвращён код состояния 2XX[3].

HTTP/1.1 200 OK

Теперь клиент проксируется на удалённый хост. Любые данные, отправленные прокси, пересылаются без изменений на удалённый сервер[3], и клиент может общаться с ним по любому протоколу, поддерживаемому сервером. В примере ниже клиент инициирует SSH-соединение, что видно по номеру порта в изначальном запросе:

SSH-2.0-OpenSSH_4.3\r\n
...

HTTP-туннелирование без метода CONNECT

HTTP-туннель также может быть реализован только с использованием стандартных методов HTTP, таких как POST, GET, PUT и DELETE. Подобный подход применяется в технологии Bidirectional-streams Over Synchronous HTTP (англ. BOSH).

Специальный HTTP-сервер запускается вне защищённой сети, а клиент работает на компьютере внутри защищённой сети. Всякий раз, когда клиенту требуется отправить сетевой трафик, он инкапсулирует данные внутри HTTP-запроса и передаёт их внешнему серверу, который извлекает и выполняет исходный сетевой запрос от имени клиента. Ответ формируется как HTTP-ответ и возвращается к клиенту. Поскольку весь трафик инкапсулируется внутри стандартных GET и POST-запросов, такой подход работает через большинство прокси и файерволов[4].

Примечания

  1. Hypertext Transfer Protocol -- HTTP/1.1, Section 9.9 CONNECT. IETF RFC 2616. Internet Engineering Task Force (июнь 1999). Дата обращения: 16 января 2025.
  2. Hypertext Transfer Protocol -- HTTP/1.1. IETF RFC 2817. Internet Engineering Task Force (май 2000). Дата обращения: 16 января 2025.
  3. 1 2 3 HTTP/1.1 Semantics and Content, section 4.3.6 CONNECT. IETF RFC 7231. Internet Engineering Task Force (июнь 2014). Дата обращения: 16 января 2025.
  4. Bridge: A dynamic port forwarder over HTTP (with HTTP PROXY support). GitHub. Дата обращения: 16 января 2025.

Литература