{{fl>centos?48&align=right}}
====== Установка SOCKS5 сервера 3proxy ======
"Установка в один клик"\\
На Github'е можно найти множество bash скриптов упрощяющих установку 3proxy
* https://github.com/benjamin74/3proxy
* https://github.com/hidden-refuge/3proxy
* https://github.com/secfall/3proxy_install
Исходные данные: 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
Скачиваем последнюю доступную [[https://github.com/z3APA3A/3proxy/|версию с 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)
Следуя правилам [[https://ru.wikipedia.org/wiki/FHS|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). Подробности в [[https://github.com/z3APA3A/3proxy/wiki/How-To-(русский)#IPV6|3proxy FAQ]]
Важно! Если используется только v6, то с socks-сервером [[https://github.com/z3APA3A/3proxy/issues/73#issuecomment-219999617|могут быть проблемы]].
Для плагина FoxyProxy например требуется включить опцию **Send DNS through SOCKS5 proxy**
При правильной настройке сайт [[http://ipv6-test.com|ipv6-test.com]] покажет следующий результат
**IPv6**
{{:linux:3proxy_ipv6.png?nolink&400|}}
**IPv4+IPv6**
{{:linux:3proxy_ipv6_ipv4.png?nolink&400|}}
===== Конфигурационный файл =====
Финальный вариант файла ''/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
То есть в нашем тестовом конфигурационном файле разрешено
* доступ всем пользователям (список логинов)
* доступ с любых адресов
* доступ к любым адресам
* доступ только к указанным портам
Пример ограничения использования прокси-сервера подсетями Telegram ([[https://secfall.com/socks5-proksi-server-dlya-sebya-i-druzey/|источник]])
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
===== Проверка =====
См. [[linux:dante#плагин_для_браузера|Установка SOCKS5 сервера Dante, Плагин для браузера]]
===== Ссылки =====
* Github FAQ: [[https://github.com/z3APA3A/3proxy/wiki/Security-recommendations|Security recommendations]]
* Github FAQ: [[https://github.com/z3APA3A/3proxy/wiki/How-To-(русский)#USERS|Как создать список пользователей]]
* Github FAQ: [[https://github.com/z3APA3A/3proxy/wiki/How-To-(русский)#LAUNCH|Как запустить конкретную службу (HTTP, SOCKS и т.д)]]
* Github FAQ: [[https://github.com/z3APA3A/3proxy/wiki/How-To-(русский)#INSTUNIX|Как установить/удалить 3proxy под Unix/Linux]]
* https://secfall.com/socks5-proksi-server-dlya-sebya-i-druzey/
* http://wiki.sys-adm.org.ua/net/3proxy
* http://www.wertup.ru/ubuntu/3proxy
===== Враг у ворот =====
iptables -A INPUT -s 5.61.16.0/21 -j DROP
iptables -A INPUT -s 5.61.232.0/21 -j DROP
iptables -A INPUT -s 79.137.157.0/24 -j DROP
iptables -A INPUT -s 79.137.174.0/23 -j DROP
iptables -A INPUT -s 79.137.183.0/24 -j DROP
iptables -A INPUT -s 94.100.176.0/20 -j DROP
iptables -A INPUT -s 95.163.32.0/19 -j DROP
iptables -A INPUT -s 95.163.212.0/22 -j DROP
iptables -A INPUT -s 95.163.216.0/22 -j DROP
iptables -A INPUT -s 95.163.248.0/21 -j DROP
iptables -A INPUT -s 128.140.168.0/21 -j DROP
iptables -A INPUT -s 178.22.88.0/21 -j DROP
iptables -A INPUT -s 178.237.16.0/20 -j DROP
iptables -A INPUT -s 185.5.136.0/22 -j DROP
iptables -A INPUT -s 185.6.244.0/22 -j DROP
iptables -A INPUT -s 185.16.148.0/22 -j DROP
iptables -A INPUT -s 185.16.244.0/22 -j DROP
iptables -A INPUT -s 188.93.56.0/21 -j DROP
iptables -A INPUT -s 194.186.63.0/24 -j DROP
iptables -A INPUT -s 195.211.20.0/22 -j DROP
iptables -A INPUT -s 195.211.128.0/22 -j DROP
iptables -A INPUT -s 195.218.168.0/24 -j DROP
iptables -A INPUT -s 195.218.190.0/23 -j DROP
iptables -A INPUT -s 208.87.93.0/24 -j DROP
iptables -A INPUT -s 208.87.94.0/23 -j DROP
iptables -A INPUT -s 217.20.144.0/20 -j DROP
iptables -A INPUT -s 217.69.128.0/20 -j DROP
iptables -A INPUT -s 2a00:1148::/29 -j DROP
iptables -A INPUT -s 2a00:1148::/32 -j DROP
iptables -A INPUT -s 2a00:a300::/32 -j DROP
iptables -A INPUT -s 2a00:b4c0::/32 -j DROP
iptables -A INPUT -s 2a00:1148:5::/48 -j DROP
{{tag>Linux CentOS 3proxy Proxy Socks РКН Блокировки rootwelt}}