3proxy. Установка и настройка

25.11.2025

Теги: HTTPHTTPSProxySOCKSSystemdКонфигурацияСерверУстановка

3proxy – бесплатный кроссплатформенный прокси-сервер. Основные особенности являются— небольшой размер и переносимость. Не имеет графического интерфейса, настройка производится с помощью конфигурационного файла. Недоступен в стандартных репозиториях Ubuntu, но можно скачать готовый deb-пакет или собрать из исходников.

1. Установка из пакета

$ wget https://github.com/3proxy/3proxy/releases/download/0.9.6/3proxy-0.9.6.x86_64.deb
$ sudo dpkg -i 3proxy-0.9.5.x86_64.deb

При этом создается Systemd служба 3proxy.service и файл конфигурации /etc/3proxy/3proxy.cfg.

$ sudo systemctl show 3proxy.service -p User -p Group
User=proxy
Group=proxy

2. Сборка из исходников

Установка зависимостей

$ sudo apt update
$ sudo apt install git build-essential -y

Клонирование и сборка

$ git clone https://github.com/3proxy/3proxy.git
$ cd 3proxy
$ make -f Makefile.Linux

После команды make бинарник появится в папке bin внутри клонированного репозитория.

Установка бинарного файла

$ sudo cp bin/3proxy /usr/local/bin/
$ sudo chmod +x /usr/local/bin/3proxy

Создание пользователя

Создаем системного пользователя для запуска 3proxy.service от имени этого пользователя.

$ sudo adduser --system --no-create-home --disabled-login --group 3proxy
Узнать UID и GID пользователя можно с помощью команды id 3proxy.

Можно использовать системного пользователя proxy, который для этого и существует. Но если на сервере планируется устанавливать другие прокси-службы — то лучше под каждую создать отдельного пользователя.

Создание директорий

Директории для хранения конфигурации и файлов логов

$ sudo mkdir /etc/3proxy
$ sudo mkdir /var/log/3proxy
$ sudo chown 3proxy:3proxy /var/log/3proxy

Создание службы Systemd

$ sudo nano /etc/systemd/system/3proxy.service
[Unit]
Description=3proxy Proxy Server
After=network.target

[Service]
Type=simple
User=3proxy
Group=3proxy
ExecStart=/usr/local/bin/3proxy /etc/3proxy/3proxy.cfg
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target
$ sudo systemctl daemon-reload

Запуск службы 3proxy.service

Это нужно будет сделать после создания файла конфигурации

$ sudo systemctl enable 3proxy.service
$ sudo systemctl start 3proxy.service
$ sudo systemctl status 3proxy.service

Эти команды запускают службу и добавляют в автозагрузку.

3. Создание файла конфигурации

$ sudo nano /etc/3proxy/3proxy.cfg
# DNS-серверы для резолвинга внутри 3proxy
nserver 8.8.8.8
nserver 1.1.1.1
# Кэш DNS-записей для ускорения резолвинга
nscache 65536

# Запись логов в файл, ротация через logrotate
log /var/log/3proxy/3proxy.log
# Формат лога: дата, время, откуда, кто, куда
logformat L%d.%m.%Y %H:%M:%S %z %C %U %n:%q %Q %D %I %O

# Разрешаем доступ только с двух ip-адресов
allow * 111.111.111.111,222.222.222.222.222
# ...и запрещаем доступ для всех остальных
deny *

# Без авторизации, доступ ограничен по ip
auth iponly

# Запускаем HTTP/HTTPS прокси на порту 3128
proxy -p3128

# Запускаем SOCKS5 прокси на порту 1080
socks -p1080

4. Настройка ротации логов

$ sudo nano /etc/logrotate.d/3proxy
/var/log/3proxy/3proxy.log {
    # Ротация файла лога каждый день
    daily
    # Хранить логи за последние 30 дней
    rotate 30
    # Сжимать старые файлы в .gz
    compress
    # Не сжимать последний ротированный файл
    delaycompress
    # Не ошибаться, если файл лога отсутствует
    missingok
    # Не ротировать если файл пустой
    notifempty
    # Создать новый пустой файл после ротации
    # Владелец — proxy:proxy или 3proxy:3proxy
    create 640 3proxy 3proxy
    postrotate
        # После ротации перезапустить 3proxy,
        # чтобы он начал писать в новый файл
        systemctl reload 3proxy 2>/dev/null || true
    endscript
}

