что такое SOCKS5-прокси в нашей статье мы познакомили с самим понятием. Здесь мы заглядываем внутрь протокола: какие байты ходят между клиентом и сервером, как указывается адрес и почему такая конструкция даёт более универсальный инструмент, чем HTTP-прокси?
SOCKS5 — довольно простой протокол, определённый в RFC 1928. Простота и есть источник его силы: он вообще не интерпретирует данные прикладного уровня, а лишь переносит трафик TCP (и опционально UDP).
Трёхэтапное рукопожатие
Если аутентификация не требуется, три круга сокращаются до двух. По сравнению с методом CONNECT в HTTP-прокси требуется немного больше кругов, но байтов намного меньше.
Этап 1 — Приветствие
В первом пакете клиент сообщает версию протокола и поддерживаемые им методы аутентификации:
Сервер сообщает свой выбор однобайтовым ответом: 0x00 (аутентификация не требуется), 0x02 (логин/пароль) или 0xFF (нет подходящего метода).
Сервер 0xFF если возвращается и соединение закрывается, значит ваш клиент не предлагает метод аутентификации, которого ожидает сервер. Это самая частая причина жалобы «соединение закрылось без сообщений».
Этап 2 — Аутентификация
Если выбран метод 0x02, выполняется подсогласование, определённое в RFC 1929: байт версии, длина имени пользователя и имя пользователя, длина пароля и пароль. Сервер возвращает однобайтовый признак успеха/неудачи.
За подробным сравнением и практической настройкой к нашей статье об аутентификации SOCKS5 можно посмотреть.
Этап 3 — Запрос CONNECT
После прохождения аутентификации клиент сообщает цель. Здесь вступает в игру важнейшее проектное решение SOCKS5: адрес может быть задан в трёх разных форматах.
ATYP=0x03 означает доменное имя; в этом случае DNS-разрешение выполняет прокси. Этот единственный байт — ключ к предотвращению утечки DNS.
Почему универсальнее, чем HTTP-прокси?
HTTP-прокси читает и интерпретирует запрос; SOCKS5 только переносит. Поэтому через SOCKS5 одновременно могут проходить электронная почта, игры, передача файлов и трафик браузера.
| Функция | HTTP-прокси | SOCKS5 |
|---|---|---|
| Уровень работы | Прикладной (7) | Сеансовый (5) |
| Поддержка протоколов | Только HTTP(S) | Любой TCP, опционально UDP |
| Интерпретация содержимого | Да | Может ли добавлять заголовки |
| Добавление заголовков | Может | Не может |
| Кеширование | Возможно | Невозможно |
| Разрешение DNS | На стороне прокси | На выбор (ATYP) |
| Круг рукопожатия | 1 (CONNECT) | 2–3 |
За подробным сравнением разница между HTTP-прокси и SOCKS5 смотрите нашу статью.
Выполняет ли SOCKS5 шифрование?
Нет. Это самое распространённое заблуждение. SOCKS5 — транспортный протокол; он не предоставляет шифрования. Безопасность вашего трафика зависит от собственного шифрования передаваемого содержимого:
- Если идёт по HTTPS: TLS защищает сквозным образом; прокси не видит содержимое.
- Если это обычный HTTP: Оператор прокси может прочитать содержимое.
- Учётные данные: Имя пользователя и пароль SOCKS5 передаются открытым текстом.
Учётные данные SOCKS5 передаются без шифрования. Если вы используете SOCKS5-прокси в ненадёжной сети, ваши учётные данные может прочитать наблюдатель посередине. В этом сценарии безопаснее использовать SOCKS5 через SSH-туннель — метод в отдельной статье — загляните туда.
Практическое применение
socks5h в схеме h означает "hostname" и обеспечивает выполнение DNS-разрешения на стороне прокси. Чтобы предотвратить утечку, всегда предпочитайте именно это.
Когда стоит выбрать SOCKS5?
Выберите SOCKS5
- Если вы будете переносить протоколы помимо HTTP (электронная почта, FTP, игры).
- Если вы хотите выполнять DNS-разрешение на стороне прокси.
- Если нужен UDP-трафик.
- Если вы не хотите, чтобы прокси трогал ваши заголовки.
- Если приложение поддерживает только SOCKS.
Достаточно HTTP прокси
- Если вы будете переносить только веб-трафик.
- Если вам нужно кэширование.
- Если ваш инструмент поддерживает только HTTP-прокси.
- Если важно минимальное число кругов рукопожатия.
- Если нужны корпоративные правила фильтрации.
Резюме
SOCKS5 — простой протокол сеансового уровня, который переносит трафик TCP и UDP, вообще не заглядывая в данные приложения. Благодаря трёхэтапному рукопожатию, поддержке трёх типов адресов и варианту с доменным именем он даёт возможность предотвратить утечку DNS. Шифрования он не обеспечивает; безопасность зависит от собственного шифрования передаваемого содержимого. Если вам нужно переносить не только веб-трафик, это правильный инструмент. За подробностями о продуктах на нашу страницу SOCKS5-прокси, для тестирования к нашему инструменту проверки прокси можно посмотреть.