Скрипт развёртывания SOCKS5-прокси: установка и настройка за 10 минут | AdminWiki

Скрипт развёртывания SOCKS5-прокси: установка и настройка за 10 минут

24 сентября 2026 14 мин. чтения

Что мы разворачиваем и зачем: SOCKS5-прокси на чистом сервере

Скрипт развёртывания закрывает четыре шага: проверяет зависимости, ставит выбранный демон (Dante или 3proxy), пишет конфиг с логином, паролем и белым списком IP, регистрирует сервис в systemd. На выходе вы получаете SOCKS5-прокси на порту 1080, который сам поднимается после перезагрузки и проверяется одной командой curl.

Ориентир в 10 минут реалистичен: машинная часть скрипта занимает 2-3 минуты, остальное уходит на создание пользователя и тестовое подключение. Ручная сборка того же результата обычно растягивается: синтаксис ACL у Dante неочевиден, правила firewall легко забыть, автозапуск настраивается отдельно.

Материал рассчитан на DevOps-инженеров и системных администраторов. Команды и конфиги даём готовыми к копированию, объясняем только места, где легко ошибиться. Третий вариант, SSH-туннель, тоже разберём: иногда демон на сервере не нужен вообще.

Какие задачи закрывает SOCKS5-прокси

SOCKS5 работает на уровне сессии: принимает соединение от клиента, устанавливает его к цели и дальше передаёт байты, не разбирая содержимое. HTTP-прокси, наоборот, понимает методы и заголовки HTTP, поэтому часть нестандартного трафика через него не проходит. Разницу между протоколами подробно разбираем в статье SOCKS5-прокси: чем он отличается от HTTP-прокси и когда его выбирать.

Прокси выручает в нескольких типовых сценариях:

  • Проксирование приложений, которые умеют только SOCKS5: клиенты баз данных, CLI-утилиты, мессенджеры, лаунчеры.
  • Обход гео-ограничений, когда сервис фильтрует клиентов по IP-адресу. Отдельно мы разбирали прокси для обхода региональных блокировок и критерии выбора провайдера.
  • Доступ к сервисам с привязкой к IP: партнёрские API, панели администрирования, внутренние реестры.
  • Разделение трафика, когда часть запросов идёт напрямую, а часть через конкретный выходной адрес.
  • Изоляция тестового трафика от остальной инфраструктуры.

Проверка после настройки выглядит так:

export PROXY_IP=адрес-сервера
export PROXY_USER=proxyuser
export PROXY_PASS=ChangeMe_2026
curl --socks5-hostname "$PROXY_USER:$PROXY_PASS@$PROXY_IP:1080" "$CHECK_URL"

В переменную CHECK_URL подставьте адрес сервиса, который возвращает внешний IP клиента. В ответе должен появиться IP прокси-сервера, а не адрес вашей рабочей машины.

Учитывайте границу протокола: SOCKS5 не шифрует трафик. Он аутентифицирует клиента и маршрутизирует соединение, а конфиденциальность данных обеспечивают прикладные протоколы поверх, например HTTPS или SSH.

Что понадобится для развёртывания

  • Чистый VPS или VDS с Ubuntu 22.04/24.04 либо Debian 12. Для других дистрибутивов команды пакетного менеджера придётся адаптировать.
  • Root или sudo: демон слушает непривилегированный порт, но установка пакетов и правка systemd требуют прав администратора.
  • SSH-доступ и разрешённый исходящий трафик. Если хостинг фильтрует исходящие соединения, прокси будет отвечать клиенту, но не сможет подключиться к цели.
  • Свободный порт 1080 (или любой другой на ваш выбор).
  • 10 минут времени.

Скрипт сам поставит dante-server либо 3proxy, а также curl, ufw и iproute2. Если сервер находится за NAT, пробросьте порт 1080 на внешнем маршрутизаторе, иначе прокси останется виден только внутри сети. Статический IPv4 удобно получить вместе с сервером: облачные VDS и VPS Timeweb Cloud выдают его сразу и позволяют менять конфигурацию без пересборки.

Нагрузка на CPU у SOCKS5 невелика: для нескольких десятков одновременных соединений хватает минимального тарифа с 1 vCPU и 1 ГБ RAM. Узкое место обычно не процессор, а пропускная способность канала и лимиты хостера.

Сравнение демонов: Dante, 3proxy и SSH-туннель

Выбор влияет на то, сколько времени уйдёт на конфиг и как тонко вы сможете ограничить доступ. Ниже сравнение по критериям, которые важны в продакшене.

