Что такое SOCKS4a
SOCKS4a — расширение протокола SOCKS4, предложенное Ying-Da Lee. Ключевое отличие от оригинального SOCKS4: клиент может отправлять доменное имя вместо IP-адреса, а DNS-разрешение происходит на стороне прокси-сервера.
В стандартном SOCKS4 клиент должен сам разрешить доменное имя в IP перед отправкой запроса. Это создаёт проблему: DNS-запрос идёт напрямую от клиента, раскрывая информацию о посещаемых сайтах. SOCKS4a решает эту проблему.
Проблема SOCKS4 с DNS
Как работает SOCKS4
- Клиент хочет подключиться к example.com
- Клиент делает DNS-запрос напрямую (не через прокси)
- Получает IP 93.184.216.34
- Отправляет прокси команду: «подключись к 93.184.216.34:80»
- Прокси устанавливает TCP-соединение
Проблема: DNS-запрос на шаге 2 виден провайдеру, DNS-серверу и любому, кто наблюдает за трафиком. Это утечка DNS (DNS leak).
Как работает SOCKS4a
- Клиент хочет подключиться к example.com
- Клиент отправляет прокси: «подключись к example.com:80»
- Прокси сам разрешает example.com в IP
- Прокси устанавливает TCP-соединение
DNS-запрос полностью скрыт за прокси.
Техническая реализация
Формат запроса SOCKS4
| Поле | Размер | Описание |
|---|---|---|
| VER | 1 байт | Версия (0x04) |
| CMD | 1 байт | Команда (0x01 = CONNECT) |
| DSTPORT | 2 байта | Порт назначения |
| DSTIP | 4 байта | IP назначения |
| USERID | переменный | Строка идентификатора |
| NULL | 1 байт | 0x00 (завершение) |
Формат запроса SOCKS4a
Тот же формат, но с трюком: поле DSTIP содержит невалидный IP вида 0.0.0.x (где x > 0). После NULL-терминатора USERID добавляется доменное имя:
| Поле | Размер | Описание |
|---|---|---|
| VER | 1 байт | 0x04 |
| CMD | 1 байт | 0x01 |
| DSTPORT | 2 байта | Порт назначения |
| DSTIP | 4 байта | 0.0.0.1 (маркер SOCKS4a) |
| USERID | переменный | Строка идентификатора |
| NULL | 1 байт | 0x00 |
| DOMAIN | переменный | Доменное имя (example.com) |
| NULL | 1 байт | 0x00 |
Прокси видит IP вида 0.0.0.x и понимает, что после USERID следует доменное имя для разрешения.
SOCKS4 vs SOCKS4a vs SOCKS5
| Параметр | SOCKS4 | SOCKS4a | SOCKS5 |
|---|---|---|---|
| DNS на стороне прокси | Нет | Да | Да |
| Аутентификация | Нет | Нет | Да |
| UDP | Нет | Нет | Да |
| IPv6 | Нет | Нет | Да |
| Команда BIND | Да | Да | Да |
| Команда ASSOCIATE | Нет | Нет | Да |
Преимущества SOCKS4a
1. Устранение DNS-утечки
Главное преимущество — клиент не делает DNS-запросы напрямую. Вся DNS-активность скрыта за прокси.
2. Простота протокола
SOCKS4a проще SOCKS5 в реализации. Нет этапа аутентификации, нет поддержки UDP — только TCP CONNECT.
3. Обратная совместимость
SOCKS4a-клиент может работать с SOCKS4a-прокси, при этом формат запроса обратно совместим с SOCKS4.
4. Доступ к .onion и внутренним доменам
Поскольку DNS разрешается на стороне прокси, через SOCKS4a можно обращаться к доменам, которые не разрешаются публичными DNS (например, .onion через Tor).
Ограничения
1. Нет аутентификации
SOCKS4a не поддерживает аутентификацию. Любой, кто знает адрес прокси, может его использовать.
2. Нет UDP
Только TCP-соединения. DNS-запросы, VoIP, игровой трафик через UDP не поддерживаются.
3. Нет IPv6
Поле DSTIP — 4 байта, только для IPv4.
4. Устаревший протокол
SOCKS5 заменил SOCKS4a, предоставив все его возможности плюс аутентификацию, UDP и IPv6.
Когда использовать SOCKS4a
- Легаси-системы — старое ПО, не поддерживающее SOCKS5
- Простые сценарии — когда не нужна аутентификация и UDP
- Tor-соединения — Tor поддерживает SOCKS4a для разрешения .onion
- Минимальный overhead — когда важна минимальная задержка протокола
Поддержка в ПО
| Программа | SOCKS4a |
|---|---|
| curl | Да (--socks4a) |
| Tor | Да (основной протокол) |
| ProxyChains | Да |
| Firefox | Через network.proxy.socks_remote_dns |
| PuTTY | Да |
Заключение
SOCKS4a — важный эволюционный шаг от SOCKS4, решивший проблему DNS-утечек. Хотя сегодня SOCKS5 является стандартом, понимание SOCKS4a полезно для работы с легаси-системами и для понимания эволюции прокси-протоколов.