Содержание
centos
Установка SOCKS5 сервера 3proxy
На Github'е можно найти множество bash скриптов упрощяющих установку 3proxy
Исходные данные: vMACHINA VPS, CentOS 7.5.1804.
Задача: Настроить 3proxy для работы HTTP/Socks прокси с поддержкой работы через IPv6.
Порт HTTP прокси 3333, порт Socks прокси 4444.
Установка
К сожалению последних версий 3proxy в репозиториях нет. Поэтому и для CentOS и для Debian/Ubuntu необходимо будет собирать 3proxy вручную. Старый добрый make install.
Для сборки из исходного кода нам нужен компилятор gcc
# yum install gcc
Скачиваем последнюю доступную версию с Github и компилируем
# cd /tmp # wget https://github.com/z3APA3A/3proxy/archive/0.8.12.tar.gz # tar -xvf 0.8.12.tar.gz # cd 3proxy-0.8.12/ # make -f Makefile.Linux
make install
не делаем.
Добавим нового системного пользователя от имени которого будет работать 3proxy (без доступа к shell и без домашнего каталога)
# useradd -s /usr/sbin/nologin -U -M -r 3proxy
В дальнейшем нам понадобятся UID и GID нового пользователя
# id 3proxy uid=996(3proxy) gid=994(3proxy) groups=994(3proxy)
Следуя правилам FHS наш 3proxy будет установлен в каталоге /opt
.
Создаём необходимые каталоги и копируем скомпилированные файлы
# mkdir -p /opt/3proxy/{bin,etc,log} # cp src/{3proxy,socks,pop3p,mycrypt} /opt/3proxy/bin/ // При желании можно скопировать конфиг-пример // cp cfg/3proxy.cfg.sample /opt/3proxy/etc/3proxy.cfg touch /opt/3proxy/etc/3proxy.cfg touch /opt/3proxy/etc/3passwd
Делаем chown и chmod
# chown 3proxy:3proxy -R /opt/3proxy # chmod 444 /opt/3proxy/etc/3proxy.cfg # chmod 400 /opt/3proxy/etc/3passwd
Пользователи
Пользователей можно указывать в самом конфигурационном файле
users user007:CL:password users User13:CR:$1$XKgXzzXc$WBKwk7E5HEYODydxancNR.
в отдельном файле
users $/opt/3proxy/etc/3passwd
или же одновременно в конфигурационном файле и отдельном файле
users user007:CL:password users User13:CR:$1$XKgXzzXc$WBKwk7E5HEYODydxancNR. users $/opt/3proxy/etc/3passwd
Примечание
- CL - пароль в открытом тексте
- CR - пароль в формате crypt() (только MD5)
IPv6
Формат такой
proxy -6 -p[номер_порта] -i[IPv4-адрес] -e[IPv6-адрес]
- -p - номер порта. Должен быть разный для каждого v6 адреса
- -i - адрес для подключения
- -e - исходящий адрес
Пример конфигурационного файла
# HTTP(S) прокси auth strong users user1337:CL:CoolPassword allow * proxy -6 -n -a -p50001 -i[ipv4] -e[ipv6] proxy -6 -n -a -p50002 -i[ipv4] -e[ipv6] # Socks прокси auth strong users user1337:CL:CoolPassword allow * socks -6 -p50003 -i[ipv4] -e[ipv6] socks -64 -p50004 -i[ipv4] -e[ipv6] -e[ipv4]
опции -4
, -46
, -64
, -6
задают приоритет разрешения имен в адреса IPv4 и IPv6 (только IPv4, приоритет IPv4, приоритет IPv6, только IPv6). Подробности в 3proxy FAQ
Важно! Если используется только v6, то с socks-сервером могут быть проблемы.
Для плагина FoxyProxy например требуется включить опцию Send DNS through SOCKS5 proxy
При правильной настройке сайт ipv6-test.com покажет следующий результат
IPv6
IPv4+IPv6
Конфигурационный файл
Финальный вариант файла /opt/3proxy/etc/3proxy.cfg
# Общие настройки daemon pidfile /opt/3proxy/3proxy.pid timeouts 1 5 30 60 180 1800 15 60 setgid 994 setuid 996 # DNS серверы и размер кэша nserver 77.88.8.8 nserver 8.8.8.8 nserver 2a02:6b8::feed:0ff nserver 2001:4860:4860::8888 nscache 65536 # Внешний интерфейс external 185.53.170.60 # Можно разрешить глобально. В нашем примере для HTTP-прокси будут открыты только 80 и 443. Для socks-прокси 80, 443 и другие. # allow * * * 80-88,8080-8088 HTTP # allow * * * 443,8443 HTTPS users rootwelt:CL:CoolPassword1337 # Лог файл log /opt/3proxy/log/3proxy.log D rotate 7 logformat "L%d-%m-%Y %H:%M:%S %z %N.%p %E %U %C:%c %R:%r %O %I %h %T" # log /dev/null для отключения логов # HTTP proxy auth strong flush allow * * * 80,443 proxy -n -a -p3333 # Socks5 auth strong flush allow * * * 80-88,8080-8088 HTTP allow * * * 443,8443 HTTPS allow * * * 1500,2087,2222 socks -n -a -p4444 # Статистика для пользователей. Вряд ли это нужно в контексте socks-сервера для обхода блокировок. # flush # auth iponly # allow * # admin -p8889 -s # Админ интерфейс. Да, есть такая фича, но лучше не включать. # flush # auth strong # allow Ubermensch 10.20.30.40 # deny * # admin -p8888 end
Небольшие пояснения по опциям flush и allow
Из FAQ: Команда flush используется для сброса существующего списка доступа (это необходимо для того, чтобы можно было задать различные списки доступа для различных служб).
Мы можем например глобально разрешить только HTTP и HTTPS, но отдельно для socks открыть дополнительный доступ для TCP 1500.
Allow, как нетрудно догадаться служит для разрешения соединения. Синтаксис следующий:
allow <userlist> <sourcelist> <targetlist> <targetportlist> <commandlist> <weekdays> <timeperiodslist>
То есть в нашем тестовом конфигурационном файле разрешено
- доступ всем пользователям (список логинов)
- доступ с любых адресов
- доступ к любым адресам
- доступ только к указанным портам
Пример ограничения использования прокси-сервера подсетями Telegram (источник)
allow * * 91.108.4.0/22,91.108.8.0/22,91.108.56.0/22,149.154.160.0/20,149.154.164.0/22,91.108.16.0/22,91.108.56.0/23,149.154.168.0/22,91.108.12.0/22,149.154.172.0/22,91.108.20.0/22,91.108.36.0/23,91.108.38.0/23,109.239.140.0/24
Список подсетей Telegram - https://bgp.he.net/search?search%5Bsearch%5D=Telegram&commit=Search
Firewall
В нашем примере http-прокси использует порт TCP 3333, а socks-прокси порт TCP 4444.
iptables
# iptables -A INPUT -p tcp -m tcp --dport 3333 -j ACCEPT # iptables -A INPUT -p tcp -m tcp --dport 4444 -j ACCEPT
firewalld
# firewall-cmd --permanent --zone=public --add-port=3333/tcp # firewall-cmd --permanent --zone=public --add-port=4444/tcp # firewall-cmd --reload
init.d/systemd
В CentOS 7 используется systemd, поэтому необходимо создать unit-файл с новым сервисом /etc/systemd/system/3proxy.service
[Unit] Description=3proxy Proxy Server After=syslog.target network.target [Service] Type=forking ExecStart=/opt/3proxy/bin/3proxy /opt/3proxy/etc/3proxy.cfg Restart=on-failure User=3proxy Group=3proxy [Install] WantedBy=multi-user.target
Обновляем список сервисов в systemd, добавляем сервис в автозагрузку и запускаем его
# systemctl daemon-reload # systemctl enable 3proxy.service # systemctl start 3proxy.service
Проверка
Ссылки
- Github FAQ: Security recommendations
- Github FAQ: Как создать список пользователей
- Github FAQ: Как установить/удалить 3proxy под Unix/Linux
Обсуждение