НОСКИ
Набор интернет-протоколов |
---|
Прикладной уровень |
Транспортный уровень |
Интернет-слой |
Слой связи |
SOCKS — это интернет- протокол , который обменивается сетевыми пакетами между клиентом и сервером через прокси-сервер . SOCKS5 дополнительно обеспечивает аутентификацию , поэтому доступ к серверу могут получить только авторизованные пользователи. На практике сервер SOCKS передает TCP-соединения на произвольный IP-адрес и предоставляет средства для пересылки UDP-пакетов. Сервер SOCKS принимает входящее клиентское соединение через TCP-порт 1080, как определено в РФК 1928 . [1]
История [ править ]
Первоначально протокол был разработан/спроектирован Дэвидом Кобласом, системным администратором MIPS Computer Systems . После того как в 1992 году MIPS перешла во владение компании Silicon Graphics , Коблас представил доклад о SOCKS на симпозиуме по безопасности Usenix в том же году. [2] сделать SOCKS общедоступным. [3] Протокол был расширен до версии 4 Инь-Да Ли из NEC .
Эталонная архитектура и клиент SOCKS принадлежат Permeo Technologies , [4] спин-офф от NEC . ( Blue Coat Systems выкупила Permeo Technologies и, в свою очередь, была приобретена Symantec.)
Протокол SOCKS5 изначально был протоколом безопасности, который упрощал межсетевых экранов администрирование и других продуктов безопасности. Он был одобрен IETF в 1996 году как RFC 1928 (авторы: М. Лич, М. Ганис, Ю. Ли, Р. Курис, Д. Коблас и Л. Джонс). Протокол был разработан в сотрудничестве с корпорацией Aventail , которая продает технологию за пределами Азии. [5]
Акроним [ править ]
SOCKS иногда определяют как аббревиатуру от «socket Secure», по крайней мере, начиная с 2001 года. [6] [7] [8] [9] [10] хотя изначально он не был определен как таковой в протоколе SOCKS версии 5 RFC в 1996 году. [11] или документ UNIX Security Symposium III в 1992 году. [2] но просто относится к конкретному прокси-протоколу, предназначенному для облегчения связи между клиентами и серверами через брандмауэр.
Использование [ править ]
SOCKS является де-факто стандартом для шлюзов уровня канала (шлюзы уровня 5). [12]
Характер SOCKS на уровне канала/сеанса делает его универсальным инструментом для пересылки любого трафика TCP (или UDP, начиная с SOCKS5), создавая интерфейс для всех типов инструментов маршрутизации. Его можно использовать как:
- Инструмент обхода, позволяющий трафику обходить интернет-фильтрацию и получать доступ к контенту, заблокированному в противном случае, например, правительствами, на рабочих местах, в школах и веб-сервисах для конкретной страны. [13] Поскольку SOCKS легко обнаруживается, общепринятым подходом является предоставление интерфейса SOCKS для более сложных протоколов:
- Программное обеспечение Tor onion-прокси предоставляет своим клиентам интерфейс SOCKS. [14]
- Обеспечение функциональности, аналогичной виртуальной частной сети , позволяющей перенаправлять соединения в «локальную» сеть сервера:
Протокол [ править ]
SOCKS4 [ править ]
Типичный запрос на подключение SOCKS4 выглядит так:
ВИДЕТЬ | КМД | ДСТПОРТ | ДСТИП | ИДЕНТИФИКАТОР | |
---|---|---|---|---|---|
Количество байтов | 1 | 1 | 2 | 4 | Переменная |
- ВИДЕТЬ
- Номер версии SOCKS, 0x04 для этой версии
- КМД
- код команды:
- 0x01 = установить TCP/IP потоковое соединение
- 0x02 = установить привязку порта TCP/IP
- ДСТПОРТ
- 2-байтовый номер порта (в сетевом порядке байтов )
- НАЧИНАТЬ
- IPv4- адрес, 4 байта (в сетевом порядке байтов)
- ИДЕНТИФИКАТОР
- строка идентификатора пользователя переменной длины, завершающаяся нулем .
ВН | РЕП | ДСТПОРТ | ДСТИП | |
---|---|---|---|---|
Количество байтов | 1 | 1 | 2 | 4 |
- ВН
- версия ответа, нулевой байт
- РЕП
- код ответа
Байт Значение 0x5A Запрос удовлетворен 0x5B Запрос отклонен или не выполнен 0x5C Запрос не выполнен, поскольку на клиенте не запущен identd (или он недоступен с сервера) 0x5D Запрос не выполнен, поскольку идентификатор клиента не смог подтвердить идентификатор пользователя в запросе.
- ДСТПОРТ
- порт назначения, имеет смысл, если предоставлен в BIND, в противном случае игнорируется
- ДСТИП
- IP-адрес назначения, как указано выше – ip:порт, к которому должен привязаться клиент.
Например, это запрос SOCKS4 на подключение Фреда к 66.102.7.99:80 , сервер отвечает «ОК»:
- Клиент:
0x04 | 0x01 | 0x00 0x50 | 0x42 0x66 0x07 0x63 | 0x46 0x72 0x65 0x64 0x00
- Последнее поле — «Fred» в ASCII , за которым следует нулевой байт.
- Сервер:
0x00 | 0x5A | 0xXX 0xXX | 0xXX 0xXX 0xXX 0xXX
- 0xXX может быть любым байтовым значением. Протокол SOCKS4 указывает, что значения этих байтов следует игнорировать.
С этого момента любые данные, отправляемые от клиента SOCKS на сервер SOCKS, передаются на адрес 66.102.7.99 и наоборот.
Поле команды может иметь значение 0x01 для «подключения» или 0x02 для «привязки»; команда «bind» разрешает входящие соединения для таких протоколов, как активный FTP .
SOCKS4a [ править ]
SOCKS4a расширяет протокол SOCKS4, позволяя клиенту указывать доменное имя назначения, а не IP-адрес; это полезно, когда сам клиент не может преобразовать доменное имя хоста назначения в IP-адрес. Его предложил Ин-Да Ли, автор SOCKS4. [16]
Клиент должен установить для первых трех байтов DSTIP значение NULL, а для последнего байта — ненулевое значение. (Это соответствует IP-адресу 0.0.0.x, где x не равен нулю, что является недопустимым адресом назначения и, следовательно, никогда не должно происходить, если клиент может разрешить имя домена.) После нулевого байта, завершающего USERID, клиент должен отправить имя домена назначения. и завершить его другим NULL-байтом. Это используется как для запросов «подключения», так и для «привязки».
Клиент для SOCKS-сервера:
SOCKS4_C | ДОМЕН | |
---|---|---|
Количество байтов | 8+переменная | переменная |
- SOCKS4_C
- Пакет подтверждения клиента SOCKS4 (вверху)
- ДОМЕН
- доменное имя хоста, с которым нужно связаться, ноль (0x00) завершен
Сервер-клиент SOCKS: (то же, что и SOCKS4)
Сервер, использующий протокол SOCKS4a, должен проверить DSTIP в пакете запроса . Если он представляет адрес 0.0.0.x с ненулевым x, сервер должен прочитать имя домена, которое клиент отправляет в пакете. Сервер должен разрешить имя домена и установить соединение с хостом назначения, если это возможно.
SOCKS5 [ править ]
Протокол SOCKS5 определен в РФК 1928 . Это несовместимое расширение протокола SOCKS4; он предлагает больше вариантов аутентификации и добавляет поддержку IPv6 и UDP , последний из которых можно использовать для поиска DNS . Первоначальное рукопожатие состоит из следующего:
- Клиент подключается и отправляет приветствие, которое включает список поддерживаемых методов аутентификации.
- Сервер выбирает один из методов (или отправляет ответ об ошибке, если ни один из них не приемлем).
- Теперь между клиентом и сервером может передаваться несколько сообщений, в зависимости от выбранного метода аутентификации.
- Клиент отправляет запрос на соединение, аналогичный SOCKS4.
- Сервер отвечает аналогично SOCKS4.
Первое приветствие от клиента такое:
ВИДЕТЬ | НАУТ | АУТ | |
---|---|---|---|
Количество байтов | 1 | 1 | переменная |
- ВИДЕТЬ
- Версия SOCKS (0x05)
- НАУТ
- Количество поддерживаемых методов аутентификации, uint8
- АУТ
- Методы аутентификации, поддерживается 1 байт на каждый метод.
- Поддерживаемые методы аутентификации пронумерованы следующим образом:
- 0x00: нет аутентификации
- 0x01: ГССАПИ ( РФК 1961 )
- 0x02: Имя пользователя/пароль ( РФК 1929 )
- 0x03–0x7F: методы, назначенные IANA. [17]
- 0x03: Протокол аутентификации вызова – рукопожатия
- 0x04: не назначено
- 0x05: Метод аутентификации запрос-ответ
- 0x06: уровень защищенных сокетов.
- 0x07: Аутентификация NDS
- 0x08: Платформа мульти-аутентификации
- 0x09: Блок параметров JSON
- 0x0A–0x7F: не назначены
- 0x80–0xFE: методы, зарезервированные для частного использования.
ВИДЕТЬ | КАУТ | |
---|---|---|
Количество байтов | 1 | 1 |
- ВИДЕТЬ
- Версия SOCKS (0x05)
- КАУТ
- выбранный метод аутентификации или 0xFF, если приемлемые методы не предложены
Последующая аутентификация зависит от метода. Аутентификация имени пользователя и пароля (метод 0x02) описана в RFC 1929 :
ВИДЕТЬ | ИДЛЕН | ИДЕНТИФИКАТОР | ПУЛЕН | ПВ | |
---|---|---|---|---|---|
Количество байтов | 1 | 1 | (1–255) | 1 | (1–255) |
- ВИДЕТЬ
- 0x01 для текущей версии аутентификации по имени пользователя и паролю.
- ИДЛЕН, ИД
- Длина имени пользователя, uint8; имя пользователя в виде байтовой строки
- ПУЛЕН, ПВ
- Длина пароля, uint8; пароль в виде байтовой строки
ВИДЕТЬ | СТАТУС | |
---|---|---|
Количество байтов | 1 | 1 |
- ВИДЕТЬ
- 0x01 для текущей версии аутентификации по имени пользователя и паролю.
- СТАТУС
- 0x00 успех, в противном случае неудача, соединение необходимо закрыть.
После аутентификации соединение может быть продолжено. Сначала мы определяем тип данных адреса как:
ТИП | АДРЕС | |
---|---|---|
Количество байтов | 1 | переменная |
- ТИП
- тип адреса. Один из:
- 0x01: IPv4-адрес.
- 0x03: Имя домена
- 0x04: IPv6-адрес.
- АДРЕС
- следующие адресные данные. В зависимости от типа:
- 4 байта для адреса IPv4.
- 1 байт длины имени, за которым следуют 1–255 байтов имени домена.
- 16 байт для адреса IPv6.
ВИДЕТЬ | КМД | РСВ | ДСТАДДР | ДСТПОРТ | |
---|---|---|---|---|---|
Количество байтов | 1 | 1 | 1 | Переменная | 2 |
- ВИДЕТЬ
- Версия SOCKS (0x05)
- КМД
- код команды:
- 0x01: установить потоковое соединение TCP/IP.
- 0x02: установить привязку порта TCP/IP.
- 0x03: привязать порт UDP
- РСВ
- зарезервировано, должно быть 0x00
- ДСТАДДР
- адрес назначения, см. структуру адреса выше.
- ДСТПОРТ
- номер порта в сетевом порядке байтов
ВИДЕТЬ | СТАТУС | РСВ | БНДАДДР | БНДПОРТ | |
---|---|---|---|---|---|
Количество байтов | 1 | 1 | 1 | переменная | 2 |
- ВИДЕТЬ
- Версия SOCKS (0x05)
- СТАТУС
- код статуса:
- 0x00: запрос удовлетворен
- 0x01: общий сбой
- 0x02: соединение не разрешено набором правил.
- 0x03: сеть недоступна
- 0x04: хост недоступен
- 0x05: соединение отклонено хостом назначения.
- 0x06: срок жизни истек.
- 0x07: команда не поддерживается/ошибка протокола
- 0x08: тип адреса не поддерживается.
- РСВ
- зарезервировано, должно быть 0x00
- БНДАДДР
- адрес привязки к серверу в формате «адрес SOCKS5», указанном выше
- БНДПОРТ
- номер порта, привязанного к серверу, в сетевом порядке байтов
Поскольку клиентам разрешено использовать либо разрешенные адреса, либо доменные имена, существует соглашение cURL обозначать вариант доменного имени SOCKS5 «socks5h», а другой — просто «socks5». Аналогичное соглашение существует между SOCKS4a и SOCKS4. [18]
Программное обеспечение [ править ]
Серверы [ править ]
Реализации прокси-сервера SOCKS [ править ]
- Веб-прокси-сервер Sun Java System — это кэширующий прокси-сервер, работающий на серверах Solaris, Linux и Windows, который поддерживает HTTPS, фильтры ввода-вывода NSAPI, динамическую реконфигурацию, SOCKSv5 и обратный прокси-сервер .
- WinGate — это многопротокольный прокси-сервер и SOCKS-сервер для Microsoft Windows, который поддерживает SOCKS4, SOCKS4a и SOCKS5 (включая аутентификацию UDP-ASSOCIATE и GSSAPI). Он также поддерживает передачу соединений SOCKS на HTTP-прокси, поэтому может кэшировать и сканировать HTTP через SOCKS.
- Socksgate5 SocksGate5 — это межсетевой экран SOCKS приложений с функцией проверки на уровне 7 модели OSI, прикладном уровне. Поскольку пакеты проверяются на уровне 7 OSI, брандмауэр приложения-SOCKS может искать несоответствие протоколу и блокировать указанный контент.
- Dante — это SOCKS-сервер канального уровня, который можно использовать для обеспечения удобного и безопасного сетевого подключения, требуя, чтобы только хост, на котором работает Dante, имел подключение к внешней сети. [19]
- HevSocks5Server — это высокопроизводительный и малозатратный SOCKS-сервер для Unix (Linux/BSD/macOS). Он поддерживает стандартные методы TCP-CONNECT и UDP-ASSOCIATE, а также аутентификацию с использованием нескольких имен пользователей и паролей.
-сервера предоставляющие интерфейс SOCKS программы , Другие
- OpenSSH позволяет динамически создавать туннели, указанные через подмножество протокола SOCKS, поддерживающее команду CONNECT.
- PuTTY — это SSH-клиент Win32, который поддерживает локальное создание (динамических) туннелей SOCKS через удаленные SSH-серверы.
- Secure ShellFish — это SSH-клиент для iOS и macOS, включающий сервер SOCKS.
- Мерцающий Кот [20] — это веб-сервер, использующий SOCKS5 для моделирования внутренней сети, позволяющий веб-разработчикам тестировать свои локальные сайты без изменения файла /etc/hosts .
- Tor — это система, предназначенная для обеспечения анонимности в Интернете. Tor предлагает своим клиентам серверный интерфейс SOCKS только с протоколом TCP.
- Shadowsocks — инструмент для обхода цензуры. Он обеспечивает интерфейс SOCKS5.
- реализации netcat , такие как Ncat и socat.
Клиенты [ править ]
Клиентское программное обеспечение должно иметь встроенную поддержку SOCKS для подключения через SOCKS.
Браузер [ править ]
- Chrome: поддержка SOCKS4, SOCKS4a и SOCKS5. [21]
- Firefox: поддержка SOCKS4, SOCKS4a и SOCKS5.
- Internet Explorer и Microsoft Edge на базе EdgeHTML: поддерживаются только SOCKS4.
- Microsoft Edge на базе Chromium: поддержка SOCKS4, SOCKS4a и SOCKS5.
Существуют программы, позволяющие пользователям обойти такие ограничения:
Носки [ править ]
Socksifiers позволяют приложениям получать доступ к сетям для использования прокси-сервера без необходимости поддерживать какие-либо протоколы прокси. Самый распространенный способ — настроить виртуальный сетевой адаптер и соответствующие таблицы маршрутизации для отправки трафика через адаптер.
- Win2Socks , который позволяет приложениям получать доступ к сети через SOCKS5, HTTPS или Shadowsocks.
- tun2socks, инструмент с открытым исходным кодом, который создает виртуальные адаптеры TCP TUN из прокси-сервера SOCKS, поддерживающие UDP, если они поддерживаются на другом конце. Работает в Linux и Windows, [22] имеет порт для macOS и перереализацию на Golang . [23] Другой, написанный на C, с хорошей производительностью, работает на Linux/Android/BSD/macOS и iOS. [24]
- proxychains — программа Unix, которая пропускает TCP-трафик через прокси-серверы SOCKS или HTTP в (динамически подключаемые) программы, которые она запускает. Работает на различных Unix-подобных системах. [25]
Перевод прокси [ править ]
- Polipo — прекращенный прокси-сервер пересылки и кэширования HTTP/1.1 с поддержкой IPv4 . Открытый исходный код, работающий на Linux , OpenWrt , Windows , Mac OS X и FreeBSD . Его может использовать практически любой веб-браузер.
- Privoxy — некэширующий прокси-сервер SOCKS-HTTP.
- Tinyproxy — облегченный демон прокси-сервера HTTP/HTTPS для операционных систем POSIX. Разработан с нуля, чтобы быть быстрым и в то же время небольшим. Он представляет собой интерфейс прокси-сервера http и может подключаться к восходящим прокси-серверам SOCKS4/5 и http.
Безопасность [ править ]
Из-за отсутствия шифрования запросов и обмена пакетами это делает SOCKS практически уязвимым для атак «человек посередине» и перехвата IP-адресов, что, как следствие, освобождает путь для цензуры со стороны правительств.
Ссылки [ править ]
- ^ «Реестр имен служб и номеров портов транспортного протокола» . Управление по присвоению номеров в Интернете . 19 мая 2017 года . Проверено 23 мая 2017 г.
- ^ Jump up to: а б Коблас, Дэвид; Коблас, Мишель Р. СОКС (PDF) . USENIX Симпозиум по безопасности UNIX III . Проверено 16 ноября 2019 г.
- ^ Дармохрей, Тина. « Брандмауэры и сказки ». ;АВТОРИЗОВАТЬСЯ:. Том 30, нет. 1.
- ^ Архивный указатель на Wayback Machine
- ^ CNET: Киберпространство из космоса
- ^ США US8984268B2
- ^ США US20210058367A1
- ^ США US11190374B2
- ^ ДП JP6761452B2
- ^ США US11425565B2
- ^ РФК 1928 . дои : 10.17487/RFC1928 .
- ^ Опплигер, Рольф (2003). «Шлюзы схемного уровня». Технологии безопасности во Всемирной паутине (2-е изд.). Артех Хаус. ISBN 1580533485 . Проверено 21 января 2020 г.
- ^ «Отчет об использовании средств обхода за 2010 г.» (PDF) . Беркмановский центр Интернета и общества при Гарвардском университете. Октябрь 2010.
- ^ «Часто задаваемые вопросы по Тору» .
- ^ «Часто задаваемые вопросы по OpenSSH» . Архивировано из оригинала 1 февраля 2002 г.
- ^ Ин-Да Ли. «SOCKS 4A: простое расширение протокола SOCKS 4» . ОпенСШ . Проверено 3 апреля 2013 г.
- ^ IANA.org
- ^ "CURLOPT_PROXY" . локон.se . Проверено 20 января 2020 г.
- ^ «Продукты, разработанные Inferno Nettverk A/S» . www.inet.no. Проверено 20 марта 2021 г.
- ^ «Легкая сеть с SOCKS5» . shimmercat.com . ШиммерКэт. Архивировано из оригинала 13 сентября 2018 г. Проверено 20 апреля 2016 г.
- ^ «Настройка прокси-сервера SOCKS в Chrome» . www.chromium.org . Проверено 19 марта 2024 г.
- ^ Биджак, Амброз (20 января 2020 г.). «ambrop72/badvpn: язык сценариев NCD, прокси-сервер tun2socks, P2P VPN» . Гитхаб . Проверено 20 января 2020 г.
- ^ «xjasonlyu/tun2socks: tun2socks — на базе стека TCP/IP gVisor» . Гитхаб .
- ^ «heiher/hev-socks5-tunnel: высокопроизводительный Tun2socks» . Гитхаб .
- ^ Хамсик, Адам (20 января 2020 г.). «proxychains: инструмент, который заставляет любое TCP-соединение, установленное любым приложением, следовать через прокси-сервер, такой как TOR или любой другой прокси-сервер SOCKS4, SOCKS5 или HTTP(S)» . Гитхаб . Проверено 20 января 2020 г.
Внешние ссылки [ править ]
- RFC 1928 : Протокол SOCKS версии 5.
- RFC 1929 : Аутентификация по имени пользователя и паролю для SOCKS V5.
- RFC 1961 : метод аутентификации GSS-API для SOCKS версии 5.
- RFC 3089 : механизм шлюза IPv6/IPv4 на основе SOCKS.
- Draft-ietf-aft-socks-chap , Протокол аутентификации Challenge-Handshake для SOCKS V5
- SOCKS: протокол TCP-прокси через брандмауэры , протокол SOCKS версии 4 ( NEC ).