Что мы разворачиваем и зачем: 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-туннель
Выбор влияет на то, сколько времени уйдёт на конфиг и как тонко вы сможете ограничить доступ. Ниже сравнение по критериям, которые важны в продакшене.
| Критерий | Dante | 3proxy | SSH-туннель |
|---|---|---|---|
| Сложность настройки | Средняя: один файл, но правил много | Низкая: десяток строк | Минимальная: одна команда ssh |
| Аутентификация | Логин и пароль, socksmethod username | Логин и пароль, строка users | Учётная запись ОС или ключ SSH |
| Ограничение по IP | ACL: 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 закрывают порт для всех, кроме вашего адреса. После этого переносите конфиг на боевой сервер.
Источники
- Установка Dante SOCKS Proxy на Ubuntu: полное руководство
- 3proxy: Documentation: howto
- SSH Tunnel: Local, Remote, and Dynamic Port Forwarding
- install-dante: скрипт автоматической установки
- SELinux: переключатели и setsebool
- danted.conf(5) — dante-server — Debian Manpages
- Установка и настройка 3proxy в Ubuntu
- Как работает динамическая переадресация SSH (-D)
- Установка прокси-сервера SOCKS5 Dante на Ubuntu/Debian