Файл лога должен принадлежать пользователю, от имени которого работает служба 3proxy.service — это либо proxy (и группа proxy), либо 3proxy (и группа 3proxy).

Проверяем, что конфиг работает

$ sudo logrotate -d /etc/logrotate.d/3proxy

5. Открыть порты для работы

$ sudo ufw allow from 111.111.111.111 to any port 3128
$ sudo ufw allow from 111.111.111.111 to any port 1080
$ sudo ufw allow from 222.222.222.222 to any port 3128
$ sudo ufw allow from 222.222.222.222 to any port 1080

6. Доступ по логину и паролю

log /var/log/3proxy/3proxy.log

# Авторизация пользователей по логину и паролю
auth strong

# Доступ по логину и паролю. Формат: имя:тип:пароль
# CL означает, что пароль задается в открытом виде.
users user1:CL:password1
users user2:CL:password2
users user3:CL:password3

# HTTP-прокси
proxy -p3128

# SOCKS-прокси
socks -p1080

7. Проверка работы службы

$ curl -I --proxy socks5://user:pass@123.123.123.123:1080 https://example.com | grep HTTP
$ curl -I --proxy http://user:pass@123.123.123.123:3128 https://example.com | grep HTTP

Здесь 123.123.123.123 — ip-адрес сервера, на котором установлен 3proxy.

8. Полное удаление службы

Остановка и удаление службы 3proxy.service

$ sudo systemctl stop 3proxy.service
$ sudo systemctl disable 3proxy.service
$ sudo rm /etc/systemd/system/3proxy.service
$ sudo systemctl daemon-reload

Удаление бинарного файла 3proxy

$ sudo rm /usr/local/bin/3proxy

Удаление файлов и директорий в /etc и /var/log

$ sudo rm -rf /etc/3proxy
$ sudo rm -rf /var/log/3proxy

9. Директивы конфигурации

Директивы proxy и socks

  • proxy — запускает HTTP/HTTPS прокси (порт по умолчанию 3128)
  • socks — запускает SOCKS 4/4.5/5 прокси (порт по умолчанию 1080)
Опция Описание Пример
-p порт для прослушивания -p1080
-i интерфейс для входящих соединений -i0.0.0.0
-e интерфейс для исходящих соединений -e0.0.0.0

Опции -i и -e переопределяют глобальные директивы internal и external для конкретного сервиса. Если опции не указаны явно — берутся значения из internal и external.

# Явное указание сетевых интерфейсов
socks -p1080 -i0.0.0.0 -e0.0.0.0

# Запись через глобальные директивы
internal 0.0.0.0
external 0.0.0.0
socks -p1080

Если у сервера несколько сетевых интерфейсов — можно запустить несколько сервисов на разных интерфейсах и портах.

# Принимает соединения на eth0, отправляет через eth0
socks -p1080 -i111.111.111.111 -e111.111.111.111

# Принимает соединения на eth0, отправляет через eth1
socks -p1081 -i111.111.111.111 -e222.222.222.222

Директива auth

Директива auth действует как переключатель — применяется ко всем сервисам, которые идут после неё до следующей директивы auth.

auth strong   # включили авторизацию
proxy -p3128  # использует strong
socks -p1080  # использует strong

auth iponly   # переключили авторизацию
socks -p1081  # использует iponly

Все варианты значений директивы auth

Значение Описание
none Без авторизации (по умолчанию)
iponly Доступ по ip-адресу
strong По логину и паролю
iponly,strong По ip-адресу и логину/паролю одновременно

В примере ниже auth работает одинаково для HTTP и SOCKS прокси.

# Для HTTP и SOCKS — авторизация по ip-адресу
auth iponly

proxy -p3128
socks -p1080

Можно задать разную авторизацию для HTTP-прокси и SOCKS-прокси.

# Для HTTP — авторизация по логину и паролю
auth strong
proxy -p3128

