Wireguard or VLESS - Privoxy
- www.privoxy.org
- www.wireguard.com
- 3x-ui
- www.v2raya.org
- Пример с Raspberry Pi
- Пример с TOR
- domains list
- Install and use AWS-based Wireguard
Настройка прокси сервера для клиентов локальной сети
Необходимо:
- VPN сервер с поднятым Wireguard или VLESS (к примеру на AWS)
- Сервер 1. Внешний Privoxy c клиентом Wireguard
- Сервер 2. Локальный Privoxy
Алгоритм работы
Клиент в сети => Локальный прокси => Внешний прокси => VPN сервер => Адрес обращения
Клиент обращается в Локальный прокси. Если адрес обращения соответствует списку, который нужно пустить через VPN, то он перенаправляет запрос на внешний прокси. Если адрес обращения отсутствует, то локальный прокси отправляет запрос на шлюз. Задача внешнего прокси только в том, чтобы он был шлюзом.
VPN сервер
WireGuard
В данной статье не буду описывать создание сервера на AWS, так как главной целью от этого пункта это получение конфига WireGuard. Для простоты привожу хорошую статью, которая проверена и работает так же у меня. статья по AWS В итоге получим конфиг для клиента wireguard.
Примерная минимальная "просыня" команд на инстансе AWS
1 ip a
2 sudo useradd -m -G sudo -s /bin/bash infernofeniks
3 sudo passwd infernofeniks
4 su - infernofeniks
1 ssh-keygen -t ed25519
2 exit
5 sudo apt update -y && sudo apt install git
6 sudo git clone https://github.com/pprometey/wireguard_aws.git wireguard_aws
7 cd wireguard_aws/
8 sudo ./initial.sh
9 sudo ./add-client.sh
10 sudo ls /etc/wireguard/
11 sudo ls /etc/wireguard/clients
12 sudo nano /etc/wireguard/clients/Feniks@mobile/Feniks@mobile.conf
13 ping 8.8.8.8
14 ip a
15 sudo nano /proc/sys/net/ipv4/ip_forward
16 sudo reboot
17 cd wireguard_aws/
18 sudo ./add-client.sh user2@mobile
19 sudo ln -s /etc/wireguard/clients ./clients
20 sudo ls -la ./clients
21 cd ~/wireguard_aws/
22 sudo ./reset.sh
23 sudo ./remove.sh
24 sudo ./install.sh
25 sudo ./add-client.sh user2@mobile
26 sudo ./add-client.sh user3@home
27 exit
[UPDATE 28.08.2024] VLESS + XTLS-Reality
Если Wireguard не подходит вам, то можно изменить тип VPN на VLESS.
Примеры инсталяций:
Минимальная "просыня" команд на инстансе VPS сервера
Первоначальная работа предполагается под root'ом.
bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh)
x-ui status
x-ui enable
- Установка x3-ui
apt update && apt upgrade -y && apt install curl sudo gpg htop
bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh)
Если в ходе установки ответить n
на запрос: Would you like to customize the panel settings?
, то в конце очень быстрой установки, получим логин и пароль.
Если в ходе установки ответить y
на запрос: Would you like to customize the panel settings?
, то мы сможем сразу задать следующие параметры:
- username - имя админа
- password - пароль админа
- panel port - порт веб консоли
- the web base path - дополнительный путь url
После завершения укстановки вы увидете отчет с необходимой для вас информацией. Пример:
...
This is a fresh installation, generating random login info for security concerns:
###############################################
Username: NSLLJA958U
Password: avUeCn32pU
Port: 55481
WebBasePath: bPKeaFSW34zEItZ
Access URL: http://<IP_VDS_сервера:<Port_панели>/bPKeaFSW34zEItZ
###############################################
If you forgot your login info, you can type 'x-ui settings' to check
...
Панель управления 3X-UI находится по адресу: http://<IP_VDS_сервера:<Port_панели>/.
-
Далее заходим через браузер: http://<IP_VDS_сервера:<Port_панели>/. Не знабудьте настроить SG на AWS!
-
При первом запуске вводим предложенный логин-пароль.
-
Переходим в "подключения" > "добавить подключение".
- Примечание - любое. Это название подключения.
- Протокол -
vless
- Порт -
443
- Ниже выбераем тип безопасности -
Reality
. - uTLS -
chrome
. - В качестве доменов для сокрытия (маскировки) по умолчанию используется yahoo.com, но лучше сменить на другие значения, например:
dl.google.com:443
илиmicrosoft.com:443
и в поле "Dest"dl.google.com,www.dl.google.com
илиmicrosoft.com,www.microsoft.com
в "SNI". - Нажимаем "Get New Cert" для автоматической генерации случайных ключей.
- Sniffing -
ON
- HTTP, TLC, QUIC, FAKEDNS -
ON
- Сохраняем подключение
-
Добавляем пользователя.
- Email - любое имя. К примеру:
feniks@mobile
- Flow -
xtls-rprx-vision
- Email - любое имя. К примеру:
-
Напоследок очистимся и перезагрузимся.
apt update && apt upgrade -y && apt autoclean -y && apt clean -y && apt autoremove -y && shutdown -r now
- Бонус
**SSL**
Установка сертификата с помощью DDNS и Certbot.
- Идем на сайт ydns.io или duckdns.org (duckdns иногда глючит). Можете выбрать любой другой.
- Авторизуемся/регистрируемся
- Добавляем домен и закрепляем за ним IP вашего сервера.
- Устанавливаем certbot.
apt install certbot -y
- Запрашиваем сертификаты
certbot certonly --standalone --agree-tos --register-unsafely-without-email -d <Ваш домен>
При успешном выпуске сертификата увидим следующие:
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/<Ваш домен>/fullchain.pem
Key is saved at: /etc/letsencrypt/live/<Ваш домен>/privkey.pem
- Проверяем "сухую" процедуру перевыпуска.
certbot renew --dry-run
- Если увидели сообщение
Congratulations, all simulated renewals succeeded
, то добавляем задачу в crontab. Есть два подхода (с UFW и без него):
Если используется UFW
Создаем bash-скрипт, а затем запланируем его выполнение через crontab.
- Создаем файл скрипта
nano /opt/certbot-renew.sh
#!/bin/bash
# Разрешить порт 80
ufw allow 80/tcp
# Обновить сертификаты
if certbot renew --post-hook "/usr/bin/x-ui restart"; then
echo "Certbot renewal succeeded."
else
echo "Certbot renewal failed." >&2
exit 1
fi
# Закрыть порт 80
ufw delete allow 80/tcp
- Сделаем скрипт исполняемым.
chmod +x /opt/certbot-renew.sh
- Добавим в crontab вызов этого скрипта.
echo "1 3 * * * /opt/certbot-renew.sh" >> /etc/crontab
Если НЕ используется UFW
- Добавим в crontab задание.
echo "1 3 * * * certbot renew --post-hook '/usr/bin/x-ui restart'" >> /etc/crontab
- Идем в WEB панель, авторизуемся и заходим в Настройки панели.
- Прописываем пути сертификатов.
Путь к файлу публичного ключа сертификата панели: /etc/letsencrypt/live/<Ваш домен>/fullchain.pem
Путь к файлу приватного ключа сертификата панели: /etc/letsencrypt/live/<Ваш домен>/privkey.pem
- Чтобы улучшить безопасность и убрать предупреждения, меням
Корневой путь URL адреса панели
. К примеру :/bugaga/
- Сохраняем и перезапускаем WEB панель. Теперь путь к панели будет
http://<IP_VDS_сервера:<Port_панели>/bugaga/panel/
**Подписка(Subscription)**
Подписка нужна для того что бы клиенты автоматически скачивали обновления для подключений, без дополнительной перенастройки или пересоздания подключения. В каждой подписке будут сгенерированы все подключения для пользователя, т.к. их может быть несколько с разными настройками. А все распространенные клиентские приложения могут это использовать и скачивать себе обновления настроек для подключений и при каких-либо изминениях не придется заново рассылать везде конфиги.
- Выполняем пункт выше (SSL)
- Идем в панель, авторизуемся и заходим в Настройки -> Подписка
- Включаем:
Включить службу
,Шифровать конфиги
,Показать информацию об использовании
- Редактируем
Корневой путь URL-адреса подписки
на любое другое значение. Например/main-sub/
. - Прописываем пути сертификатов.
Путь к файлу открытого ключа сертификата подписки: /etc/letsencrypt/live/<Ваш домен>/fullchain.pem
Путь к файлу закрытого ключа сертификата подписки: /etc/letsencrypt/live/<Ваш домен>/privkey.pem
- Идем в панель, авторизуемся и заходим в Настройки -> Подписка JSON
- Редактируем
Корневой путь URL-адреса подписки
на любое другое значение. Например/json-sub/
. - Сохраняем и перезапускаем WEB панель.
Теперь в настройках каждого клиента появится поле Subscription
, где можно указать для каждого пользователя уникальное значение, по которому будет формироваться ссылка на подписку.
При этом если для пользователя будет несколько клиентских подключений, нужно указывать всегда это уникальное значение, и они все будут доступны ему по сгенерированной ссылке.
Ссылку можно посмотреть и скопировать в разделе Информация у каждого пользовательского подключения
**BBR**
Алгоритм контроля перегрузки TCP congestion control — BBR. Новый алгоритм позволяет значительно увеличить пропускную способность и уменьшить задержку при передачи данных по сети.
nano /etc/sysctl.conf
Необходимо добавить эти два параметра в самый конец файла.
net.core.default_qdisc=fq
net.ipv4.tcp_congestion_control=bbr
После чего включить добавленные параметры ядра командой:
sysctl -p
Проверить, какой именно алгоритм управления перегрузкой включен можно командой:
sysctl -a | grep congestion
**Размер буфера сокетов**
Сетевые буферы на уровне ОС могут быть слишком маленькими для обработки больших файлов, что приводит к сбоям при загрузке. Проверьте и настройте значения следующих параметров:
Чтобы узнать текущие значения этих параметров, выполните следующие команды:
sysctl net.core.rmem_max
sysctl net.core.wmem_max
Пример вывода:
net.core.rmem_max = 212992
net.core.wmem_max = 212992
Этот вывод показывает, что максимальный размер буфера для приёма и отправки данных составляет 212992 байт (около 208 КБ).
Чтобы изменить размер буфера сокетов:
nano /etc/sysctl.conf
Необходимо добавить эти два параметра в самый конец файла.
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
После чего включить добавленные параметры ядра командой:
sysctl -p
**Защита сервера от обнаружения**
Защита сервера от обнаружения РКН
Установка пакета iptables:
apt update && apt install iptables -y
Блокируем адреса РКН при помощи iptables
. Вводим следующие команды:
iptables -A INPUT -s 185.224.228.0/22 -j DROP
iptables -A INPUT -s 195.209.120.0/22 -j DROP
iptables -A INPUT -s 212.192.156.0/22 -j DROP
Чтобы сохранить правила iptables и обеспечить их автоматическое восстановление после перезагрузки, можно использовать пакет iptables-persistent, который позволяет сохранять и автоматически восстанавливать правила iptables при перезагрузке.
Установка iptables-persistent:
apt update && apt install iptables-persistent
В процессе установки вас попросят сохранить текущие правила iptables — выберите Yes
.
Если правила изменились или вы хотите вручную обновить сохраненные правила, выполните:
iptables-save
**Защита портов сервера (UFW)**
Отключаем IPv6 в правилах UFW:
nano /etc/default/ufw
```conf
IPv6=no
```
Смотрим все активные прослушивания на сервере:
ss -tulpn | grep LISTEN
Нам нужно дать разрешения только на необходимые нам порты. SSH, Веб-концоль 3xui, VLESS и тд.
ufw allow ssh/tcp && \
ufw limit ssh/tcp && \
ufw allow 55481/tcp && \
ufw allow 2096/tcp && \
ufw allow 443/tcp && \
ufw allow from 11.22.33.44 && \
ufw enable
55481
- порт WEB консоли
2096
- порт подписок
443
- порт подключения VLESS
ssh
- порт SSH
11.22.33.44
- наш белый IP адрес (админский), если такой имеется.
**Защита сервера от brute–force**
- Создаем своего пользователя на сервере и назначаем ему пароль.
useradd -m -c "InfernoFeniks" -G sudo -s /bin/bash infernofeniks && passwd infernofeniks
- Переходим под своего нового пользователя.
su infernofeniks
- Добавляем свой публичный ключ.
cd && mkdir .ssh && nano .ssh/authorized_keys
ssh-rsa AAAAB3Nza.....................QwerY7. user@macbook
- Выходим обратно в root
exit
apt install rsyslog fail2ban ufw sudo curl gpg openssh-server -y
- Редактируем конфиг SSHD.
nano /etc/ssh/sshd_config
# Logging
SyslogFacility AUTH
LogLevel INFO
# Authentication:
AllowUsers infernofeniks # имя вашего пользователя
PermitRootLogin no
PasswordAuthentication yes # Идеально будет поставить значение 'no', чтобы вход был только по ключам
- Перезапускаем сервис SSHD.
systemctl restart sshd.service
- Создаем правило для SSHD в конфигурации fail2ban.
nano /etc/fail2ban/jail.d/jail.local
[sshd]
enabled = true
filter = sshd
action = iptables[name=SSH, port=ssh, protocol=tcp]
logpath = /var/log/auth.log
findtime = 10m
maxretry = 3
bantime = 60m
ignoreip = <Ваш статический IP, с которого подключаетесь к серверу>/32 127.0.0.1/8 # Список игнорируемы адресов
Описание параметров
Секция [sshd] отвечает за защиту SSH от повторяющихся неудачных попыток авторизации на SSH–сервере, проще говоря, «brute–force».
-
action
— действие, которое будет выполняться, если Fail2ban обнаружит активность, соответствующую критериям поиска; -
ignoreip
— IP–адреса, которые не должны быть заблокированы. Можно задать список IP-адресов разделённых пробелами, маску подсети, или имя DNS–сервера. -
bantime
— время бана в секундах, по истечении которого IP–адрес удаляется из списка заблокированных. -
maxretry
— количество подозрительных совпадений, после которых применяется правило. В контексте [ssh] — это число неудавшихся попыток логина, после которых происходит блокировка. -
enabled
— значение true указывает что данный jail активен, false выключает действие изолятора. -
port
— указывает на каком порту или портах запущен целевой сервис. Стандартный порт SSH–сервера — 22, или его буквенное наименование — ssh. -
filter
— имя фильтра с регулярными выражениями, по которым идёт поиск «подозрительных совпадений» в журналах сервиса. Фильтру sshd соответствует файл /etc/fail2ban/filter.d/sshd.conf. -
logpath
— путь к файлу журнала, который программа Fail2ban будет обрабатывать с помощью заданного ранее фильтра. Вся история удачных и неудачных входов в систему, в том числе и по SSH, по умолчанию записывается в log–файл /var/log/auth.log.
- Редактируем конфиг fail2ban, чтобы выключить обслуживание IPv6
nano /etc/fail2ban/fail2ban.conf
allowipv6 = no
- Перезапускаем сервис fail2ban.
systemctl restart fail2ban && sleep 3 && fail2ban-client reload
FAQ fail2ban
Чтобы посмотреть статус fail2ban, и проверить список защищаемых службы, выполните команду:
fail2ban-client status
Вы можете запросить текущий статус блокировок fail2ban для конкретной службы:
fail2ban-client status sshd
Вышеописанный вариант не покажет полный список адресов, если их много. Для этого есть команда:
fail2ban-client banned
Чтобы разблокировать IP, который попал в блокировку fail2ban, используйте команду:
fail2ban-client set sshd unbanip 1.2.3.4
где sshd
название правила, по правилам которого был заблокирован ваш IP адрес, а 1.2.3.4
ваш IP адрес.
- Отключаем двухсторонний пинг
nano /etc/ufw/before.rules
Меняем концовку следующего выражения с ACCEPT
на DROP
:
-A ufw-before-input -р icmp --icmp-type echo-request -j DROP
Чтобы включить фаервол, нужно заранее выписать все используемые порты на сервере:
ss -tulpn | grep LISTEN
Смотрите порты, которые идут после 0.0.0.0:порт
или IP_адрес вашего_сервера:порт
, Пример:
0.0.0.0:993
11.22.33.44:22
Их необходимо открыть в UFW или через панель управления вашим сервером/хостингом. Пример:
ufw allow 22/tcp && ufw allow 2011/tcp && ufw allow 51231/tcp && ufw allow 443/tcp && ufw allow 43534/tcp && ufw enable
**Идентификация сервера в консоли SSH**
Данный момент совсем необязательный, но если у Вас много разных серверов и у каждого свой DDNS, то для удобства можно сделать так, чтобы сервер при логине на него через SSH, выдавал приветствунную информацию о себе. Можно добавить любую информацию. К примеру FQDN адрес подключения к консоли x3-ui.
- Редактируем файл
motd
.
nano /etc/motd
- Редактируем по своему усмотрению. Можно просто добавить внизу файла дополнительную информацию.
|
|FQDN: https://<Домен подключения к консоли x3-ui>:<порт Web консоли>/<базовый путь>/
|
При следующем логине появитья новая информация приветственного сообщения.
Установка прокси серверов в своей сети
Поднимаем две виртуалки (можно и одну, если идете по пути VLESS). Я сделал два Debian 12.5 на Proxmox VE.
Характеристики ВМ:
VM | Cores | RAM | DISK |
---|---|---|---|
Внешний прокси | 2 | 2GB | 15GB |
Внешний прокси | 2 | 2GB | 15GB |
Данный пункт также не описываю, так как это не относится к данной теме. Можно реализовать это любым способом: Proxmox, VMware, VirtualBox, физические хосты и тп.
Server WAN-proxy (Внешний прокси)
Настраиваем сеть и прописываем статику:
nano /etc/network/interfaces
auto ens192
iface ens192 inet static
address 192.168.100.20
netmask 255.255.255.0
gateway 192.168.100.1
Wireguard
Если вы ранее выбрали пункт с wireguard.
- Устанавливаем необходимые пакеты:
apt update && apt install -y ntp curl net-tools sudo privoxy wireguard resolvconf nmap
- Создаем конфиг клиента Wireguard. (копируем конфиг после настройки VPN сервера):
nano /etc/wireguard/wg-feniks.conf
#WireGuard конфиг. У вас будут свои значения
[Interface]
PrivateKey = 8O######Kx3TBkxQoF9V94##############M7pcxY6gULHE=
dns = 8.8.8.8
ListenPort = 23317
Address = 10.0.246.161/24
PreUp = nping --udp --count 1 --data-length 16 --source-port 23317 --dest-port 18024 wireguard.server.com
[Peer]
PublicKey = ipW9/ys########################XIqz4PQY=
AllowedIPs = 0.0.0.0/0, ::/0
Endpoint = wireguard.server.com:18024
Добавляем параметры к исходному конфигу: ListenPort
и PreUp
- Сгенерируем пару открытого и закрытого ключей клиента, для этого выполните следующую команду:
wg genkey | tee client_private.key | wg pubkey | tee client_public.key
- Проверяем свой ip адрес до поднятия интерфейса:
curl 2ip.ru
- Поднимаем интерфейс Wireguard:
wg-quick up wg-feniks
- Если явных ошибок не было, то проверяем свой ip адрес. Теперь он другой должен быть:
curl 2ip.ru
- Добавляем в автозапуск поднятие интерфейса Wireguard:
systemctl enable wg-quick@wg-feniks
Можем проверить перезагрузкой сервера. Если интерфейс после ребута поднялся, то все отлично.
Настройка Wireguard завершена.
VLESS
Если вы ранее выбрали пункт с VLESS.
Пример установки на OpenWRT
- Обновляем пакеты и ставим необходимые нам.
apt update && apt upgrade && apt install sudo curl gpg openssh-server ssh htop -y
- Добавляем нашего пользователя в групу
sudo
.
usermod -aG sudo infernofeniks
- Устанавливаем docker на хост.
curl -fsSL https://get.docker.com -o get-docker.sh && sh ./get-docker.sh && apt install docker-compose -y
- Добавляем нашего пользователя в группу docker.
usermod -aG docker infernofeniks
- Создаем конфиг для v2raya.
mkdir -p docker/v2raya && cd docker/v2raya/ && nano docker-compose.yaml
docker-compose.yaml
version: '3.8'
services:
v2raya:
image: mzz2017/v2raya
container_name: v2raya
restart: always
# если нужен прозрачный прокси:
# privileged: true
# network_mode: host
# environment:
# - V2RAYA_LOG_FILE=/tmp/v2raya.log
# - V2RAYA_V2RAY_BIN=/usr/local/bin/v2ray
# - V2RAYA_NFTABLES_SUPPORT=off # "on" если ОС использует nftables, иначе "off"
# - IPTABLES_MODE=legacy # "nftables", если nft или "legacy", если iptables
# volumes:
# - /lib/modules:/lib/modules:ro
# - /etc/resolv.conf:/etc/resolv.conf
# - /etc/v2raya:/etc/v2raya
# если не нужен прозрачный прокси:
ports:
- 2017:2017
- 20170:20170
- 20171:20171
- 20172:20172
environment:
- V2RAYA_LOG_FILE=/tmp/v2raya.log
volumes:
- /etc/v2raya:/etc/v2raya
- Запускаем v2raya.
docker-compose up -d
- Переходим в браузер: http://<IP хоста>:2017
- Создаем логин и пароль для входа.
- Переходим в настройки.
- Прозрачный прокси/Системный прокси -
выключено
- IP форвардинг -
включено
- Port Sharing -
включено
- Режим разделения трафика на порте с правилами -
RoutingA
- В Настройках
RoutingA
оставляем только одну строку:default: proxy
- В Настройках
- Предотвратить DNS-спуфинг -
выключено
- Специальный режим -
выключено
- TCPFastOpen -
по-умолчанию
- Мультиплекс -
выключено
- Автоматически обновлять подписки -
выключено
- Сохраняем настройки
- Прозрачный прокси/Системный прокси -
- Импортируем конфигурацию подключения.
- Заходим на наш VDS сервер по http, где ставили 3x-ui и создавали пользователя. Находим в информации пользователя строку URL и копируем ее.
- На хосте с v2raya нажимаем
импортировать
и вставляем скопированную строку подключения. - На главной странице v2ray выбираем наш сервер и в колонке "Операции" нажимаем
выбрать/подключиться
. - Запускаем соединение. В верхнем левом углу нажимаем
ПУСК
.
Настройка Privoxy WAN (Внеший прокси)
Вся настройка внешнего прокси сводится к тому, чтобы в конфиг прописать адрес прослушивания в локальной сети.
Вариант с WireGuard
- Открываем конфиг Privoxy:
nano /etc/privoxy/config
- Добавляем адрес и порт в нашей сети. У меня это будет:
192.168.100.20
и порт8118
(если WireGuard) или порт20170
(если v2rayA)
listen-address 127.0.0.1:20170
listen-address 192.168.100.20:20170
- Перезагружаем Privoxy:
systemctl restart privoxy.service
Проверяем с другой машины в сети свой адрес на 2ip.ru
, предварительно внеся конфигурацию прокси на клиенте. Должен быть IP адрес, который мы получаем от VPN.
Вариант с v2rayA
Если идти по пути с VLESS, то можно исключить этот пункт Настройка Privoxy WAN (Внеший прокси), как и "внешний прокси сервер". Вместо промежуточного privoxy, у нас будет на одном хосте работать v2rayA в docker, который прослушивает порт и Privoxy, который перенаправляет запросы на порт контейнера v2rayA (к примеру на 127.0.0.1:20170).
То есть мы устанавливаем v2rayA и Privoxy на одном хосте. Чтобы понять, как в таком случае настраивать Privoxy, переходим к слудующему пункту "Privoxy LAN (Внутренний прокси)" и настраиваем все не на втором хосте, а на том, который уже делали (Server WAN-proxy (Внешний прокси)). Обратите внимание на порт Privoxy. Мы указывали 20170
- поменяем его на 1080
.
Privoxy LAN (Внутренний прокси)
- Настраиваем сеть:
nano /etc/network/interfaces
iface ens192 inet static
address 192.168.100.21
netmask 255.255.255.0
gateway 192.168.100.1
dns-nameservers 8.8.8.8
auto ens192
- Устанавливаем необходимые пакеты:
apt update && apt install -y ntp curl net-tools sudo privoxy
Настройка Privoxy
- Открываем конфиг Privoxy.
nano /etc/privoxy/config
- Добавляем адрес и порт в нашей сети. У меня это будет:
192.168.100.21
и порт1080
.
listen-address 127.0.0.1:1080
listen-address 192.168.100.21:1080
- Так же добавляем данные о своих файлах
*.action
в раздел2.5. actionsfile
до записиdefault.action
.
# 2.5. actionsfile
actionsfile via-nuc.action # Allow sites
actionsfile antiban.action # Antiban ROSREESTR
- Копируем в директорию
/etc/privoxy/
свои два файлаvia-nuc.action
иantiban.action
.
Файл via-nuc.action
перекидывает запросы:
- на внешний прокси WireGuard. Если два хоста и WireGuard
# Pass through NUC's privoxy
{ +forward-override{forward 192.168.100.20:20170} }
#.2ip.ru/
.myip.com
меняем на нужное вам значение адрес
и порт
. В помощь команда sed
. Пример:
sed -i 's/192\.168\.100\.20:1080/192\.168\.100\.20:20170/g' /etc/privoxy*.action
- на локальный порт v2rayA. Если пошли по пути VLESS и с одним хостом.
# Pass through NUC's privoxy
{ +forward-override{forward 127.0.0.1:20171} }
#.2ip.ru/
.myip.com
меняем на нужное вам значение адрес
и порт
. В помощь команда sed
. Пример:
sed -i 's/192\.168\.100\.20:8118/127\.0\.0\.1:20171/g' /etc/privoxy*.action
Исходя из его содержимого: на 2ip.ru
мы пойдем без внешнего прокси с VPN, а на myip.com
уже через VPN.
Файл antiban.action
делает тоже самое, но он сформирован из общих баз.
- Перезагружаем Privoxy.
systemctl restart privoxy.service
На клиентах в локальной сети прописываем локальный прокси и пользуемся свободным интернетом. Если прописать клиенту внешний прокси (вариант с двумя хостами), то совершенно все запросы HTTP(S) будут лететь через VPN. А если у нас вариант с одним хостом и v2rayA в docker + Privoxy, то прописываем порт единственного хоста 1080
(Privoxy),он ведет на внутренрий порт контейнера 20171
после фильтрации.
Бонус. Прокси для устройств, которые не умеют работать с прокси (телевизоры, холодильники, стиралки и тд.)
Чтобы направить весь трафик с устройств, которые не поддерживают настройку прокси-сервера, через существующий прокси-сервер с VPN, можно использовать технику под названием "транспарентный прокси". Основная идея заключается в перенаправлении трафика на прокси-сервер с помощью правил маршрутизации и iptables. Вот подробное руководство по настройке:
- Подготовка прокси-сервера.
Убедитесь, что ваш прокси-сервер (192.168.100.21) поддерживает работу в транспарентном режиме. В случае с SOCKS5 прокси на порту 20170
(смотрим наш docker v2rayA), нужно будет использовать такие инструменты, как redsocks и iptables для перенаправления трафика.
- Настройка iptables на прокси-сервере.
Вам нужно настроить iptables на прокси-сервере, чтобы перенаправлять весь трафик от устройств через прокси-сервер.
apt update && apt-get install redsocks -y
- Настройка Redsocks.
- Создайте конфигурационный файл для redsocks
/etc/redsocks.conf
со следующим содержанием:
nano /etc/redsocks.conf
base {
log_debug = off;
log_info = on;
daemon = on;
redirector = iptables;
}
redsocks {
local_ip = 0.0.0.0; # Адрес на котором доступен redsocks
local_port = 12345; # Порт, на который будет перенаправляться весь трафик
ip = 127.0.0.1; # # Адрес вашего SOCKS5 прокси-сервера (docker v2rayA)
port = 20170; # Порт вашего SOCKS5 прокси-сервера (docker v2rayA)
type = socks5; # Тип прокси-сервера
}
- Запустим redsocks.
systemctl restart redsocks
- Настройка iptables для перенаправления трафика.
Теперь настроим iptables на прокси-сервере, чтобы перенаправить трафик на локальный порт, который слушает redsocks.
- Предварительно убеждаемся, что включили
ip_forward
.
nano /etc/sysctl.conf
net.ipv4.ip_forward=1
sysctl -p
- Добавляем правила NAT
- Создадим цепочку
REDSOCKS
.
iptables -t nat -N REDSOCKS
- Исключаем локальный трафик.
iptables -t nat -A REDSOCKS -d 10.0.0.0/8 -j RETURN
iptables -t nat -A REDSOCKS -d 127.0.0.0/8 -j RETURN
iptables -t nat -A REDSOCKS -d 172.16.0.0/12 -j RETURN
iptables -t nat -A REDSOCKS -d 192.168.0.0/16 -j RETURN
- Исключаем трафик на порт
1080
(Privoxy), чтобы он не перенаправлялся черезREDSOCKS
. Только если ставим Privoxy и v2rayA на одном хосте!
iptables -t nat -A REDSOCKS -p tcp --dport 1080 -j RETURN
- Перенаправляем TCP трафик на порт redsocks
iptables -t nat -A REDSOCKS -p tcp -j REDIRECT --to-ports 12345
- Применяем правила на весь трафик.
ens18
замените на ваш интерфейс
iptables -t nat -A PREROUTING -i ens18 -p tcp -j REDSOCKS
Чтобы сохранить правила iptables и обеспечить их автоматическое восстановление после перезагрузки, можно использовать пакет iptables-persistent, который позволяет сохранять и автоматически восстанавливать правила iptables при перезагрузке.
- Установка iptables-persistent:
apt update && apt install iptables-persistent
В процессе установки вас попросят сохранить текущие правила iptables — выберите Yes
.
Если правила изменились или вы хотите вручную обновить сохраненные правила, выполните:
iptables-save
- Настройка маршрутизации на устройствах или роутере.
Чтобы направить трафик с устройств через прокси-сервер, настройте роутер или используйте статическую маршрутизацию:
Если ваш роутер поддерживает настройку статической маршрутизации, добавьте маршрут, чтобы весь трафик HTTP/HTTPS направлялся на прокси-сервер.
Если на устройствах можно изменить шлюз, то установите 192.168.100.21 (IP прокси-сервера) в качестве шлюза по умолчанию.
После этих настроек весь HTTP/HTTPS трафик с устройств, которые не поддерживают установку прокси-сервера, будет перенаправлен через ваш прокси-сервер с VPN.
При замене шлюза по умолчанию на устройствах с роутера на прокси-сервер (192.168.0.100), могут возникнуть некоторые сложности. Давайте разберем, как это работает и возможные проблемы.
- Как работает изменение шлюза по умолчанию.
Когда вы устанавливаете прокси-сервер (192.168.100.21) в качестве шлюза по умолчанию на устройствах, весь трафик от этих устройств будет направляться через прокси-сервер. Прокси-сервер в этом случае выступает как маршрутизатор и обрабатывает пакеты, направляя их через VPN.
- Проблемы с NAT (Network Address Translation)
Если устройства будут выходить в интернет через VPN прокси-сервера, нужно настроить NAT, чтобы пакеты возвращались обратно на устройство.
Решение: Настройте NAT на прокси-сервере для пакетов, идущих в интернет через VPN:
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
Здесь tun0 — интерфейс VPN. Убедитесь, что используется правильный интерфейс вашего VPN.
- Доступность локальной сети.
Если устройства также должны иметь доступ к другим ресурсам локальной сети (например, принтерам или другим компьютерам), убедитесь, что маршруты к локальной сети не изменены.
Решение: Добавьте правила в iptables, чтобы пакеты, идущие в локальную сеть, не перенаправлялись в VPN или не проходили через прокси:
iptables -t nat -A PREROUTING -s 192.168.100.0/24 -d 192.168.100.0/24 -j ACCEPT
- DNS-рекламации.
Устройства могут столкнуться с проблемами DNS, так как прокси-сервер не всегда будет корректно обрабатывать DNS-запросы, если он не настроен на пересылку таких запросов.
Решение: Убедитесь, что прокси-сервер настроен на использование надежного DNS-сервера и умеет перенаправлять DNS-запросы. Можно использовать Google DNS (8.8.8.8) или другой внешний DNS-сервер.
Итоговые рекомендации.
- Для корректной работы трафика и DNS, убедитесь, что все необходимые сервисы настроены на прокси-сервере.
- Проверьте маршрутизацию: добавьте необходимые маршруты, чтобы исключить перенаправление трафика в VPN там, где это не нужно (локальная сеть).
- Мониторинг: отслеживайте трафик с помощью tcpdump или аналогичных инструментов, чтобы убедиться, что пакеты идут по назначению и возвращаются обратно.
Если все настроить правильно, то прокси-сервер будет успешно выполнять функции маршрутизатора, обрабатывая трафик и направляя его в VPN, обеспечивая требуемую конфигурацию сети.
Блокировка рекламы ADBlock
Спасибо проекту RPFT
privoxy-bl-upd.pl
- perl скрипт, закачивающий черные списки ADBlock и преобразующий их в формат действий (action) Privoxy. Результатом его работы становится adblock.action
, который и используется в последствии. Для автоматизации создания adblock.action
, необходимо прописать privoxy-bl-upd.pl
в crontab
Скачиваем скрипт и копируем его в /etc/privoxy
.
Даем права на запуск скрипта:
chmod 755 /etc/privoxy/privoxy-bl-upd.pl
Так же в /etc/privoxy
закидываем файлы: adblock.action
, rpft.action
, rpft.filter
.
Делаем изменения в конфиге Privoxy:
nano /etc/privoxy
- после строки
actionsfile default.action
ставите строку:
actionsfile adblock.action
- перед строкой
actionsfile user.action
ставите строку:
actionsfile rpft.action
- после строки:
filterfile default.filter
ставите строку:
filterfile rpft.filter
Автоматизация adblock
Ставим задание по крону, чтобы раз в неделю (5 утра понедельника), обновлялся список блокировок:
crontab -e
# Update ADBlock list for Privoxy
0 5 * * 1 /etc/privoxy/privoxy-bl-upd.pl
В слудующей статье добавим шифрование DNS запросов... DNSCrypt + DNSmasq