SOCKS5 прокси-сервер для себя и друзей

Все настройки выполнены в VPS от hostsailor.com

Сайт для статьи размещён на fornex.com

ВНИМАНИЕ! На сайте rknsucks.xyz больше нет демонстрационного стенда.

Данная статья показывает как с помощью свободно распространяемого программного обеспечения можно обойти проблемы сетевых соединений (блокировки) путём использования прокси-сервера, расположенного за пределами страны пребывания клиента.

Немного формальностей. Данная статья, а также сайт secfall.com не предоставляет способов обхода блокировок. И в данной статье, и на сайте secfall.com описываются инструменты штатного применения программного продукта 3roxy. Автор статьи и администрация сайта secfall.com не могут нести ответственность за противоправные действия третьих лиц, при использовании описываемых в статье и на сайте инструментов.

На самом деле миллион мануалов на эту тему. Инструкцию написана только для того, чтобы показать, как в написанные по моим статьям конфиги впилить самостоятельно работающий прокси-сервер. Если Вам лениво делать свой или вы соменваетесь, поможет ли он Вам — воспользуйтесь демонстрационным бесплатным сервисом rknsucks.xyz

Но лучше сделать свой.

Небольшое техническое описание нашего будущего сервиса:

  • ОС: CentOS 7 x64
  • Используемое ПО: 3proxy
  • Протокол прокси: SOCKSv4-5
  • Аутентификация: Да

Кроме того, для иллюстрирования работы сервиса будет настроен прокси-сервер по адресу proxy.rknsucks.xyz

Это доменное имя будет смотреть на тот же сервер, что ovpn.rknsucks.xyz из прошлой статьи.

Я уже писал как установить и настроить 3proxy, но там мы делали прозрачный прокси-сервер для клиентов OpenVPN сервера.

Здесь же мы сделаем прокси-сервер как самостоятельный сервис. Это позволит использовать его отдельно от OpenVPN.

Опишу весь порядок установки. Также дам примеры конфигов iptables для разных случаев установки сервера.

Да, можно было бы установить 3proxy моим скриптом автоустановки, но поскольку в прошлой статье мы правили /root/ipt-set, то скрипт вернёт нам его к дефолтному состоянию и поломает работу OpenVPN. Поэтому поставим руками, тем более, что ничего сложного тут нет. 

Ладно, для лентяев в разделе 2 статьи будет скрипт автоматической установки 3proxy. Этот скрипт делает ровно всё то, что написано в разделе 1.

Все конфиги можно найти на GitHub.

Краткое содержание:

  1. Установка прокси-сервера 3proxy вручную
  2. Установка прокси-сервера 3proxy скриптом
  3. Настройка iptables
  4. Установка прокси-сервера 3proxy вручную

Подготовим сервер, если он еще не готов:

yum install epel-release -y
yum update -y
yum upgrade -y
yum install wget -y

Для компиляции нам понадобиться компилятор:

yum -y install gcc

Перейдём во временную папку

cd /tmp

и скачаем актуальную версию 3proxy

wget https://github.com/z3APA3A/3proxy/archive/0.8.12.tar.gz

Номер последней версии можно узнать тут. На момент написания статьи это 0.8.12.

Распаковываем (не забудьте исправить команду под скачанную версию):

tar -xvzf 0.8.12.tar.gz

И переходим в папку с исходниками:

cd 3proxy-0.8.12

Компилируем

make -f Makefile.Linux

Создаём папку для бинарника и pid-файл:

mkdir -p /opt/3proxy/bin
touch /opt/3proxy/3proxy.pid

Теперь перенесем скомпилированный исполняемый файл и дефолтный конфиг в рабочую папку:

cp ./src/3proxy /opt/3proxy/bin
cp ./cfg/3proxy.cfg.sample /opt/3proxy/3proxy.cfg

В папке /etc/systemd/system с помощью WinSCP или любым удобным для Вас способом создаем файл 3proxy.service следующего содержания:

[Unit]
Description=3proxy Proxy Server
After=syslog.target network.target

[Service]
Type=forking
ExecStart=/opt/3proxy/bin/3proxy /opt/3proxy/3proxy.cfg

[Install]
WantedBy=multi-user.target

Образец файла.

Теперь откроем файл /opt/3proxy/3proxy.cfg

Удалите всё его содержимое и вставьте следующее:

daemon
pidfile /opt/3proxy/3proxy.pid
nserver 8.8.8.8
nserver 8.8.4.4
nscache 65536