# Для SOCKS — авторизация только по ip-адресу
auth iponly
socks -p1080

Директива users

Список пользователей с паролями в формате пользователь:CL:пароль, здесь CL означает, что пароли в открытом виде, без шифрования.

users user1:CL:password1
users user2:CL:password2
users user3:CL:password3

Директивы allow и deny

allow [пользователи] [ip-источника] [ip-назначения] [порты]

Звездочка * означает «любой» — пользователь, ip-адрес source и destination, порт.

Параметр Значение или звездочка *
Пользователи john,mary любой пользователь
Source IP 192.168.1.0/24 с любого адреса
Destination IP 10.0.0.1 на любой адрес
Порты 80,443,8080 на любой порт
# Разрешить всем с любого адреса на любой адрес, на любой порт
allow *
# Разрешить всем пользователям, но только из локальной подсети
allow * 192.168.1.0/24
# Разрешить только конкретному пользователю, с любого адреса
# на любой адрес, на любой порт
allow john
# Разрешить нескольким пользователям, с любого ip-адреса на
# людой ip-адрес, на любой порт
allow john,mary,bob
# Разрешить всем из подсети, но только на порты 80, 443
allow * 192.168.1.0/24 * 80,443
# Разрешить одному пользователю, только с конкретного ip
allow john 192.168.1.105
# Разрешить всем из подсети, только на конкретный сервер
allow * 192.168.1.0/24 10.0.0.1
# Разрешить всем из подсети, только на конкретный сервер,
# только на веб-порты 80 и 443
allow * 192.168.1.0/24 10.0.0.1 80,443

Если список правил доступа allow пуст — подразумевается allow *. Если список правил не пуст — последним неявно добавляется deny *. Но лучше явно добавлять deny * после allow с правилами доступа.

allow john,mary,bob * * 80,443
deny *

Синтаксис директивы deny совпадает с синтаксисом директивы allow

deny [пользователи] [ip-источника] [ip-назначения] [порты]

Директива flush

Сбрасывает текущий (активный) список правил доступа. Директиву нужно использовать каждый раз перед созданием новой службы и правил доступа для этой службы.

# Список правил доступа для службы и запуск этой службы
allow *
proxy

# Перед запуском новой службы нужно сбросить список правил
# доступа, созданные для службы, которая запускается выше
flush

# Список правил доступа для службы и запуск этой службы
allow *    192.168.1.0/24
socks

Директива parent

Директива parent перенаправляет исходящий трафик на вышестоящий прокси-сервер — создавая цепочку прокси.

Хотя директива parent пишется отдельной строкой, она не самостоятельна, а только дополняет директиву allow, которая находится прямо над ней в файле конфигурации.

parent [вес] [тип] [хост] [порт] [логин] [пароль]
Параметр Описание Пример
вес для балансировки трафика 1000
тип протокол вышестоящего прокси socks5, socks4, http
хост адрес вышестоящего прокси 142.132.47.82
порт порт вышестоящего прокси 62429
логин опционально HsW9aXyDM
пароль опционально KJ6aQBFQR

Здесь вес — это число от 1 до 1000. Используется для балансировки трафика, если указано несколько вышестоящих прокси. Директивы parent группируются до тех пор, пока сумма их весов не достигнет 1000 — только тогда группа считается полной и активируется.

# Проверка доступа только по ip-адресу
auth iponly
# Разрешить всем с указанного ip-адреса
allow * 123.123.123.123
# Вышестоящий прокси без аутентификации
parent 1000 socks5 101.101.101.101 1080
# Проверка доступа только по ip-адресу
auth iponly
# Разрешить всем с указанного ip-адреса
allow * 123.123.123.123
# Вышестоящий прокси по логину и паролю
parent 1000 http 101.101.101.101 8080 HsW9aXyDM KJ6aQBFQR

Поскольку директива parent является дополнением для директивы allow — она действует на все службы, которые запускаются ниже в файле конфигурации. Чтобы отменить действие директивы parent — нужно использовать flush.

auth iponly
allow * 123.123.123.123
# Выход в интернет без вышестоящего прокси
socks -p1080

