From Wikipedia (Ru) - Reading time: 2 min
SOCKS — сетевой протокол сеансового уровня модели OSI, который позволяет пересылать пакеты от клиента к серверу через прокси-сервер прозрачно (незаметно для них) и таким образом использовать сервисы за межсетевыми экранами (файрволами).
Более поздняя версия SOCKS5 предполагает аутентификацию, так что только авторизованные пользователи получают доступ к серверу.
Клиенты за межсетевым экраном, нуждающиеся в доступе к внешним серверам, вместо этого могут быть соединены с SOCKS-прокси-сервером. Такой прокси-сервер управляет правами клиента на доступ к внешним ресурсам и передаёт клиентский запрос внешнему серверу. SOCKS может использоваться и противоположным способом, осуществляя управление правами внешних клиентов соединяться с внутренними серверами, находящимися за межсетевым экраном (брандмауэром).
В отличие от HTTP-прокси-серверов, SOCKS передаёт все данные от клиента, ничего не добавляя от себя, то есть, с точки зрения конечного сервера, данные, полученные им от SOCKS-прокси, идентичны данным, которые клиент передал бы напрямую, без проксирования. SOCKS более универсален, он не зависит от конкретных протоколов уровня приложений (7-го уровня модели OSI) и оперирует на уровне TCP-соединений (4‑й уровень модели OSI). Зато HTTP-прокси кэширует данные и может более тщательно фильтровать содержимое передаваемых данных.
Протокол был разработан системным администратором компании MIPS Дэвидом Кобласом (David Koblas). После того, как в 1992 году MIPS вошла в состав корпорации Silicon Graphics, Коблас сделал доклад о SOCKS на Симпозиуме по безопасности Usenix, и SOCKS стал публично доступным. Четвёртую версию протокола разработал Ин-Да Ли (Ying-Da Lee) из NEC.
SOCKS-серверы обычно используют порт 1080[1].
SOCKS 4 предназначен для работы через межсетевой экран без аутентификации для приложений типа клиент-сервер, работающих по протоколу TCP, таких, как Telnet, FTP и таких популярных протоколов обмена информацией, как HTTP, WAIS и Gopher. По существу, SOCKS-сервер можно рассматривать как межсетевой экран, поддерживающий протокол SOCKS.
Типичный запрос SOCKS 4 выглядит следующим образом:
Запрос клиента к SOCKS-Серверу:
| Размер | Описание |
|---|---|
| 1 байт | Номер версии SOCKS, 1 байт (для этой версии должен быть 0x04) |
| 1 байт | Код команды:
|
| 2 байта | Номер порта |
| 4 байта | IP-адрес |
| n+1 байт | ID пользователя. Строка переменной длины, завершается NUL-байтом (0x00). Поле предназначено для идентификации пользователя (см. Ident) |
Ответ сервера SOCKS-Клиенту:
| Размер | Описание |
|---|---|
| 1 байт | Версия кода ответа, которая должна быть равна 0 |
| 1 байт | Код ответа:
|
| 2 байта | Номер порта |
| 4 байта | IP-адрес |
SOCKS 5[2] — это несовместимое расширение протокола SOCKS 4. Он добавляет поддержку UDP, обеспечивает универсальные схемы строгой аутентификации и расширяет методы адресации, добавляет поддержку доменных имен и адресов IPv6. Начальная установка связи теперь состоит из следующего:
Методы аутентификации пронумерованы следующим образом:
| 0x00 | Аутентификация не требуется |
| 0x01 | GSSAPI |
| 0x02 | Имя пользователя / пароль RFC 1929 |
| 0x03-0x7F | Зарезервировано IANA |
|---|---|
| 0x03 | CHAP |
| 0x04 | Не занято |
| 0x05 | Вызов-ответ (аутентификация) |
| 0x06 | SSL |
| 0x07 | NDS аутентификация |
| 0x08 | Фреймворк многофакторной аутентификации |
| 0x09 | Блок JSON-параметров |
| 0x0A–0x7F | Не занято |
| 0x80-0xFE | Зарезервировано для методов частного использования |
Начальное приветствие от клиента:
| Размер | Описание |
|---|---|
| 1 байт | Номер версии SOCKS (должен быть 0x05 для этой версии) |
| 1 байт | Количество поддерживаемых методов аутентификации |
| n байт | Номера методов аутентификации, переменная длина, 1 байт для каждого поддерживаемого метода |
Сервер сообщает о своём выборе:
| Размер | Описание |
|---|---|
| 1 байт | Номер версии SOCKS (должен быть 0x05 для этой версии) |
| 1 байт | Выбранный метод аутентификации или 0xFF, если не было предложено приемлемого метода |
Последующая идентификация зависит от выбранного метода.
Запрос клиента:
| Размер | Описание |
|---|---|
| 1 байт | Номер версии SOCKS (должен быть 0x05 для этой версии) |
| 1 байт | Код команды:
|
| 1 байт | Зарезервированный байт, должен быть 0x00 |
| 1 байт | Тип адреса:
|
| Зависит от типа адреса | Назначение адреса:
|
| 2 байта | Номер порта, в порядке от старшего к младшему (big-endian) |
Ответ сервера:
| Размер | Описание |
|---|---|
| 1 байт | Номер версии SOCKS (0x05 для этой версии) |
| 1 байт | Код ответа:
|
| 1 байт | Байт зарезервирован, должен быть 0x00 |
| 1 байт | Тип последующего адреса:
|
| Зависит от типа адреса | Назначение адреса:
|
| 2 байта | Номер порта, в порядке от старшего к младшему (big-endian) |
Список примеров в этой статье не основывается на авторитетных источниках, посвящённых непосредственно предмету статьи. |