3proxy. Установка и настройка
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 • Прокси