КритерийDante3proxySSH-туннель
Сложность настройкиСредняя: один файл, но правил многоНизкая: десяток строкМинимальная: одна команда ssh
АутентификацияЛогин и пароль, socksmethod usernameЛогин и пароль, строка usersУчётная запись ОС или ключ SSH
Ограничение по IPACL: from/to, порты, командыallow и deny по IP и пользователюsshd_config и firewall
UDPПоддерживается (UDP ASSOCIATE)Зависит от сборки и конфигаКлюч -D рассчитан на TCP-перенаправление
ЛогированиеПо каждому соединению, настраиваетсяБазовоеЛоги sshd
Много клиентовДа, с разными правами на пользователяДа, с общими правиламиТуннель на каждого клиента
Шифрование до сервераНетНетДа

Рекомендации по выбору простые. Продакшен с несколькими клиентами и разными правами доступа: Dante. Быстрое развёртывание с минимальным конфигом и небольшой нагрузкой: 3proxy. Разовая задача, отладка маршрутизации, доступ с одного ноутбука: SSH-туннель. Скрипт ниже поддерживает оба демона, движок передаётся первым аргументом.

Dante: когда нужен гибкий контроль доступа

Dante лежит в репозиториях Debian и Ubuntu под именем dante-server, вся конфигурация живёт в одном файле /etc/danted.conf. Это стабильный, высокопроизводительный прокси-сервер, поддерживающий протоколы SOCKS4 и SOCKS5, с гибкой системой аутентификации и контроля доступа. Дополнительно заявлены поддержка IPv6, цепочечное подключение прокси (proxy chaining), встроенная аутентификация через PAM, LDAP и RADIUS, детальное логирование и минимальное потребление ресурсов.

Минимальный рабочий конфиг:

logoutput: /var/log/danted.log
internal: 0.0.0.0 port = 1080
external: eth0
socksmethod: username
user.privileged: root
user.notprivileged: nobody

client pass {
  from: 203.0.113.0/24 to: 0.0.0.0/0
  log: connect disconnect error
}

socks pass {
  from: 203.0.113.0/24 to: 0.0.0.0/0
  command: connect bind
  socksmethod: username
  log: connect disconnect error
}

Оба блока обязательны. client pass фильтрует подключения к самому демону, socks pass описывает исходящие сессии и метод аутентификации. Ключевое слово socksmethod задаёт список допустимых методов аутентификации для клиентских правил в порядке предпочтения, а метод username требует от клиента имя пользователя и пароль, совпадающие с данными в системном файле паролей. Оставите только client pass, получите отказ в доступе; уберёте socks pass совсем, и правила перестанут ограничивать исходящий трафик. Для нескольких клиентов с разными правами Dante удобнее, цена - более внимательное чтение документации при первом запуске.

3proxy: минимализм и скорость

3proxy весит меньше, стартует быстрее и настраивается десятком строк. В одном процессе он умеет SOCKS5, HTTP, FTP и другие режимы, поддерживает контроль доступа при помощи ACL (Access Control List) и авторизацию по IP-адресу и имени/паролю. Рабочий пример /etc/3proxy/3proxy.cfg:

daemon
nserver 1.1.1.1
nscache 65536
timeouts 1 5 30 60 180 1800 15 60
users proxyuser:CL:ChangeMe_2026
allow proxyuser 203.0.113.0/24
deny *
socks -p1080 -i0.0.0.0 -e0.0.0.0

Строка users задаёт пользователя и пароль: тип пароля CL разрешает подключения по логину и паролю, наряду с другими типами. Строка socks -p1080 -i0.0.0.0 -e0.0.0.0 включает SOCKS-прокси на стандартном порту 1080 со слушанием на всех интерфейсах. Примеры листов доступа есть в файле 3proxy.cfg.sample. Гибкость ACL у 3proxy ниже, чем у Dante: нет фильтрации по портам и командам, логирование скромнее. Зато конфиг читается за минуту.

SSH-туннель: когда демон не нужен

Локальный SOCKS5 поднимается одной командой со стороны клиента: ssh -D 1080 user@host. SSH-клиент запускает встроенный SOCKS4/5-прокси и выступает в роли SOCKS-сервера, а трафик шифруется на всём пути до сервера. Доступ управляется ключами и настройками sshd.