timeouts 1 5 30 60 180 1800 15 60

log /dev/null

#Binding address
external 185.45.193.66

#SOCKS5
auth none
flush
allow  *
maxconn 64
socks -p1080

Образец файла.

Здесь для нас важны следующие строчки:

external 185.45.193.66 — внешний ip-адрес Вашего сервера

allow * — строчка разрешений для клиентов. В таком виде она разрешает любые подключения.

В общем виде строчка разрешений имеет такой формат:

allow <userlist> <sourcelist> <targetlist> <targetportlist> <commandlist> <weekdays> <timeperiodslist>

где нас интересуют следующие поля:

  • <userlist> — список логинов пользователей через запятую
  • <sourcelist> — список сетей клиентов через запятую. Сеть задается в формате xxx.yyy.zzz.mmm/l, где l — длина маски сети (количество ненулевых байт). Например, 192.168.1.0/24 соответствует сети с маской 255.255.255.0.
  • <targetlist> — список сетей назначения через запятую
  • <targetportlist> — список портов назначения через запятую. можно задать диапазон портов через -, например, 80,1024-65535

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

Если хотите разрешать подключение к прокси только по логину и паролю, то конфиг будет такой:

daemon
pidfile /opt/3proxy/3proxy.pid
nserver 8.8.8.8
nserver 8.8.4.4
nscache 65536

timeouts 1 5 30 60 180 1800 15 60

users proxyuser1:CL:password1
users proxyuser2:CL:password2

log /dev/null

#Binding address
external 185.45.193.66

#SOCKS5
auth strong
flush
allow  *
maxconn 64
socks -p1080

Где строчки:

users proxyuser1:CL:password1

users proxyuser2:CL:password2

задают логины и пароли пользователей прокси-сервера.

Образец файла.

Мне, для сервера proxy.rknsucks,xyz, важно пропускать трафик только к сетям 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,149.154.174.0/24

Напомню, что адреса подсетей нужного сайта можно получить на специализированных ресурсах. Например, на https://bgp.he.net

 

Можно список подсетей назначения реализовать и по-другому. Прописать их не в конфиге прокси, а в iptables (т.е. в моём случае в файле /root/ipt-set). Учитывая, что у меня на одной машине подняты и OpenVPN, и прокси, такой способ будет являться для меня предпочтительным и описан в разделе 3 статьи. Если подсетей, для которых нужно настроить ограничения, много, то тут лучше использовать более взрослые способы настройки iptables. Например ferm. Вы можете выбирать то, что лучше подходит к Вашей задаче.

Не забудьте сохранить и закрыть конфиг.

Можно попробовать запустить прокси-сервер командой:

systemctl start 3proxy

И проверить его состояние командой:

systemctl status 3proxy

Если есть ошибки, проверяйте конфиги. Если нет, то настроим автозапуск службы командой:

systemctl enable 3proxy

На этом ручные настройка и запуск прокси-сервера завершены.

  1. Установка прокси-сервера 3proxy скриптом

Тут всё будет просто. Мой скрипт установки есть на GitHub. Он очень простой. Скачивает, компилирует, устанавливает, делает конфиг, запускает добавляет в автозагрузку 3proxy. Проверка ошибок минимальна. Просто, чтобы сократить рутину. Скрипт не настраивает файрволл и/или iptables.

Чтобы воспользоваться запустите команду:

wget https://raw.githubusercontent.com/secfall/3proxy_install/master/3proxy_install.sh && bash 3proxy_install.sh

Если будет ошибка из-за отсутствия пакета wget, то тогда так

yum -y install wget
wget https://raw.githubusercontent.com/secfall/3proxy_install/master/3proxy_install.sh && bash 3proxy_install.sh
  1. Настройка iptables для прокси

3.1 Если у Вас уже настроен iptables по статье «Анонимность в интернете своими руками. Установка и настройка VPN сервера» или моим скриптом автоустановки OpenVPN, то приводим файл /root/ipt-set к такому виду:

#!/bin/sh
IF_EXT="venet0"
IF_OVPN="tun0"
OVPN_PORT="443"
PROXI_PORT="1080"
IPT="/sbin/iptables"
IPT6="/sbin/ip6tables"
 
# flush
$IPT --flush
$IPT -t nat --flush
$IPT -t mangle --flush
$IPT -X
$IPT6 --flush
 
# loopback
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A OUTPUT -o lo -j ACCEPT
 