# Сбрасываем директиву allow (правила доступа)
flush

users evgeniy:CL:evg123
users sergey:CL:ser456

auth strong
allow evgeniy,sergey
# Вышестоящий прокси по логину и паролю
parent 1000 socks5 101.101.101.101 62429 HsW9aXyDM KJ6aQBFQR
# Выход в интернет через вышестоящий прокси
socks -p1081

Типичный сценарий использования parent — вышестоящий прокси требует аутентификацию, которую клиент передать не может. Тогда промежуточный 3proxy принимает соединение без пароля и сам авторизуется на вышестоящем прокси.

Клиент (без пароля) → 3proxy → вышестоящий прокси (с паролем) → интернет
# Сбрасываем директиву allow (если была задана выше)
flush

# Клиент подключается без логина-пароля на порт 1081,
# подключение разрешено только с одного ip-адреса
auth iponly
allow * 123.123.123.123
parent 1000 socks5 101.101.101.101 62429 HsW9aXyDM KJ6aQBFQR
# Служба на порту 1081, которую мы запускаем ниже, сама
# авторизуется на прокси-сервере 101.101.101.101
socks -p1081

# Сбрасываем директиву allow (если будут еще службы)
flush

Мы уже знаем, что к одной директиве allow можно привязать несколько директив parent — этом случае 3proxy начнет работать в режиме балансировщика нагрузки (load balancer) и распределителя запросов между ними.

Значение вес определяет долю трафика, которая уйдет на конкретный сервер. Сумма весов всех указанных прокси должна быть равна 1000 — только тогда группа считается полной и активируется. Если сумма меньше — группа не активируется, parent игнорируется, и трафик идёт напрямую в интернет, минуя вышестоящие прокси.

  • Два прокси поровну — вес 500 каждому
  • Пять прокси поровну — вес 200 каждому

Равномерное распределение (Round-Robin / Случайно)

allow *
parent 500 socks5 101.101.101.101 1080 user1 pass1
parent 500 socks5 202.202.202.202 1080 user2 pass2

proxy -p3128

Пропорциональная балансировка (70% на 30%)

allow *
parent 700 http 101.101.101.101 3128   # Заберет ~70% всех запросов
parent 300 http 202.202.202.202 3128   # Заберет ~30% всех запросов

proxy -p3128

Помимо балансировки, указание нескольких parent обеспечивает базовую отказоустойчивость. Если 3proxy пытается отправить запрос на первый прокси из списка, а тот оказывается недоступен, он автоматически перенаправит этот же запрос на второй рабочий прокси из списка.

Директивы nserver и nscache

Задают DNS-серверы для разрешения имён и размер кэша для DNS-запросов (по умолчанию — 65536).

# DNS-серверы
nserver 8.8.8.8
nserver 1.1.1.1
# Размер кэша DNS
nscache 65536

Директива nserver указывает 3proxy, какие DNS-сервера использовать напрямую, минуя стандартные механизмы операционной системы (системный резолвер glibc).

Системные вызовы работают медленнее и могут «блокировать» потоки прокси при большой нагрузке. Поэтому 3proxy использует собственный асинхронный DNS-клиент, который гораздо быстрее.

Директивы log и rotate

log [log_file] [log_type]

Тип лога может быть — M (Monthly), W (Weekly), D (Daily), H (Hourly).

rotate N

Здесь N — количество логов, которые нужно хранить (перед удалением).

Директива logformat

Директива задаёт шаблон записи логов. Первый символ строки формата обязателен и определяет временну́ю зону.

  • L — локальное время сервера
  • G — время по Гринвичу (UTC)
# Формат лога: дата, время, откуда, кто, куда, сколько
logformat L%d.%m.%Y %H:%M:%S %z %C %U %n:%q %Q %D %I %O
15.04.2024 14:30:45 +0300 192.168.1.100 user1 example.com:80 123.123.123.123 150 10240 51200

Доступные параметры форматирования