Ограничения тоже конкретные: туннель живёт в рамках одной SSH-сессии, каждому клиенту нужна своя учётная запись и своё подключение, а управлять доступом по IP на уровне прокси не получится. SSH-перенаправление рассчитано на TCP-порты, поэтому UDP-трафик через -D не пойдёт. Для разовой задачи или отладки это оптимальный вариант, для продакшена с растущим числом клиентов - нет. Полный разбор с автоперезапуском туннеля через systemd: настройка SSH-туннеля для обхода блокировок.

Пошаговое развёртывание: скрипт и ручная настройка

Скрипт рассчитан на Ubuntu и Debian. Сохраните его как deploy-socks5.sh и запустите с четырьмя аргументами: движок (dante или 3proxy), имя пользователя, пароль, CIDR клиентов.

#!/usr/bin/env bash
set -euo pipefail

ENGINE="${1:-dante}"
PROXY_USER="${2:-proxyuser}"
PROXY_PASS="${3:-ChangeMe_2026}"
ALLOW_CIDR="${4:-203.0.113.0/24}"
PORT=1080

[[ $EUID -eq 0 ]] || { echo "Запускать от root"; exit 1; }

IFACE="$(ip route get 1.1.1.1 | awk '{print $5; exit}')"
FREE_MB="$(df -Pm / | awk 'NR==2 {print $4}')"
[ "$FREE_MB" -gt 500 ] || { echo "Мало места на диске"; exit 1; }

export DEBIAN_FRONTEND=noninteractive
apt-get update -qq
apt-get install -y -qq curl ufw iproute2

if [ "$ENGINE" = "dante" ]; then
  apt-get install -y -qq dante-server
  useradd -r -s /usr/sbin/nologin -M "$PROXY_USER" || true
  echo "$PROXY_USER:$PROXY_PASS" | chpasswd
  cat > /etc/danted.conf <<EOF
logoutput: /var/log/danted.log
internal: 0.0.0.0 port = $PORT
external: $IFACE
socksmethod: username
user.privileged: root
user.notprivileged: nobody

client pass {
  from: $ALLOW_CIDR to: 0.0.0.0/0
  log: connect disconnect error
}

socks pass {
  from: $ALLOW_CIDR to: 0.0.0.0/0
  command: connect bind
  socksmethod: username
  log: connect disconnect error
}
EOF
  SERVICE=danted
else
  apt-get install -y -qq 3proxy
  mkdir -p /etc/3proxy
  cat > /etc/3proxy/3proxy.cfg <<EOF
daemon
nserver 1.1.1.1
nscache 65536
timeouts 1 5 30 60 180 1800 15 60
users $PROXY_USER:CL:$PROXY_PASS
allow $PROXY_USER $ALLOW_CIDR
deny *
socks -p$PORT -i0.0.0.0 -e0.0.0.0
EOF
  SERVICE=3proxy
fi

ufw allow 22/tcp
ufw allow from "$ALLOW_CIDR" to any port "$PORT" proto tcp
ufw --force enable

cat > /etc/systemd/system/$SERVICE.service <<EOF
[Unit]
Description=SOCKS5 proxy ($SERVICE)
After=network-online.target
Wants=network-online.target

[Service]
Type=forking
ExecStart=/usr/sbin/$SERVICE
ExecReload=/bin/kill -HUP \$MAINPID
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable --now "$SERVICE"
systemctl --no-pager status "$SERVICE"

Запуск: chmod +x deploy-socks5.sh, затем ./deploy-socks5.sh dante proxyuser 'ChangeMe_2026' 203.0.113.0/24. Пароль берите в кавычках, CIDR - адреса, с которых разрешены подключения. Свой рабочий адрес можно узнать через curl с клиентской машины.

В шаблоне выше для 3proxy в ExecStart указан путь /usr/sbin/3proxy. Точный путь к бинарнику зависит от сборки и дистрибутива, поэтому после установки проверьте его командой command -v 3proxy и при необходимости поправьте юнит.

Шаг 1: Подготовка сервера и проверка зависимостей

До установки пакетов скрипт проверяет четыре условия: права root, свободное место на разделе (порог 500 МБ), доступность репозиториев через apt-get update и имя внешнего сетевого интерфейса. Последнее берётся командой ip route get 1.1.1.1: ядро показывает интерфейс, через который уйдёт пакет, и это значение попадает в строку external конфига Dante.

Директива set -euo pipefail останавливает скрипт на первой ошибке, поэтому падение на середине установки исключено. Ручной вариант тех же шагов:

apt update && apt upgrade -y
apt install -y curl ufw iproute2
cat /etc/os-release
df -h /
ip -br addr

