{{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}}