SOCKS5
SOCKS5 запускает TCP-прокси: клиент проходит выбор метода и аутентификацию, запрашивает CONNECT к IPv4-адресу или hostname, затем обменивается байтами с upstream. SOCKS не разбирает HTTP и не выполняет MITM-расшифровку HTTPS.
Это запускаемый сервис из start.php и config.php, а не класс для new Socks5().
Установка и запуск
Заголовок раздела «Установка и запуск»Требуются PHP ^8.2 и Localzet Server ^4.1:
git clone https://github.com/localzet/SOCKS5.gitcd SOCKS5composer installЗадайте SOCKS5_USERNAME и SOCKS5_PASSWORD в защищённом окружении сервиса, затем выполните:
php start.php startБез обеих непустых credentials запуск отклоняется. Длина каждого поля ограничена 255 байтами. Не передавайте пароль аргументом shell-команды, который сохраняется в истории и списке процессов.
По умолчанию listener — 127.0.0.1:1080. Для остановки того же экземпляра:
php start.php stopЕсли меняли PID path через окружение, используйте его и при остановке. Для нескольких экземпляров нужны разные listener/port и PID/log paths.
Подключение клиента
Заголовок раздела «Подключение клиента»В SOCKS-клиенте задайте адрес listener, порт и credentials. Чтобы hostname передавался прокси и DNS выполнялся на его стороне, выберите remote DNS — например, socks5h в клиенте, который поддерживает такое обозначение.
Успешный CONNECT возвращается после установления upstream-соединения. HTTPS остаётся TLS-потоком между клиентом и целевым сайтом; plain HTTP сам SOCKS не шифрует.
Команды и адреса
Заголовок раздела «Команды и адреса»| Запрос | Поведение |
|---|---|
| TCP CONNECT к IPv4 | Исходящее TCP-соединение. |
| TCP CONNECT к hostname | Проверка hostname, затем IPv4 DNS A record. |
| IPv6 destination | Отклоняется. |
| BIND | Не реализован. |
| UDP ASSOCIATE | Отклоняется: штатная конфигурация отключает UDP. |
| Username/password | Основной метод по умолчанию. |
| No-auth | Только явно включённый loopback-режим. |
| GSSAPI | Не предоставляется конфигурацией. |
Окружение
Заголовок раздела «Окружение»| Переменная | Default | Условия |
|---|---|---|
SOCKS5_BIND | 127.0.0.1 | Корректный IPv4-адрес. |
SOCKS5_PORT | 1080 | Целое 1–65535. |
SOCKS5_USERNAME, SOCKS5_PASSWORD | Нет | Обязательны вне no-auth. |
SOCKS5_ALLOW_NO_AUTH | Выключен | Только точное 1, bind должен начинаться с 127.. |
SOCKS5_PID_FILE | <sys_get_temp_dir()>/localzet-socks5.pid | Файл управления экземпляром. |
SOCKS5_LOG_FILE | <sys_get_temp_dir()>/localzet-socks5.log | Лог сервиса. |
No-auth включается вместо username/password, а не как дополнительный обход проверки при неверном пароле. Изменение config.php напрямую требует понимания обработчиков; env-флага для включения UDP нет.
Неполные TCP-пакеты
Заголовок раздела «Неполные TCP-пакеты»HandshakeBuffer накапливает данные до целого greeting, auth или CONNECT request. Несколько стадий могут прийти одним фрагментом, одна стадия — многими. Данные приложения, пришедшие сразу после CONNECT request, сохраняются и отправляются upstream после успешного подключения.
Лимит handshake buffer — 65 536 байт. На переход к relay даётся 10 секунд с момента принятия соединения. После перехода в stream этот timer удаляется; это не общий timeout или лимит объёма установленного relay.
Размещение и права
Заголовок раздела «Размещение и права»Username/password SOCKS5 не шифрует credentials на участке клиент–прокси. Для удалённого подключения нужен доверенный/защищённый транспорт и ограничение входящих адресов.
Аутентифицированный клиент получает исходящий доступ машины прокси, включая доступные ей внутренние сети. Сам сервис не содержит ACL целей, rate limit или многопользовательскую базу прав. Допустимые destinations и egress-policy задавайте инфраструктурой.
Handshake API, ответы и диагностика
Исходный код · AGPL-3.0