Параметр Значение Пример вывода
%y Год, 2 цифры 24
%Y Год, 4 цифры 2024
%m Номер месяца 04
%o Сокращение месяца Apr
%d День месяца 15
%H Час (24‑часовой формат) 14
%M Минуты 30
%S Секунды 45
%. Миллисекунды 123
%t Timestamp (секунды с 01.01.1970) 1713184245
%z Часовой пояс (относительно Гринвича) +0300
%D Длительность запроса (мс) 150
%b Средняя скорость отправки (Б/с) 512
%B Средняя скорость приёма (Б/с) 2048
%U Имя пользователя user1
%N Название сервиса proxy
%p Порт сервиса 3128
%E Код ошибки 404
%C IP клиента 192.168.1.100
%c Порт клиента 54321
%R Удаленный ip 8.8.8.8
%r Порт удаленного сервера 443
%e Внешний ip (external) 203.0.113.5
%Q Запрошенный ip 93.184.216.34
%q Запрошенный порт 80
%n Запрошенное доменное имя example.com
%I Количество принятых байт 10240
%O Количество отправленных байт 51200
%h Количество перенаправлений 2
%T Текстовое описание (специфичное для сервиса) GET http://example.com/page
N1-N2T Только поля с N1 по N2 из %T %1-3T — первые 3 поля из %T

В чем различие между «запрошенный», «удаленный» и «внешний»

  • Запрошенный (%Q) — ip‑адрес ресурса, к которому изначально пытается подключиться клиент через прокси-сервер
  • Удаленный (%R) — фактический IP‑адрес сервера, с которым прокси‑сервер установил соединение для выполнения запроса клиента
  • Внешний (%e) — ip‑адрес самого прокси‑сервера, т.е. адрес сетевого интерфейса, через который прокси выходит во внешнюю сеть

Директивы internal и external

Задают внутренний и внешний сетевые интерфейсы глобально для всей конфигурации.

Директивы setuid и setgid

Предписывают процессу 3proxy сменить свои привилегии сразу запуска — и продолжить работу с правами указанных пользователя и группы.

setuid 109
setgid 113

При использовании Systemd — лучше указать пользователя и группу в файле юнита. Тогда служба сразу запускается от этого пользователя, без необходимости использовать setuid и setgid.

Post Scriptum

Пример файла конфигурации

# DNS-серверы для резолвинга внутри 3proxy
nserver 8.8.8.8
nserver 1.1.1.1
# Кэш DNS-записей для ускорения резолвинга
nscache 65536

# Запись логов в файл, ротация через logrotate
log /var/log/3proxy/3proxy.log
# Формат лога: дата, время, откуда, кто, куда
logformat "L%d.%m.%Y %H:%M:%S %z %C %U %n:%q %Q %D %I %O"

# Проверка доступа только по ip-адресу
auth iponly
# Разрешаем доступ только с двух ip-адресов
allow * 111.111.111.111,222.222.222.222
# ...и запрещаем доступ для всех остальных
deny *

# Запускаем HTTP(S) прокси на порту 3128
proxy -p3128
# Запускаем SOCKS5 прокси на порту 1080
socks -p1080

# Еще две прокси-службы, которые выходят в
# интернет через вышестоящие прокси-серверы

# Сбрасываем директиву allow (списки доступа)
flush

# Проверка доступа только по ip-адресу
# (здесь это директива не обязательна)
auth iponly
# Разрешаем доступ только с двух ip-адресов
allow * 111.111.111.111,222.222.222.222
# Вышестоящие прокси, доступ по логину-паролю
parent 200 socks5 101.101.101.101 9177 ATB2Fm DsdSUF
parent 200 socks5 102.102.102.102 9823 ATB2Fm DsdSUF
parent 200 socks5 103.103.103.103 9744 ATB2Fm DsdSUF
parent 200 socks5 104.104.104.104 9474 ATB2Fm DsdSUF
parent 200 socks5 105.105.105.105 9968 ATB2Fm DsdSUF
# ...и запрещаем доступ для всех остальных
deny *

# Запускаем HTTP(S) прокси на порту 3129
proxy -p3129
# Запускаем SOCKS5 прокси на порту 1081
socks -p1081

Поиск: 3proxy • SOCKS • HTTP • HTTPS • Systemd • Конфигурация • Сервер • Установка • Proxy • Прокси

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.