Отдельно про firewall: перед ufw --force enable убедитесь, что SSH-порт разрешён. В скрипте это строка ufw allow 22/tcp; если sshd слушает другой порт, замените значение, иначе после включения firewall потеряете доступ к серверу.

Шаг 2: Установка и базовая настройка демона

Для Dante достаточно пакета dante-server. Строки конфига читаются так: internal задаёт адрес и порт прослушивания, external - интерфейс исходящих соединений, socksmethod username включает аутентификацию, user.privileged и user.notprivileged определяют, от кого демон работает после старта. Логи уходят в /var/log/danted.log согласно logoutput.

Для 3proxy пакет ставится из репозитория, конфиг создаётся в /etc/3proxy/3proxy.cfg. Директивы: daemon переводит процесс в фон, nserver и nscache настраивают DNS-резолвер прокси, socks -p1080 -i0.0.0.0 -e0.0.0.0 включает приём подключений на всех интерфейсах с выходом с того же адреса.

Версии пакетов зависят от дистрибутива и его релиза. Например, в репозиториях Ubuntu 22.04 (jammy) доступен dante-server 1.4.2+dfsg-7build4 amd64, содержащий демон danted. Актуальную версию для вашей системы удобно проверить командой apt search dante-server. Точный путь к бинарнику после установки смотрите через command -v 3proxy или command -v danted: в разных сборках он может лежать в /usr/bin или /usr/sbin, и это значение нужно в ExecStart systemd-юнита.

Шаг 3: Настройка аутентификации и ограничений по IP

Пользователь для Dante создаётся системной учётной записью без shell и домашнего каталога, потому что проверка пароля идёт через PAM:

useradd -r -s /usr/sbin/nologin -M proxyuser
openssl rand -base64 18 | tee /root/proxy.pass
echo "proxyuser:$(cat /root/proxy.pass)" | chpasswd
id proxyuser

Пароль длиннее 16 символов и сохранённый вне конфига закрывает основную часть рисков. У 3proxy пользователь задаётся строкой users proxyuser:CL:пароль, отдельная системная учётная запись не нужна.

Ограничение по IP делается в двух местах. В конфиге демона: блоки client pass и socks pass с from 203.0.113.0/24 у Dante, строка allow proxyuser 203.0.113.0/24 у 3proxy. На уровне хоста:

ufw allow from 203.0.113.0/24 to any port 1080 proto tcp
ufw status verbose
ss -tulpn | grep 1080

Прокси без ограничений сканеры находят за часы: порт 1080 перебирается автоматически, а трафик через открытый прокси пойдёт за ваш счёт и с вашего IP. Связка логин плюс пароль плюс белый список CIDR закрывает почти все сценарии злоупотребления. Если список клиентов часто меняется, добавьте правило блокировки анонимных подключений и мониторинг логов, а не открывайте порт всем.

Шаг 4: Создание systemd-юнита и автозапуск

Юнит создаётся по шаблону из скрипта, разница только в ExecStart. Для Dante файл /etc/systemd/system/danted.service:

[Unit]
Description=Dante SOCKS5 proxy
After=network-online.target
Wants=network-online.target

[Service]
Type=forking
ExecStart=/usr/sbin/danted -f /etc/danted.conf
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure

[Install]
WantedBy=multi-user.target

Для 3proxy меняются имя сервиса и команда запуска: ExecStart=/usr/bin/3proxy /etc/3proxy/3proxy.cfg, Type=forking сохраняется, так как в конфиге включена директива daemon. Затем:

systemctl daemon-reload
systemctl enable --now danted
systemctl --no-pager status danted
journalctl -u danted -n 50 --no-pager

Если дистрибутив уже поставил свой unit в /lib/systemd/system, файл в /etc/systemd/system имеет приоритет и перекроет его. Правьте конфиг пакета или создавайте свой, но не держите два разных описания сервиса с одинаковым именем.

Проверка работоспособности и безопасности

Тестирование через curl

Две команды ведут себя по-разному на этапе разрешения имён:

curl --socks5 "$PROXY_USER:$PROXY_PASS@$PROXY_IP:1080" "$CHECK_URL"
curl --socks5-hostname "$PROXY_USER:$PROXY_PASS@$PROXY_IP:1080" "$CHECK_URL"

