Возможно, вы слышали socks5, но наверняка слышали и SS, SS — это использование внутреннего протокола socks5.
socks5 — это сетевой протокол передачи, который в основном используется для прозрачной передачи данных между клиентом и целевым сервером.
Протокол изначально был разработан, чтобы позволить авторизованным пользователям проходить через ограничения брандмауэров и получать доступ к внешним ресурсам.
1. RFC-адрес
- спецификация протокола socks5 rfc1928
- Спецификация аутентификации пароля учетной записи socks5 rfc1929
2. Протокольный процесс
- Клиентское соединение необходимо для отправки запроса на информирование сервера о текущей версии протокола SOCKS и поддерживаемом способе поддержки.
- Получив запрос, прокси-сервер возвращает его клиенту в соответствии с установленным им методом аутентификации.
- Если прокси-сервер не требует аутентификации, клиент напрямую инициирует реальный запрос к прокси-серверу.
- Прокси-сервер начинает пересылать трафик между клиентом и целевым сервером.
3. Процесс сертификации
3.1 Клиент делает запрос
После того, как клиент подключится к серверу, пакет будет отправлен непосредственно на прокси-сервер.
VERSION | METHODS_COUNT | METHODS... |
---|---|---|
1 байт | 1 байт | от 1 до 255 байт, длина определяется значением METHODS_COUNT |
0x05 | 0x03 | 0x00 0x01 0x02 |
- Версия Version Socks Protocol версии, в настоящее время исправлена на 0x05
- METHODS_COUNT Количество методов аутентификации, поддерживаемых клиентом
- Методы... поддерживаемый клиентом метод аутентификации, каждый метод занимает 1 байт
Метод определен
- 0x00 не требует сертификации (обычно)
- 0x01 GSSAPI аутентификация
- 0x02 Аутентификация по паролю учетной записи (обычно используется)
- 0x03 - 0x7F Распределение IANA
- 0x80 - зарезервирован частный метод 0xFE
- 0xFF Нет поддерживаемого метода аутентификации
3.2 Сервер возвращает выбранный метод аутентификации
Получив список методов аутентификации, поддерживаемых клиентом, прокси-сервер выбирает поддерживаемый метод и возвращает его клиенту.
3.2.1 Нет аутентификации
VERSION | METHOD |
---|---|
1 байт | 1 байт |
0x05 | 0x00 |
- ВЕРСИЯ Версия протокола SOCKS, в настоящее время исправлена на 0x05.
- METHOD Метод проверки подлинности, используемый для данного подключения.В приведенном выше примере проверка подлинности не требуется.
3.2.2 Аутентификация по паролю учетной записи
VERSION | METHOD |
---|---|
1 байт | 1 байт |
0x05 | 0x02 |
3.2.3 Клиент отправляет пароль учетной записи
Когда сервер возвращает метод аутентификации 0x02 (аутентификация учетной записи и пароля), клиент отправляет данные учетной записи и пароля на прокси-сервер.
VERSION | USERNAME_LENGTH | USERNAME | PASSWORD_LENGTH | PASSWORD |
---|---|---|---|---|
1 байт | 1 байт | 1-255 байт | 1 байт | 1-255 байт |
0x01 | 0x01 | 0x0a | 0x01 | 0x0a |
- VERSION Версия подсогласования аутентификации (не связанная с 0x05 версии протокола SOCKS)
- Username_length длина имени пользователя
- Массив байтов имени пользователя USERNAME, длина USERNAME_LENGTH
- PASSWORD_LENGTH длина пароля
- Массив байтов пароля PASSWORD, длина PASSWORD_LENGTH
3.2.4 Сервер отвечает на результат аутентификации учетной записи и пароля
После получения пароля учетной записи, отправленные клиентом, прокси-сервер проверит его и вернет результат проверки
VERSION | STATUS |
---|---|
1 байт | 1 байт |
- ВЕРСИЯ Версия подсогласования аутентификации, согласующаяся с клиентским полем ВЕРСИЯ
- СТАТУС результат сертификации
- 0x00 Аутентификация прошла успешно
- Ошибка аутентификации больше 0x00
4. командная процедура
После успешной аутентификации клиент отправит команду подключения на прокси-сервер, а прокси-сервер подключится к целевому серверу и вернет результат подключения.
4.1 запросы клиентов
VERSION | COMMAND | RSV | ADDRESS_TYPE | DST.ADDR | DST.PORT |
---|---|---|---|---|---|
1 байт | 1 байт | 1 байт | 1 байт | 1-255 байт | 2 байта |
- Версия Socks Протокольная версия, исправлена 0x05
- Команда команды
- 0x01 CONNECT подключиться к вышестоящему серверу
- 0x02 BIND привязка, клиент получит ссылку от прокси-сервера, знаменитый пассивный режим FTP
- 0x03 UDP ASSOCIATE Реле UDP
- Зарезервированные поля RSV
- Тип адреса целевого сервера ADDRESS_TYPE
- 0x01 IP-адрес V4
- 0x03 Адрес доменного имени (опечатки нет, то есть нет 0x02), первый байт адреса доменного имени — длина доменного имени, а остальные байты — массив байтов доменного имени
- 0x04 IP-адрес V6
- Адрес сервера назначения DST.ADDR
- Порт целевого сервера DST.PORT
4.2 Ответ прокси
VERSION | RESPONSE | RSV | ADDRESS_TYPE | BND.ADDR | BND.PORT |
---|---|---|---|---|---|
1 байт | 1 байт | 1 байт | 1 байт | 1-255 байт | 2 байта |
- Версия Socks Протокольная версия, исправлена 0x05
- ОТВЕТ команда ответа
- 0x00 Прокси-сервер успешно подключается к целевому серверу
- 0x01 сбой прокси-сервера
- 0x02 Набор правил прокси-сервера не разрешает подключение
- 0x03 Сеть недоступна
- 0x04 Целевой сервер недоступен (недопустимое имя хоста)
- 0x05 Подключение к целевому серверу отказано
- 0x06 TTL истек
- 0x07 Неподдерживаемая команда
- 0x08 Неподдерживаемый тип адреса целевого сервера
- 0x09 - 0xFF не назначено
- Зарезервированные поля RSV
- Bnd.addr Прокси-сервер IP после успешного подключения прокси-сервера к целевому серверу
- BND.PORT Порт прокси-сервера после успешного подключения прокси-сервера к целевому серверу.
5. Процесс коммуникации
После аутентификации и командного процесса клиент и прокси-сервер вступают в нормальную связь, клиент отправляет данные, которые необходимо запросить на целевом сервере, на прокси-сервер, прокси-сервер пересылает данные и пересылает ответ целевой сервер клиенту, который действует как функция «прозрачного прокси».
6. Практические примеры
Спецификация протокола подробно описана выше, а ниже приведен пример процесса связи.
В версии 6.2 никакая аутентификация и аутентификация по паролю учетной записи не являются взаимоисключающими., тот же запрос будет только один, эта статья указана ниже.
6.1 Клиент отправляет поддерживаемые методы аутентификации
0x05 0x02 0x00 0x02
- 0x05 версия протокола SOCKS5
- 0x02 Количество поддерживаемых методов аутентификации
- 0x00 Нет аутентификации
- 0x02 Аутентификация по паролю учетной записи
6.2 Метод аутентификации, выбранный ответом сервера
6.2.1 не требуется сертификация
Ниже приведены не аутентификация, клиент получает ответ непосредственно к данным для передачи на целевой сервер к прокси-серверу, на этот раз в процесс ошибки связи
0x05 0x00
- 0x05 версия протокола SOCKS5
- 0x00 Нет аутентификации
6.2.2 Требуется аутентификация учетной записи и пароля
0x05 0x02
- 0x05 версия протокола SOCKS5
- 0x02 Аутентификация по паролю учетной записи
6.2.3 Клиент отправляет пароль учетной записи
0x01 0x04 0x61 0x61 0x61 0x61 0x04 0x61 0x61 0x61 0x61
- 0x01 Версия субсогласования
- 0x04 Длина имени пользователя
- 0x61 0x61 0x61 0x61 "aaaa" после преобразования в символы ascii
- 0x04 Длина пароля
- 0x61 0x61 0x61 0x61 "aaaa" после преобразования в символы ascii
6.2.4 Прокси-сервер отвечает на результат аутентификации
0x01 0x00
- 0x01 Версия субсогласования
- Сертификация 0x00 прошла успешно (то есть сервер агента позволяет учетной записи AAAA войти в систему с паролем aaaa)
6.3 Клиент запрашивает прокси-сервер для подключения к целевому серверу
Возьмите 127.0.0.1 и порт 80 в качестве примера.
0x05 0x01 0x01 0x01 0x7f 0x00 0x00 0x01 0x00 0x50
- 0x05 Версия протокола SOCKS
- 0x01 команда ПОДКЛЮЧИТЬ
- 0x01 зарезервированное поле RSV
- 0x01 Тип адреса — IPV4
- 0x7f 0x00 0x00 0x01 Целевой сервер IP - 127.0.0.1
- 0x00 0x50 Целевой серверный порт - 80
6.4 Прокси-сервер подключается к целевому хосту и возвращает результат клиенту
0x05 0x00 0x01 0x01 0x7f 0x00 0x00 0x01 0x00 0xaa 0xaa
- 0x05 версия протокола SOCKS5
- 0x00 Соединение успешно
- 0x01 зарезервированное поле RSV
- 0x01 Тип адреса — IPV4
- 0x7f 0x00 0x00 0x01 IP-адрес прокси-сервера после успешного подключения прокси-сервера к целевому серверу, 127.0.0.1
- 0xaa 0xaa Порт прокси-сервера После успешного подключения прокси-сервера (прокси-сервер использует этот порт для связи с целевым сервером), в этом случае номер порта 43690
Клиент 6.5 отправляет запрос на данные прокси-сервера
Если клиенту необходимо запросить службу HTTP целевого сервера, он будет отправлять пакеты протокола HTTP на прокси-сервер, а прокси-сервер будет пересылать эти пакеты на целевой сервер в том виде, в котором они есть, и отправлять ответ целевого сервера на Выполните любой анализ пакетов от клиента или целевого сервера.
7. Конец
Это конец объяснения протокола SOCKS5.Позже GOLANG будет использоваться для реализации сервера SOCKS5 для описания разработки сервера протокола TCP.