Установка 3proxy

3proxy — один из самых легко настраиваемых прокси-серверов, к тому же он открытый и кроссплатформенный. 

В статье рассмотрим установку 3proxy на ОС AlmaLinux 9 и Debian 11 (актуальные на момент написания статьи), а затем расскажем, как можно развернуть 3proxy в Docker.

 

Установка 3proxy с поддержкой http(s) и socks5-proxy

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

Установка

Так как в репозиториях 3proxy как правило отсутствует, мы будем устанавливать его из исходников. Для установки потребуется установить некоторые пакеты.

Для AlmaLinux:

# yum -y install gcc wget tar 

Для Debian:

# apt install -y build-essential wget tar

Далее скачиваем файлы 3proxy (ссылка на актуальную версию 3proxy со временем может измениться) и распаковываем архив:

# wget https://github.com/z3APA3A/3proxy/archive/0.9.3.tar.gz
# tar -xvzf 0.9.3.tar.gz

Переходим в распакованную директорию и компилируем:

# cd 3proxy-0.9.3/
# make -f Makefile.Linux

Создаем директорию для конфигурационных файлов, директорию для логов и переносим исполняемый файл 3proxy:

# mkdir /etc/3proxy
# mkdir -p /var/log/3proxy
# cp bin/3proxy /usr/bin/

Теперь создадим пользователя для работы с 3proxy:

# useradd -s /usr/sbin/nologin -U -M -r proxyuser

И даем нашему пользователю proxyuser права на директории /etc/3proxy, /var/log/3proxy и /usr/bin/3proxy:

# chown -R proxyuser:proxyuser /etc/3proxy
# chown -R proxyuser:proxyuser /var/log/3proxy
# chown -R proxyuser:proxyuser /usr/bin/3proxy

Создаем новый конфигурационный файл:

# touch /etc/3proxy/3proxy.cfg

И даём права на конфигурационный файл только пользователю root:

# chmod 600 /etc/3proxy/3proxy.cfg

Дальше необходимо правильно заполнить созданный конфигурационный файл. Для этого нам понадобится узнать uid и gid нашего пользователя proxyuser:

# id proxyuser
uid=991(proxyuser) gid=991(proxyuser) groups=991(proxyuser)

Запоминаем uid и gid пользователя, вставляем текст из примера файла конфигурации с помощью удобного для вас текстового редактора и сохраняем.

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

Пример файла конфигурации 3proxy.cfg, который должен у вас получиться после его редактирования:

# Настройка запуска сервера от пользователя proxyuser 

# (вставляем uid и gid нашего пользователя, которые мы узнали ранее)
setgid 991
setuid 991

# Указываем правильные сервера имен. Посмотреть можно в /etc/resolv.conf
nserver 8.8.8.8
nserver 8.8.4.4

# Используем таймауты и размер кэша для запросов DNS по умолчанию
timeouts 1 5 30 60 180 1800 15 60
nscache 65536

# Указываем режим запуска как daemon
daemon

# Указываем IP-адрес внешнего интерфейса сервера 
external 111.111.111.111 # либо игнорируем строку, если IP один

# Указываем IP-адрес внутреннего интерфейса сервера
internal 192.168.0.1 # либо игнорируем, чтобы прокси слушал все IP 

# Настраиваем http proxy на стандартном порту 3128
proxy -p3128 -n -a # укажите свой порт, предварительно проверив, что он работает

# Настраиваем socks proxy на стандартном порту 1080
socks -p1080 # укажите свой порт, предварительно проверив, что он работает

# Указываем путь к логам, формат лога и ротацию
log /var/log/3proxy/3proxy.log D
logformat "- +_L%t.%. %N.%p %E %U %C:%c %R:%r %O %I %h %T"
rotate 30

Создаем файл-инициализации для systemd и настраиваем верные права:

# touch /etc/systemd/system/3proxy.service
# chmod 664 /etc/systemd/system/3proxy.service

В данный файл нужно вставить следующий текст

[Unit]
Description=3proxy Proxy Server
After=network.target
[Service]
Type=simple
ExecStart=/usr/bin/3proxy /etc/3proxy/3proxy.cfg
ExecStop=/bin/kill `/usr/bin/pgrep proxyuser`
RemainAfterExit=yes
Restart=on-failure
[Install]
WantedBy=multi-user.target

Сохраняем и обновляем конфигурацию systemd:

# systemctl daemon-reload

Запускаем 3proxy и добавляем его в автозагрузку:

