SOCKS5
SOCKS5
SOCKS5 — сетевой протокол, по которому программа просит посредника («прокси») установить TCP-соединение с нужным адресом и дальше просто перегоняет байты в обе стороны. Он ничего не знает о содержимом трафика: ни про HTTP, ни про почту, ни про игры — он работает на уровень ниже, чем сами протоколы приложений.
История
SOCKS родился в начале 1990-х внутри корпоративных сетей, когда появилась массовая проблема: компания ставит firewall (межсетевой экран), и вдруг ни одна внутренняя машина не может выйти наружу. Для каждого протокола писать свой шлюз — безумие: отдельный шлюз для FTP, отдельный для telnet, отдельный для почты. Хотелось один универсальный «пропускной пункт».
- ~1992, США. Дэвид Коблас (David Koblas) вместе с сыном Мишелем представил SOCKS на Usenix Security Symposium. Название — сокращение от SOCKetS (сокеты), то есть «универсальный посредник для сокетов».
- Начало 1990-х. Ин-Да Ли (Ying-Da Lee), тогда в NEC, расширил и распространил реализацию — то, что мы знаем как SOCKS4. У него было CONNECT и BIND, но не было ни нормальной аутентификации, ни IPv6, ни UDP. Позже появился неофициальный SOCKS4a, добавивший передачу доменного имени вместо IP — чтобы DNS-резолв делал прокси, а не клиент.
- Март 1996 — RFC 1928. Опубликована спецификация SOCKS Protocol Version 5. Авторы: M. Leech, M. Ganis, Y. Lee, R. Kuris, D. Koblas, L. Jones. Это и есть тот SOCKS5, который живёт до сих пор — тридцать лет, без замен и версии 6.
- RFC 1929 (1996) — аутентификация по логину и паролю. RFC 1961 (1996) — аутентификация через GSS-API (корпоративный Kerberos). То есть сам RFC 1928 описывает только «переговорную рамку» для методов аутентификации, а конкретные методы вынесены в отдельные документы.
Статус сегодня: SOCKS5 — стабильный интернет-стандарт без владельца. Порт по умолчанию — 1080 (IANA закрепила имя socks за ним). Ни один вендор его не контролирует, и именно поэтому он повсюду: от ssh -D до Tor.
Что это такое
Представь, что твоя программа хочет открыть TCP-соединение с example.com:443. Обычно она сама делает connect(). С SOCKS5 она вместо этого коннектится к прокси (скажем, 127.0.0.1:1080), говорит короткую служебную фразу: «версия 5, вот как я умею авторизоваться», при необходимости предъявляет логин и пароль, а потом — «CONNECT на example.com, порт 443». Прокси сам устанавливает соединение наружу, отвечает «готово», и с этого момента канал становится прозрачным: всё, что клиент пишет в сокет, попадает на example.com, и наоборот.
Ключевое слово — прозрачным. Прокси не парсит HTTP-заголовки, не подставляет X-Forwarded-For, не кэширует, не переписывает. Он труба.
Сравнения, которые важно держать в голове:
SOCKS5 vs HTTP-прокси. HTTP-прокси понимает HTTP: он видит URL, заголовки, может кэшировать, логировать, резать по домену. Для HTTPS он использует метод CONNECT и там тоже превращается в трубу — но только для того, что похоже на веб. SOCKS5 универсален: через него ходит IMAP, SSH, BitTorrent, игровой трафик, что угодно с TCP. Зато HTTP-прокси гораздо лучше поддержан в софте (особенно в браузерах) и умеет аутентификацию, которую понимают все.
SOCKS5 vs VPN. VPN работает на уровне сетевого интерфейса: весь трафик всей машины уходит в туннель, включая DNS и UDP, и приложение об этом не знает. SOCKS5 — на уровне приложения: туда идёт только тот софт, которому ты явно сказал. Это одновременно плюс (выборочность, ноль прав администратора) и минус (кто не настроен — тот утекает мимо).
SOCKS5 vs SOCKS4. Пятая версия добавила три вещи: аутентификацию (RFC 1929), IPv6 (ATYP = 0x04), и UDP через команду UDP ASSOCIATE. Плюс штатную передачу доменного имени (ATYP = 0x03), которая в четвёртой была костылём SOCKS4a.
SOCKS5 сам по себе не шифрует. Совсем. Если ты ходишь через него по HTTP, всё видно и прокси, и его провайдеру. Приватность даёт TLS внутри (то есть HTTPS) или обёртка вроде SSH-туннеля или Shadowsocks. SOCKS5 меняет только то, с какого IP выходит соединение.
Аналогии из жизни
Курьер-«купи-передай». Ты звонишь курьеру: «съезди в такой-то магазин, купи вот это». Он едет, продавец видит курьера, а не тебя. Ты остаёшься дома.
Где работает: адрес назначения знает только курьер, магазин видит его лицо и его район.
Где ломается: курьеру ты называешь адрес вслух — то есть прокси знает, куда ты идёшь, и знает, что это ты. SOCKS5 не анонимизирует тебя перед самим прокси. Плюс курьер может подсмотреть в пакет, если он не запечатан — то есть если внутри не TLS.
Стрелочник на железной дороге. Он не заглядывает в вагоны, ему всё равно, везут уголь или пассажиров — его дело перевести стрелку на нужный путь.
Где работает: отлично передаёт «протокол-агностичность» — SOCKS5 всё равно, что за трафик.
Где ломается: стрелочник переводит состав один раз и забывает о нём; SOCKS5-прокси, наоборот, держит соединение всё время жизни и гоняет через себя каждый байт в обе стороны. Он не разовая развилка, а постоянный участник.
Дежурный на проходной бизнес-центра. Ты подходишь, показываешь пропуск (аутентификация), говоришь, к кому идёшь, он звонит и проводит.
Где работает: точно передаёт последовательность: сначала переговоры и проверка, потом доступ.
Где ломается: на проходной ты дальше идёшь сам, а в SOCKS5 дежурный ходит вместо тебя и пересказывает разговор. И ещё: в реальном здании есть пожарные выходы — трафик может утечь мимо проходной (привет, UDP и WebRTC). У настоящей проходной такого нет, и это как раз самая опасная часть аналогии.
Как это работает
Протокол бинарный и удивительно короткий — его целиком можно реализовать за пару сотен строк, что регулярно и делают.
Шаг 1. Приветствие. Клиент шлёт: версия (0x05), сколько методов аутентификации знает, и список методов. Самые ходовые: 0x00 — без аутентификации, 0x02 — логин/пароль.
клиент → прокси: 05 02 00 02 (v5, 2 метода: no-auth и user/pass)
прокси → клиент: 05 02 (выбираю user/pass)
Если прокси не устраивает ни один метод, он отвечает 05 FF и рвёт соединение.
Шаг 2. Аутентификация (если выбран 0x02, по RFC 1929). Формат: версия подпротокола 0x01, длина логина, логин, длина пароля, пароль. Ответ — 0x01 и статус, где 0x00 значит «пустили».
Пароль летит открытым текстом
RFC 1929 не шифрует и даже не хэширует пару логин/пароль — это буквально байты в TCP-потоке. Если канал до самого прокси не защищён, креды видны любому на пути. Поэтому авторизованный SOCKS5 уместен внутри доверенной сети или поверх SSH, а не «через весь интернет по привычке».
Шаг 3. Запрос. Клиент говорит, чего хочет:
05 01 00 03 0B example.com 01BB
│ │ │ │ │ │ └── порт 443, 2 байта big-endian
│ │ │ │ │ └── само имя хоста
│ │ │ │ └── длина имени (11)
│ │ │ └── ATYP: 01=IPv4, 03=доменное имя, 04=IPv6
│ │ └── RSV: зарезервированный ноль
│ └── CMD: 01=CONNECT, 02=BIND, 03=UDP ASSOCIATE
└── версия 5
Шаг 4. Ответ. Прокси пробует подключиться и отвечает похожей структурой, где второй байт — код результата: 0x00 — успех, 0x03 — сеть недоступна, 0x04 — хост недоступен, 0x05 — соединение отвергнуто, 0x07 — команда не поддерживается. Дальше идут BND.ADDR/BND.PORT — адрес, с которого прокси вышел наружу.
Шаг 5. Данные. Никакого обрамления. Чистый двунаправленный поток байтов до закрытия.
Три команды стоит различать:
- CONNECT — 99% всего использования: «соединись наружу за меня».
- BIND — «открой порт и жди входящего». Наследие активного режима FTP; сегодня почти мёртвая команда, многие прокси её не реализуют.
- UDP ASSOCIATE — прокси выделяет UDP-порт, и клиент шлёт туда датаграммы, обёрнутые в маленький заголовок с адресом получателя. Именно этого не хватает во многих реализациях — и именно отсюда берутся утечки.
Отдельный практический сюжет — кто резолвит DNS. Если клиент сам превращает example.com в IP и шлёт ATYP=0x01, то DNS-запрос ушёл с твоей машины, с твоего IP — и наблюдатель видит, куда ты собрался, даже если само соединение прошло через прокси. Если клиент шлёт ATYP=0x03 (имя), резолвит прокси, и утечки нет. В curl это ровно разница между --socks5 и --socks5-hostname, а в URL-схемах — между socks5:// и socks5h://. Буква h значит «hostname через прокси». Дешёвый способ проколоться на пустом месте.
Где встречается в обычной жизни
- Tor Browser. Внутри — обычный локальный SOCKS5-прокси: демон Tor слушает порт 9050 (у Tor Browser — 9150), а браузер настроен на него. Вся «магия лукового роутинга» снаружи выглядит как строчка
socks5://127.0.0.1:9050. - Подключение к рабочей сети из кафе. Команда
ssh -D 1080 серверза одну секунду поднимает у тебя на ноутбуке SOCKS5-прокси, весь трафик которого вылезает наружу на сервере. Это самый частый «домашний VPN», который на самом деле не VPN. - Торрент-клиенты. В qBittorrent и Transmission поле «прокси» — это чаще всего SOCKS5. Именно там критично, поддерживает ли прокси UDP: без этого DHT и часть пиров пойдут мимо.
- Игры и мессенджеры с блокировками. Telegram, например, штатно умеет SOCKS5 прямо в настройках — поэтому его можно «починить» без установки VPN на всё устройство.
- Кто-то настраивает тебе интернет на работе. Корпоративный доступ к внутренним системам из дома часто оформлен как SOCKS-прокси с Kerberos-аутентификацией — той самой из RFC 1961.
Где встречается в IT и бизнесе
- Выход в сеть с нужного региона. Парсинг, проверка выдачи, тестирование гео-логики: «как выглядит мой сайт из Москвы / Новосибирска / Германии». Мобильные и резидентные прокси продаются именно так — как связка
host:port:login:passwordпо SOCKS5 или HTTP. - Ротация IP при автоматизации. Антибот-системы режут по адресу; пул из десятков прокси и смена точки выхода на каждую сессию — стандартная инженерная практика. Нужно, когда один IP быстро упирается в лимит.
- Доступ к закрытому контуру. Базы и админки, доступные только с бастион-хоста: вместо проброса каждого порта отдельно поднимают один SOCKS5 и ходят через него всем инструментарием.
- Обход цензуры и сетевых ограничений. Shadowsocks, V2Ray и подобные снаружи — зашифрованный транспорт, а для локального приложения — обычный SOCKS5-порт. Разделение обязанностей: шифрование отдельно, интерфейс отдельно.
- Отладка и запись трафика. Инструменты вроде mitmproxy умеют работать в SOCKS-режиме, когда приложение не умеет в HTTP-прокси, но умеет в SOCKS.
Кто пользуется
- Tor — сеть примерно с 2–3 миллионами ежедневных пользователей (по оценкам Tor Metrics; цифра плавает) — весь клиентский вход в неё идёт через SOCKS5.
- SSH — реализация
-Dесть в OpenSSH с 1990-х и стоит на каждой Linux/macOS-машине планеты. Это, вероятно, самый массово доступный SOCKS5-сервер в мире. - Индустрия прокси-провайдеров — Bright Data, Oxylabs, Smartproxy, российские proxys.io и подобные. Публично заявляемые пулы — десятки миллионов резидентных IP; проверить эти цифры со стороны нельзя, так что относись к ним как к маркетингу.
- Torrent-клиенты и приватные VPN-сервисы — почти все крупные предлагают SOCKS5-endpoint как лёгкую альтернативу полноценному туннелю.
- Корпоративные сети — Dante (популярный open-source SOCKS-сервер, Inferno Nettverk, Норвегия) и коммерческие шлюзы стоят периметром во многих банках и телекомах.
Альтернативы и конкуренты
HTTP-прокси (метод CONNECT).
Плюсы: поддержан абсолютно везде, включая браузеры; аутентификация логин/пароль работает без плясок; умеет фильтровать и логировать по домену.
Минусы: только TCP и по сути только веб-трафик; посредник видит домен даже в HTTPS (через SNI и строку CONNECT).
VPN (WireGuard, OpenVPN, IPsec).
Плюсы: заворачивает весь трафик машины, включая UDP и DNS; никаких «настрой каждое приложение»; шифрует по умолчанию.
Минусы: требует прав администратора и установки; всё или ничего (split tunneling настраивается отдельно и болезненно); легче детектируется и блокируется.
Shadowsocks / V2Ray / Xray.
Плюсы: зашифрованный транспорт, маскировка под обычный трафик, а локально — тот же удобный SOCKS5-порт; создавался (Китай, ~2012, автор под ником clowwindy) именно против цензуры.
Минусы: нужен свой сервер; экосистема фрагментирована, форков много, документация неровная.
MASQUE / CONNECT-UDP (RFC 9298, 2022).
Плюсы: современная замена, умеет проксировать UDP и QUIC поверх HTTP/3, уже используется Apple iCloud Private Relay.
Минусы: молодая, поддержки в обычном софте почти нет — пока это про инфраструктуру, а не про «настроил у себя за пять минут».
Когда НЕ стоит использовать
- Когда нужна анонимность от самого прокси. Оператор прокси видит твой IP, знает каждый домен, куда ты ходил, и время. Потому что так устроен протокол — он не для анонимности, а для смены точки выхода. Для анонимности нужна многослойная схема вроде Tor.
- Когда трафик должен быть защищён, а внутри не TLS. SOCKS5 не добавляет ни бита шифрования. Голый HTTP через SOCKS5 остаётся голым HTTP — просто с другого адреса.
- Когда нужно закрыть весь трафик устройства. SOCKS5 закрывает ровно то, что явно настроено. Всё остальное — системные обновления, фоновые приложения, часть UDP — пойдёт напрямую. Здесь честнее VPN.
- Когда критичен браузерный сценарий с авторизацией. Chromium (а значит Chrome, Edge и Playwright/Puppeteer поверх него) не умеет SOCKS5 с логином и паролем — это давнее ограничение самого браузера, не провайдера. Обходится либо HTTP-прокси, либо локальным мостом.
Самая дорогая ошибка — не в протоколе, а в проверке
Health-check «прокси жив» по коду ответа 200 ничего не доказывает: если соединение проскочило мимо прокси напрямую, сервис-определитель IP тоже вернёт 200 — просто с твоим настоящим адресом. Проверять надо содержимое ответа: совпадает ли увиденный IP с ожидаемым IP прокси. Разница между «запрос удался» и «запрос ушёл оттуда, откуда я думаю» стоит часов отладки.
Связанные понятия
- HTTP CONNECT — метод HTTP, превращающий прокси в прозрачный TCP-туннель; ближайший конкурент SOCKS5 по задаче.
- UDP ASSOCIATE — команда SOCKS5 для проксирования датаграмм; поддерживается далеко не всеми серверами и клиентами.
- WebRTC-утечка — ситуация, когда браузер через STUN/UDP узнаёт и раскрывает реальный IP в обход прокси; лечится флагом политики обработки IP в Chromium.
- QUIC / HTTP/3 — транспорт поверх UDP; классический HTTP-прокси его не проксирует, и трафик может пойти напрямую.
- DNS-утечка — резолв имени с твоей машины вместо прокси; в SOCKS5 лечится схемой
socks5h://иATYP=0x03. - Резидентные и мобильные прокси — точки выхода на IP реальных домашних или сотовых абонентов; дороже дата-центровых, но меньше вызывают подозрений у антиботов.
- Bastion host (бастион) — единственная машина с доступом в закрытый контур, через которую все и ходят; частый хозяин SOCKS5-порта.
Литература и источники
- RFC 1928, «SOCKS Protocol Version 5» (1996) — первоисточник, около десяти страниц, читается за вечер: https://www.rfc-editor.org/rfc/rfc1928
- RFC 1929, «Username/Password Authentication for SOCKS V5» — ещё короче, две страницы: https://www.rfc-editor.org/rfc/rfc1929
- RFC 9298, «Proxying UDP in HTTP» (2022) — если интересно, куда движется индустрия после SOCKS5: https://www.rfc-editor.org/rfc/rfc9298
- Wikipedia, статья «SOCKS» (en) — хороший обзор истории и версий: https://en.wikipedia.org/wiki/SOCKS
- Документация OpenSSH,
man ssh, опция-D— практика: как поднять SOCKS5 одной командой. - Документация curl про прокси — https://curl.se/docs/manpage.html, искать
--socks5-hostname; лучшее короткое объяснение разницыsocks5иsocks5h. - Dante SOCKS server — если нужен свой прокси-сервер: искать «Dante SOCKS server documentation», сайт inet.no.
Где встретилось у меня
Вчера разбирался с одним из автоматизационных агентов: ему понадобилось выходить в сеть с московских IP, и всплыл старый мостик — локальный скрипт, который поднимает у себя HTTP-прокси без пароля и внутри логинится в настоящий авторизованный SOCKS5 провайдера. Написан он был ровно из-за того, что Chromium не умеет авторизованный SOCKS5. В итоге выяснилось, что купленные точки оказались HTTP-прокси, а не SOCKS5, и мост вообще не понадобился. Зато дальше был целый день охоты за «утечкой IP» — проверяли гипотезы про WebRTC и QUIC, а причина оказалась в собственной проверке живости прокси, которая смотрела только на код ответа.
Краткое резюме
- SOCKS5 (RFC 1928, 1996) — универсальный TCP-посредник: клиент просит прокси соединиться с адресом, дальше канал прозрачен. Протокол приложения роли не играет.
- Рукопожатие — три коротких обмена: методы аутентификации → логин/пароль (если нужен) → CONNECT с адресом. Реализуется за пару сотен строк.
- Он не шифрует. Приватность даёт TLS внутри или обёртка вроде SSH/Shadowsocks. SOCKS5 меняет только точку выхода.
- Главные грабли: DNS-утечка (
socks5вместоsocks5h), отсутствие UDP в реализации, и невозможность авторизованного SOCKS5 в Chromium. - Проверять прокси надо по содержимому ответа (тот ли IP), а не по коду 200 — иначе «работает» и «работает через прокси» незаметно расходятся.