HTTP CONNECT туннель: как работает
HTTP-прокси изначально задумывался для кэширования GET-запросов к http:// сайтам. Современный веб живёт на HTTPS, и ключевой механизм — метод CONNECT из RFC 7231. Он превращает прокси в blind TCP relay: после успешного handshake клиент и сервер обмениваются байтами, а прокси не парсит HTTP внутри туннеля. Без CONNECT браузер не открыл бы https:// сайты через классический HTTP proxy.
Синтаксис запроса CONNECT
Клиент отправляет текстовый запрос:
CONNECT www.example.com:443 HTTP/1.1
Host: www.example.com:443
Proxy-Authorization: Basic …
Прокси резолвит имя (или использует переданный IP), открывает TCP к www.example.com:443. При успехе — HTTP/1.1 200 Connection Established с пустым телом. Дальше канал становится двусторонним pipe: TLS, WebSocket или любой бинарный протокол.
Отличие от обычного GET через прокси
Для http:// (без S) прокси может работать как forward proxy: сам делает GET к origin и возвращает ответ клиенту — absolute URI в строке запроса. Для HTTPS forward mode неприменим без расшифровки. CONNECT создаёт tunnel; SSL — в отдельном разборе HTTPS CONNECT.
Нестандартные порты (8443, 4443) поддерживаются тем же CONNECT — укажите host:port. SOCKS5 делает аналог через другой handshake — см. сравнение протоколов.
Коды ответов прокси
200 — туннель открыт. 407 — нужна аутентификация; повторите CONNECT с credentials — гайд по auth. 403/502 — прокси или upstream запретил целевой host (policy, geo block). 504 — timeout к origin.
Клиент должен закрывать tunnel явно при отмене запроса — иначе на прокси висят idle connections.
Примеры настройки
curl: curl -x http://user:pass@host:port https://example.com — curl сам отправит CONNECT для HTTPS URL.
Python requests: proxies={"https": "http://user:pass@host:port"} — библиотека использует CONNECT для https:// targets. Подробнее — requests.
Браузер: укажите HTTP proxy host:port в настройках; CONNECT для каждого HTTPS tab выполняется автоматически.
Отладка CONNECT в Wireshark
На клиенте в cleartext виден только handshake до 200 Established — дальше encrypted. Фильтр http.request.method == "CONNECT" показывает целевые host:port. Если видите CONNECT к неожиданным доменам — malware или misconfigured app. Legitimate browser шлёт CONNECT на каждый HTTPS origin отдельно (до HTTP/2 connection coalescing в новых версиях).
Keep-Alive на control connection экономит TCP handshake к прокси при серии запросов — curl --proxy-anyauth переиспользует socket. Timeout idle tunnel обычно 60–300 секунд; long-polling и WebSocket держат tunnel открытым часами.
Ограничения и безопасность
Некоторые прокси блокируют CONNECT на порт 25 (anti-spam) или 22. Политика NEONPROXY ориентирована на web-трафик 443/80. CONNECT не скрывает факт использования прокси от destination — origin видит IP прокси как клиента. Для проверки исходящего адреса — Мой IP через настроенный прокси.
Corporate transparent proxy иногда перехватывает CONNECT без явной настройки — отличайте explicit proxy (ваш выбор) от ISP-level interception. При chained proxy порядок auth: сначала outer, потом inner — иначе 407 на неправильном уровне.
HTTP/2 к прокси
Некоторые прокси поддерживают HTTP/2 для control connection — multiplex нескольких CONNECT на одном TCP к proxy server. Экономит latency при burst HTTPS requests из browser.
Persistent CONNECT + subsequent requests: после tunnel close browser may reuse proxy connection for new CONNECT. Proxy-Connection: keep-alive header legacy but still seen in wild.
HTTP/2 к прокси
Некоторые прокси поддерживают HTTP/2 для control connection — multiplex нескольких CONNECT на одном TCP к proxy server. Экономит latency при burst HTTPS requests из browser.
Persistent CONNECT + subsequent requests: после tunnel close browser may reuse proxy connection for new CONNECT. Proxy-Connection: keep-alive header legacy but still seen in wild.
Proxy auto-config PAC
PAC file returns PROXY host:port for *.example.com DIRECT otherwise. Browser evaluates PAC before CONNECT; misconfigured PAC sends internal URLs through external proxy — leak risk. WPAD in corporate AD — test PAC rules when QA from home office.
Краткий чеклист
HTTPS URL в curl -x вызывает CONNECT. 407 — добавьте Proxy-Authorization. После 200 Established идёт TLS handshake. SOCKS5 для приложений без HTTP proxy. Один CONNECT на origin — типичный паттерн. Keep-alive снижает TCP overhead к прокси.
Wireshark filter http.request.method==CONNECT помогает отладить поведение клиента.