Ключ --socks5 резолвит имя локально и отправляет на прокси уже готовый IP-адрес. Ключ --socks5-hostname передаёт имя цели прокси, и DNS-запрос уходит с сервера. Сравнение двух результатов показывает, нет ли утечки DNS через вашу локальную сеть. В успешном ответе вы увидите IP прокси-сервера, а не адрес рабочей машины.

Если ответа нет, смотрите логи: tail -f /var/log/danted.log для Dante, journalctl -u 3proxy -f для 3proxy. Строки connect и disconnect подтверждают, что подключение дошло до демона и он установил сессию к цели.

Чек-лист безопасности

  • Аутентификация включена: в danted.conf есть socksmethod: username, в конфиге 3proxy присутствует строка users.
  • Ограничение по IP на месте: в правилах указан ваш CIDR, а не 0.0.0.0/0.
  • Firewall закрывает остальное: ufw status verbose показывает открытым только порт 1080 для белого списка.
  • Порт не слушает лишние адреса: ss -tulpn | grep 1080 не должен показывать локальные интерфейсы, если они не нужны.
  • Логирование работает: файл лога растёт, в нём видны реальные подключения.
  • Демон актуален: apt list --upgradable показывает версии dante-server и 3proxy.
  • Анонимный доступ запрещён: у 3proxy есть заключительное правило deny *.
  • Мониторинг подключений настроен, при необходимости добавлен fail2ban для защиты SSH.

Отдельно проверьте, что рабочие секреты не уходят через прокси по незашифрованным каналам. Как проводить такие проверки и снижать риски, разбираем в материале прокси-сервер и безопасность.

Типовые ошибки и их решение

  • Порт занят. Проверка: ss -tulpn | grep :1080. Если порт слушает другой процесс, смените PORT в скрипте или остановите лишний сервис.
  • Firewall блокирует клиента. Проверка: ufw status verbose. Должно быть правило вида allow from 203.0.113.0/24 to any port 1080 proto tcp.
  • SELinux запрещает подключения, актуально для RHEL-совместимых систем. Проверка: getenforce. Переключатель nis_enabled включается командой setsebool -P nis_enabled 1; утилита setsebool устанавливает значение для одного или нескольких переключателей SELinux. Учтите, что эта настройка описана для сетевых сервисов в целом и не подтверждена отдельно именно для dante или 3proxy, поэтому применяйте её как общий приём и проверяйте результат по логам демона.
  • Конфиг не проходит валидацию. Для Dante: danted -V -f /etc/danted.conf. Частые причины: несуществующий интерфейс в строке external, отсутствие блока socks pass, опечатка в socksmethod.
  • Аутентификация не работает. Проверьте id proxyuser и что пароль установлен через chpasswd. У 3proxy убедитесь, что строка users записана без пробелов и с префиксом CL.
  • Прокси отвечает изнутри сервера, но не снаружи. Проверьте security group или внешний firewall хостера: локальный ufw может быть открыт, а трафик режет провайдер.
  • DNS не резолвится через прокси. Для 3proxy задайте nserver в конфиге, для Dante проверьте содержимое /etc/resolv.conf на сервере. На клиенте используйте --socks5-hostname.
  • Изменения не применились. После правки конфига выполните systemctl restart danted или systemctl restart 3proxy и убедитесь по логам, что сервис поднялся без ошибок.

Итог: что мы получили и что дальше

На выходе работает SOCKS5-прокси на порту 1080 с аутентификацией по логину и паролю, белым списком IP, правилами firewall и systemd-юнитом с автозапуском. Конфигурация проверяется до старта, а работоспособность подтверждается запросом через curl с обеими схемами разрешения DNS.

Поддержка сводится к рутине. Обновляйте пакеты демона вместе с остальными обновлениями ОС. Раз в квартал меняйте пароль: openssl rand -base64 18 и chpasswd. Следите за логом на предмет серий неудачных попыток входа и подключений с чужих адресов. Проверяйте доступность извне с отдельного хоста, а не только с того же сервера.

Дальше масштабирование: несколько прокси с разными выходными адресами и балансировкой на стороне клиента, отдельные учётные записи под каждую задачу, fail2ban для защиты SSH. Скрипт адаптируется через аргументы: движок, пользователь, пароль и CIDR клиентов; порт и пути правятся в переменных в начале файла.

Запустите скрипт на тестовом VPS, прогоните curl-проверку и убедитесь, что в ответе чужой IP, а правила firewall закрывают порт для всех, кроме вашего адреса. После этого переносите конфиг на боевой сервер.

Источники

Поделиться:
Сохранить гайд? В закладки браузера