# default
$IPT -P INPUT DROP
$IPT -P OUTPUT DROP
$IPT -P FORWARD DROP
$IPT6 -P INPUT DROP
$IPT6 -P OUTPUT DROP
$IPT6 -P FORWARD DROP
 
# allow forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward
 
# NAT
# #########################################
# SNAT - local users to out internet
$IPT -t nat -A POSTROUTING -o $IF_EXT -j MASQUERADE
 
# INPUT chain
# #########################################
$IPT -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# ssh
$IPT -A INPUT -i $IF_EXT -p tcp --dport 22 -j ACCEPT
# VPN
$IPT -A INPUT -i $IF_OVPN -p icmp -s 10.8.0.0/24 -j ACCEPT
# DNS
$IPT -A INPUT -i $IF_OVPN -p udp --dport 53 -s 10.8.0.0/24 -j ACCEPT
# openvpn
$IPT -A INPUT -i $IF_EXT -p tcp --dport $OVPN_PORT -j ACCEPT
# 3proxy
$IPT -A INPUT -i $IF_EXT -p tcp --dport $PROXI_PORT -j ACCEPT
$IPT -A INPUT -i $IF_EXT -p udp --dport $PROXI_PORT -j ACCEPT

 
# FORWARD chain
# #########################################
$IPT -A FORWARD -i $IF_OVPN -o $IF_EXT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPT -A FORWARD -i $IF_EXT -o $IF_OVPN -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A FORWARD -s 10.8.0.0/24 -d 10.8.0.0/24 -j ACCEPT
 
# OUTPUT chain
# #########################################
$IPT -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

Пример файла.

Обращаем внимание на строчки

IF_EXT="venet0"
OVPN_PORT="443"
# openvpn 
$IPT -A INPUT -i $IF_EXT -p tcp --dport $OVPN_PORT -j ACCEPT

Должны быть правильно указаны название физического интерфейса, порт и протокол OpenVPN сервера.

Применяем настройки командой:

bash /root/ipt-set

3.2 Если у Вас уже настроен iptables по статье «Избирательная маршрутизация в OpenVPN«, то приводим файл /root/ipt-set к такому виду:

#!/bin/sh
IF_EXT="venet0"
IF_OVPN="tun0"
OVPN_PORT="443"
IPT="/sbin/iptables"
IPT6="/sbin/ip6tables"
# flush
$IPT --flush
$IPT -t nat --flush
$IPT -t mangle --flush
$IPT -X
$IPT6 --flush
# loopback
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A OUTPUT -o lo -j ACCEPT
# default
$IPT -P INPUT DROP
$IPT -P OUTPUT DROP
$IPT -P FORWARD DROP
$IPT6 -P INPUT DROP
$IPT6 -P OUTPUT DROP
$IPT6 -P FORWARD DROP
# allow forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/ipv6/conf/all/forwarding
echo 1 > /proc/sys/net/ipv6/conf/default/forwarding
echo 1 > /proc/sys/net/ipv6/conf/all/proxy_ndp
# NAT
# #########################################
# SNAT - local users to out internet
$IPT -t nat -A POSTROUTING -o $IF_EXT -j MASQUERADE
# INPUT chain
# #########################################
$IPT -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT6 -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# ssh
$IPT -A INPUT -i $IF_EXT -p tcp --dport 22 -j ACCEPT
# VPN
$IPT -A INPUT -i $IF_OVPN -p icmp -s 10.8.224.0/21 -j ACCEPT
$IPT6 -A INPUT -i $IF_OVPN -p icmp -s 2a04:dd00:9:b::/64 -j ACCEPT
# DNS
$IPT -A INPUT -i $IF_OVPN -p udp --dport 53 -s 10.8.224.0/21 -j ACCEPT
$IPT6 -A INPUT -i $IF_OVPN -p udp --dport 53 -s 2a04:dd00:9:b::/64 -j ACCEPT
# openvpn
$IPT -A INPUT -i $IF_EXT -p tcp --dport $OVPN_PORT -j ACCEPT
# 3proxy 
$IPT -A INPUT -i $IF_EXT -p tcp --dport $PROXI_PORT -j ACCEPT 
$IPT -A INPUT -i $IF_EXT -p udp --dport $PROXI_PORT -j ACCEPT

# FORWARD chain
# #########################################
$IPT -A FORWARD -i $IF_OVPN -o $IF_EXT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPT -A FORWARD -i $IF_EXT -o $IF_OVPN -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT6 -A FORWARD -i $IF_OVPN -o $IF_EXT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPT6 -A FORWARD -i $IF_EXT -o $IF_OVPN -m state --state ESTABLISHED,RELATED -j ACCEPT
# OUTPUT chain
# #########################################
$IPT -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPT6 -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