# systemctl start 3proxy
# systemctl enable 3proxy
Не забудьте открыть порт http proxy в firewalld или iptables.

Настройка закончена. На порту 3128 теперь у вас работает http-proxy, на порту 1080 — socks-proxy.

Исправление распространённых проблем

Проблема 1

Из-за кеширования доменных имён есть вероятность, что ваш новый домен для вас будет недоступен.

Решение: необходимо дождаться обновления записей DNS либо прописать в файл hosts IP-адрес вашего сервера и новый домен.

Проблема 2

Ваш прокси-сервер с дефолтными портами рано или поздно найдут.

Решение: поменять порты. 

proxy -n -p7834
# на http proxy слушать порт 7834 

socks -p7835   
# на socks слушать порт 7835

Но их тоже могут найти. Поэтому можно в фаерволе разрешить доступ с определённых адресов, а остальным — запретить. Довольно негибкое (так как у вас может и не быть статического IP), но железное решение.

Проблема 3

Если вы ведёте логи, в которых отражаются все соединения, со временем они станут занимать всё больше места. В конечном итоге логи могут занять всё место на диске.

Решение: не вести логи или настроить их ротацию.
 

Лучше предусмотреть всё заранее.

Упрощенный конфиг анонимного http(s) proxy сервера на порту 3128

users proxyuser:CL:password


daemon


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

rotate 30


auth strong

proxy -n -a


setgid 65534

setuid 65534

Также нужно создать директорию под логи и выставить права (мы запускаем сервер с минимальными правами nobody в системе используя директивы setgid/setud):

mkdir /var/log/3proxy ; chown nobody /var/log/3proxy

Установка 3proxy в Docker

Рассмотрим вариант установки 3proxy в Docker.

Для начала потребуется установить некоторые пакеты (а для свежеустановленных ОС Debian и Ubuntu, возможно, ещё потребуется обновить индекс пакетов apt командой # apt update).

Для AlmaLinux и CentOS:

# yum install docker docker-compose

для Ubuntu и Debian:

# apt install docker docker.io docker-compose

Скачиваем образ:

# docker pull 3proxy/3proxy

По умолчанию 3proxy использует безопасную среду chroot в /usr/local/3proxy с uid 65535 и gid 65535, и ожидает, что конфигурационный файл 3proxy будет помещен в /usr/local/etc/3proxy. Пути в конфигурационном файле должны указываться относительно /usr/local/3proxy, т.е. должно быть /logs вместо /usr/local/3proxy/logs. В chroot требуется разрешение для nserver.

Для этого создадим директорию и конфигурационный файл 3proxy:

# mkdir -p /etc/dockerapp/3proxy
# touch /etc/dockerapp/3proxy/3poxy.conf

Далее с помощью любого удобного для вас текстового редактора необходимо отредактировать созданный конфигурационный файл 3proxy.conf. Для запуска 3proxy в Docker достаточно минимальной конфигурации:

nserver 8.8.8.8
socks -p3129

Для того чтобы добавить логирование и пользователя, необходимо в файл конфигурации 3proxy добавить:

log /logs/3proxy.log
auth strong
users "proxyuser:CR:87beeef3f4ee4661ac1897eca216fc26"

Вместо «87beeef3f4ee4661ac1897eca216fc26» необходимо указать хэш MD5 пароля для пользователя proxyuser. Узнать хэш MD5 можно с помощью онлайн генераторов.

Запустим 3proxy с помощью docker-compose. Для этого потребуется создать файл конфигурации в формате .yml:

# touch /etc/dockerapp/3proxy/docker-compose.yml

Вставляем туда с помощью текстового редактора следующий текст:

version: "2.1"
services:
  3proxysvc:
image: 3proxy/3proxy:latest
container_name: 3proxy
volumes:
   - /etc/dockerapp/3proxy/conf:/usr/local/3proxy/conf
ports:
   - 8080:3129
restart: unless-stopped

Сохраняем. В данном файле мы указали внешний порт 8080. Теперь можем запускать:

# docker-compose -f /etc/dockerapp/3proxy/docker-compose.yml up -d

Получим примерно такой ответ:

Creating network "3proxy_default" with the default driver
Creating 3proxy ... done

Проверяем:

# docker ps

Получим ответ, где будут указаны ID контейнера, образ, статус, используемые порты и имя:

48cc0cd140cd   3proxy/3proxy:latest   "/bin/3proxy /etc/3p…"   5 minutes ago   Up 5 minutes   0.0.0.0:8080->3129/tcp   3proxy

 

Этот материал был полезен?