Предисловие.
Я снова в эфире и снова приветствую своих три килоподписчика.
Эта статья, также, как и прошлая, не писалась для Пикабу. Если заминусите, то мне по-прежнему пофиг.
После публикации прошлой статьи я получил овердохрена писем с просьбой описать настройки SOCKS прокси в рамках тех конфигов, которые уже есть под OpenVPN по моим статьям.
ВАЖНО (еще раз)
В статье даны ссылки на сайты. Эти сайты ни мне, никому-либо другому не приносят прибыли, никто их раскруткой не занимается. Это не реклама!
В некоторых случаях можно было бы давать ссылки не на мой сайт с инструкциями, а сюда, на мои статьи на Пикабу. Но тут статьи с ошибками, а на сайте хоть и редко, но исправлялись. Да и лень мне листать историю публикаций.
Ну если заминусите, то и хрен с ним. Я на рейтинг не ананирую.
На самом деле миллион мануалов на эту тему. Инструкцию написана только для того, чтобы показать, как в написанные по моим статьям конфиги впилить самостоятельно работающий прокси-сервер. Если Вам лениво делать свой или вы соменваетесь, поможет ли он Вам — воспользуйтесь демонстрационным бесплатным тестовым сервисом 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
1. Установка прокси-сервера 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 следующего содержания:
3proxy.service
Теперь откроем файл /opt/3proxy/3proxy.cfg
Удалите всё его содержимое и вставьте следующее:
3proxy.cfg
Здесь для нас важны следующие строчки:
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
Тут уже настраиваете как Вам нужно. Как видно в приведенном выше конфиге, мы пока ничего не ограничиваем. Если вы делаете этот сервер для себя и хотите пропускать через него трафик к любым сайтам, то так и оставьте.
Если хотите разрешать подключение к прокси только по логину и паролю, то конфиг будет такой:
3proxy.cfg
Где строчки:
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
На этом ручные настройка и запуск прокси-сервера завершены.
2. Установка прокси-сервера 3proxy скриптом
Тут всё будет просто. Мой скрипт установки есть на GitHub. Он очень простой. Скачивает, компилирует, устанавливает, делает конфиг, запускает добавляет в автозагрузку 3proxy. Проверка ошибок минимальна. Просто, чтобы сократить рутину. Скрипт не настраивает файрволл и/или iptables.
Чтобы воспользоваться запустите команду:
wget https://raw.githubusercontent.com/secfall/3proxy_install/mas... && bash 3proxy_install.sh
Если будет ошибка из-за отсутствия пакета wget, то тогда так
yum -y install wget
wget https://raw.githubusercontent.com/secfall/3proxy_install/mas... && bash 3proxy_install.sh
3. Настройка iptables для прокси
3.1 Если у Вас уже настроен iptables по статье «Анонимность в интернете своими руками. Установка и настройка VPN сервера» или моим скриптом автоустановки OpenVPN, то приводим файл /root/ipt-set к такому виду:
Пример ipt-set
Обращаем внимание на строчки
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 к такому виду:
Пример ipt-set
Также обращаем внимание на строчки
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, то клиент прокси сервера сможет через него ходить на любой ресурс.
Если вы хотите ограничить список разрешённых сетей назначения через 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 (Настройки -> Данные и диск -> Настройки прокси).