Пример файла.

Также обращаем внимание на строчки

IF_EXT="venet0"
OVPN_PORT="443"
# openvpn 
$IPT -A INPUT -i $IF_EXT -p tcp --dport $OVPN_PORT -j ACCEPT

Должны быть правильно указаны название физического интерфейса, порт и протокол OpenVPN сервера.

Применяем настройки командой:

bash /root/ipt-set

ВАЖНО: указанный выше конфиг не ограничивает клиента по адресам назначения. Т.е. если в конфиге прокси-сервера не указаны разрешенные сети назначения (как написано в разделе 1 этой статьи) и такие сети не указаны в файле /root/ipt-set, то клиент прокси сервера сможет через него ходить на любой ресурс.

3.3 Если вы хотите ограничить список разрешённых сетей назначения через iptables, то тогда в файле /root/ipt-set строчки (если не используете IPv6, то только первая строчка):

$IPT -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPT6 -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

Правим на:

$IPT -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT6 -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

Т.е. мы запрещаем новые исходящие соединения, но разрешаем исходящий трафик по уже установленным соединениям.

Теперь настроим правила исходящих соединений на примере Telegram и MyIP.ru (и еще разрешим исходящие на гугловые DNS). В раздел # OUTPUT chain файла /root/ipt-set допишем:

# DNS
$IPT -A OUTPUT -d 8.8.8.8/32 -j ACCEPT
$IPT -A OUTPUT -d 8.8.4.4/32 -j ACCEPT
# Telegram
$IPT -A OUTPUT -d 91.108.4.0/22 -j ACCEPT
$IPT -A OUTPUT -d 91.108.8.0/22 -j ACCEPT
$IPT -A OUTPUT -d 91.108.56.0/22 -j ACCEPT
$IPT -A OUTPUT -d 149.154.160.0/20 -j ACCEPT
$IPT -A OUTPUT -d 149.154.164.0/22 -j ACCEPT
$IPT -A OUTPUT -d 91.108.16.0/22 -j ACCEPT
$IPT -A OUTPUT -d 91.108.56.0/31 -j ACCEPT
$IPT -A OUTPUT -d 149.154.168.0/22 -j ACCEPT
$IPT -A OUTPUT -d 91.108.12.0/22 -j ACCEPT
$IPT -A OUTPUT -d 149.154.172.0/22 -j ACCEPT
$IPT -A OUTPUT -d 91.108.20.0/22 -j ACCEPT
$IPT -A OUTPUT -d 91.108.36.0/31 -j ACCEPT
$IPT -A OUTPUT -d 91.108.38.0/31 -j ACCEPT
$IPT -A OUTPUT -d 91.108.56.0/31 -j ACCEPT
$IPT -A OUTPUT -d 91.108.56.0/22 -j ACCEPT
$IPT -A OUTPUT -d 91.108.4.0/22 -j ACCEPT
$IPT -A OUTPUT -d 67.198.55.0/24 -j ACCEPT
$IPT -A OUTPUT -d 149.154.168.0/22 -j ACCEPT
$IPT -A OUTPUT -d 149.154.172.0/22 -j ACCEPT
$IPT -A OUTPUT -d 149.154.164.0/22 -j ACCEPT
$IPT -A OUTPUT -d 109.239.140.0/22 -j ACCEPT
$IPT6 -A OUTPUT -d 2001:b28:f23f::/48 -j ACCEPT
$IPT6 -A OUTPUT -d 2001:b28:f23d::/48 -j ACCEPT
$IPT6 -A OUTPUT -d 2001:67c:4e8::/48 -j ACCEPT
# MyIP.ru
$IPT -A OUTPUT -d 178.62.9.171/32 -j ACCEPT

Пример файла.

Теперь пользователь нашего сервиса, причем и пользователь прокси, и пользователь vpn, сможет ходить только на подсети Telegram и на сайт myip.ru.

Не забываем применить настройки командой

bash /root/ipt-set

Ну вот и всё. Осталось вписать адрес и порт сервера в настройки клиента Telegram (Настройки -> Данные и диск  ->  Настройки прокси).

 

 

 

 

 

 

 

Вы можите оставить комментарий, или поставить трэкбек со своего сайта.

Написать комментарий

XHTML: Вы можете использовать эти теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>