-
Notifications
You must be signed in to change notification settings - Fork 21
Home
Ruantiblock - решение для обхода блокировок (при помощи Tor, VPN-соединения или других решений для проксификации трафика поддерживающих локальные прозрачные прокси (Shadowsocks + ss-redir, Redsocks, sing-box и пр.)) с выборочной проксификацией трафика к заблокированным ресурсам (при этом доступ к остальным ресурсам осуществляется напрямую). В качестве источника списка блокировок поддерживаются выгрузки с сайтов: zapret-info, https://rublacklist.net и https://antifilter.download, а также список созданный самим пользователем. Включает в себя функции управления правилами nftables и парсер списка блокировок. Доступны конфигурации с использованием доменных имен (dnsmasq) и IP адресов (включая диапазоны CIDR).
Данная версия решения предназначена для OpenWrt. В отличии от других решений подобного типа не имеет жёсткой интеграции и привязки исключительно к OpenWrt (при этом поддерживает конфигурацию через UCI, а также имеется функциональное LuCI-приложение) и может быть перенесено на другие Linux. Вся конфигурация находится в одном месте, все операции выполняются с помощью одного скрипта (/usr/bin/ruantiblock
), широкие возможности конфигурации. Помимо прочего, данное решение предлагает опции для собственной тонкой настройки оптимизации списка блокировок: группировка и суммаризация IP, объединение поддоменов, фильтрация записей по шаблонам...
Текущая актуальная ветка ruantiblock v2.x (для OpenWrt >= 23.05 с использованием nftables). Предыдущая ветка v1.x более не развивается.
-
Главное нововведение версии 2.0 - возможность использовать разные VPN/прокси для нескольких пользовательских списков.
-
В режим прозрачного прокси добавлена возможность выбора типа прокси: redirect или tproxy. Эта опция определяет тип действия в правилах nftables. Раньше для прозрачного прокси применялся только redirect, добавление tproxy обеспечивает поддержку прокси-сервера sing-box в режиме TProxy.
-
Конфигурационные файлы версии 2.0 не совместимы с предыдущими версиями! Перед установкой новой версии необходимо полностью удалить старую. Также, для предотвращения потенциальных проблем с веб-интерфейсом, можно очистить кэш браузера после установки.
Автоматическая установка с помощью скрипта - ruantiblock v2.x (OpenWrt >= 23.05)
Самостоятельная установка и настройка ruantiblock v2.x (OpenWrt >= 23.05)
Настройка ruantiblock для совместной работы с прокси сервером sing‑box
Использование бесплатных Shadowsocks прокси проекта Outline
Доступны три режима проксификации трафика: с использованием сети Tor, клиентского VPN соединения (OpenVPN, PPTP, WireGuard, OpenConnect и прочие L3 VPN предоставляющие сетевой интерфейс для маршрутизации трафика) и прозрачного прокси (например, Shadowsocks + ss-redir, Redsocks + Socks-прокси и пр.). Режим прокси определяется парметром ruantiblock.config.proxy_mode
. 1
- Tor, 2
- VPN, 3
- прозрачный прокси. Включение режима в UCI (на примере VPN):
uci set ruantiblock.config.proxy_mode="2"
uci commit ruantiblock
Данный параметр влияет, в первую очередь, на процесс создания правил nftables.
Доступны следующие режимы обновления блэклиста:
ruantiblock-fqdn
ruantiblock-ip
zapret-info-fqdn
zapret-info-ip
rublacklist-fqdn
rublacklist-ip
antifilter-ip
Так можно задать в UCI:
uci set ruantiblock.config.bllist_preset="zapret-info-fqdn"
uci commit ruantiblock
По сути, режим обновления блэклиста является комбинацией источника и типа обхода блокировок (ip
, fqdn
). Первые два режима обновления блэклиста (ruantiblock-fqdn
, ruantiblock-ip
) не требуют установки модуля-парсера (см. далее).
Типы обхода блокировок:
Обход блокировок может выполняться в одном из двух вариантов:
-
ip
- модули загружают из блэклиста все IP адреса и диапазоны CIDR, которые содержатся в записях, и они сразу помещаются в соответствующие nftset'ы. Данный вариант не задействует в своей работе dnsmasq, т.е список блокировок статичен и формируется только при обновлении. Нужно отметить, что nftables имеет проблемы с большими сетами IP адресов. Даже на избыточно мощном железе эта проблема приводит к существенным подтормаживаниям утилиты nft при работе с таблицей в которой находится такой сет. Для устройств с ограниченными ресрсами (CPU, RAM) эта проблема может привести к существенной утечке памяти в моменты обновления блэклиста. Количество записей при котором проблема становится заметной - около 100000 записей, но всё зависит от количества доступной оперативной памяти. Поэтому использовать режимip
нужно лишь понимая к чему это может привести на вашем устройстве. -
fqdn
- из блэклиста извлекаются доменные имена (FQDN). Из записей, в которых отсутствует доменное имя, извлекаются IP адреса и CIDR диапазоны. Домены заносятся в конфиг dnsmasq и, далее, dnsmasq формирует временный список nftset по мере обращения к этим доменам, записи добавляются и удаляются динамически на основе DNS-запросов и таймаута. Т.е. домены обрабатывает dnsmasq, а CIDR диапазоны и IP адреса помещаются сразу в nftset. В этом варианте разрешение доменного имени в IP адрес происходит при обращении к заблокированному сайту, следовательно IP адрес сайта всегда будет актуальным (даже если устарел в самом списке блокировок).
Источники блэклиста:
ruantiblock
- https://github.com/gSpotx2f/ruantiblock_blacklist. Заранее созданные конфиги для nftables и dnsmasq. Загружаются уже готовые файлы, без выполнения каких-либо оптимизаций и обработок. Обновляется раз в сутки. Этот источник даёт блэклист для стандартной конфигурации ruantiblock и ваш роутер не выполняет никакой тяжёлой работы по обработке данных. Включен по умолчанию и не требует установки модуля-парсера.
Можно организовать собственный источник заранее подготовленных конфигов со своими настройками, которые формируются вне роутера (например, на выделенном сервере или ПК и загружаются на GitHub). Это может быть полезно при наличии нескольких роутеров (использующих данное решение для обхода блокировок), где формирование конфигов nftables и dnsmasq происходит один раз на одной машине, а другие получают уже готовые сформированные конфиги (не выполняя повторно одну и ту же работу).
zapret-info
- https://github.com/zapret-info/z-i. Реестр в формате csv, что делает его очень удобным для разбора. Очень надёжный источник, сбои бывают редко, расположен на GitHub (есть зеркала). Существует с самого начала блокировок в РФ, с 2012 года!
rublacklist
- https://rublacklist.net. Блэклист от Роскомсвободы. В режиме fqdn
, также, содержит много лишних данных и огромный размер выгрузки, но имеет удобный API. Бывают проблемы с надёжностью (недоступность сайта и пр). Можно использовать в случае недоступности других источников. Обновление из этого источника выполняется довольно долго из-за размера выгрузки.
antifilter
- https://antifilter.download. Этот источник для устройств, которым не хватает оперативной памяти для полных списков блокировок. Доступен только вариант ip
- оптимизированный список IP адресов (все адреса приведены к маске /24). Очень компактен в размере, но покрывает большое количество лишних IP адресов в диапазонах. Ссылку на файл блэклиста из этого источника можно добавить в список удалённых записей пользователя и получать IP адреса напрямую без установки парсера отключив основной блэклист. Файл имеет простой формат совместимый с форматом файла записей пользователя.
Модули-парсеры:
Установка модуля необходима для самостоятельного формирования списка блокировок силами роутера. Модуль выкачивает данные из источника, выполняет их преобразование (включая оптимизации) в необходимый для работы формат. Модуль требуется для всех источников блэклиста (zapret-info
, rublacklist
, antifilter
), кроме ruantiblock
, который предоставляет уже готовые и оптимизированные конфиги. Ну и как было отмечено ранее, antifilter
тоже можно использовать напрямую без парсера через записи пользователя.
/usr/libexec/ruantiblock/ruab_parser.lua
- стандартный модуль, написан на Lua. Работает быстро, когда достаточно свободной оперативной памяти. Установка.
/usr/libexec/ruantiblock/ruab_parser.py
- дополнительный модуль, написан на Python3 и не имеет проблем с кириллицей, кодировкой CP1251 и пр. Работает медленнее, но аккуратнее раcходует оперативную память. Недостаток в том, что нужно много свободного места в ПЗУ для установки Python3. Установка.
Установленный модуль можно включить в UCI:
uci set ruantiblock.config.bllist_module="/usr/libexec/ruantiblock/ruab_parser.lua"
uci commit ruantiblock
Далее описаны некоторые опции доступные через UCI, они переопределяют часть переменных конфигурационного файла /etc/ruantiblock/ruantiblock.conf
.
- Запись событий в syslog (
ENABLE_LOGGING=1
):
Опция включает запись событий в системный лог. Отключить:
uci set ruantiblock.config.enable_logging="0"
- Проксификация трафика локальных клиентов (
PROXY_LOCAL_CLIENTS=1
):
Эта опция включает обработку трафика локальных приложений роутера в ruantiblock. Т.е. различные сетевые утилиты установленные на самом роутере ходят на заблокированные сайты через Tor или VPN. Отключить:
uci set ruantiblock.config.proxy_local_clients="0"
- Очистка сетов nftables перед обновлением блэклиста (
NFTSET_CLEAR_SETS=1
):
Включение этой опции позволяет освободить некоторое количество оперативной памяти (зависит от текущего размера списка блокировок) перед обновлением блэклиста. Недостаток в том, что во время обновления не применяются правила отбора трафика в Tor или VPN, т.е. обход блокировок не работает до завершения обновления блэклиста. Следует применять лишь в случае проблем со свободной оперативной памятью. Включить:
uci set ruantiblock.config.nftset_clear_sets="1"
- Режим фильтра хостов (ALLOWED_HOSTS_MODE=0):
Параметр позволяет ограничить хосты, которым разрешено обходить блокировки. Может иметь три значения: 0 - выключено (все хосты обходят блокировки); 1 - обход блокировок работает только для хостов указанных в переменной ALLOWED_HOSTS_LIST
; 2 - обход блокировок работает для всех хостов кроме указанных в переменной ALLOWED_HOSTS_LIST
. Изменение режима фильтра хостов:
uci set ruantiblock.config.allowed_hosts_mode="1"
- Список IP адресов для фильтра хостов (ALLOWED_HOSTS_LIST=""):
Добавление хостов в список:
uci add_list ruantiblock.config.allowed_hosts_list="192.168.0.10"
uci add_list ruantiblock.config.allowed_hosts_list="192.168.0.15"
и т.д.
- VPN интерфейс (IF_VPN="tun0"):
Параметр нужен для правил маршрутизации в VPN конфигурации основного блэклиста. Должен содержать интерфейс L3 VPN. По умолчанию (OpenVPN): tun0
ruantiblock.config.if_vpn="tun0"
- IP адрес шлюза для VPN конфигурации (VPN_GW_IP=""):
Если не задан, используется адрес VPN интерфейса (или адрес пира для протоколов PPP)
IP адрес шлюза VPN, который используется в правиле маршрутизации для отправки пакетов в VPN. Если значение пустое (по умолчанию), то используется адрес VPN интерфейса (или адрес пира для протоколов PPP). Задать шлюз:
ruantiblock.config.vpn_gw_ip="10.0.0.1"
- Тип добавление правила в таблицу маршрутизации в режиме VPN (VPN_ROUTE_CHECK=0):
Способ добавления в таблицу маршрутизации правила для отправки пакетов в VPN туннель. Опция необходима для VPN приложений не имеющих достаточной интеграции с OpenWrt (не выполняющих скрипты в /etc/hotplug.d/iface
при поднятии сетевого интерфейса). 0 - стандартная опция (использование скрипта /etc/hotplug.d/iface/40-ruantiblock
) для многих VPN-приложений поддерживаемых в OpenWrt. 1 - скрипт /usr/libexec/ruantiblock/ruab_route_check
, который регулярно проверяет наличие записи в таблице маршрутизации (и при необходимости сам добавляет маршрут).
uci set ruantiblock.config.vpn_route_check='1'
- Тип прозрачного прокси (
T_PROXY_TYPE=0
):
Тип прозрачного прокси. Эта опция определяет тип действия в правилах nftables: redirect (0
) или tproxy (1
). Изменить:
uci set ruantiblock.config.t_proxy_type="1"
- UDP-порт прозрачного прокси (
T_PROXY_PORT_UDP=10053
):
В режиме проксификации трафика с использованием прозрачного прокси, определяет порт на который может перенаправляться UDP-трафик. Прозрачный прокси должен поддерживать UDP! Изменить порт:
uci set ruantiblock.config.t_proxy_port_udp="10053"
- Отправлять в прозрачный прокси UDP-трафик (
T_PROXY_ALLOW_UDP=0
):
В режиме проксификации трафика с использованием прозрачного прокси, UDP-трафик также отправляется в прокси. Прозрачный прокси должен поддерживать UDP! При отключении этой опции в прокси попадает только TCP, а UDP идёт напрямую, без обхода блокировок. Включить:
uci set ruantiblock.config.t_proxy_allow_udp="1"
- Включение режима полного прокси (ENABLE_FPROXY=0):
При включении этой опции, весь трафик хостов заданных в переменной FPROXY_LIST
будет отправляться в прокси, без применения правил блэклиста. Включить:
uci set ruantiblock.config.enable_fproxy="1"
- Список IP адресов для режима полного прокси (FPROXY_LIST=""):
Добавление хостов в список:
uci add_list ruantiblock.config.fproxy_list="192.168.0.10"
uci add_list ruantiblock.config.fproxy_list="192.168.0.15"
и т.д.
- Режим безопасного обновления блэклиста (ENABLE_TMP_DOWNLOADS=0):
В процессе обновления блэклиста скачивание данных осуществляется во временный файл и затем, в случае успешного получения данных, заменяется основной файл. При такой схеме, если обновление завершилось ошибкой, старая конфигурация блэклиста будет сохранена и продолжит работать. Негативный момент в том, что увеличивается потребление памяти (для хранения временного файла в процессе обновления блэклиста). Включить:
uci set ruantiblock.config.enable_tmp_downloads="1"
- Скачивание блэклиста через прокси при обновлении (ENABLE_BLLIST_PROXY=0):
Во время обновления блэклист скачивается через прокси. Необходимо, если источник блэклиста заблокирован. Включить:
uci set ruantiblock.config.enable_bllist_proxy="1"
- Оптимизации записей в итоговых конфигах nftables и dnsmasq: группировка субдоменов и IP адресов, суммаризация IP адресов (
BLLIST_SD_LIMIT
,BLLIST_IP_LIMIT
,BLLIST_GR_EXCLUDED_SLD_FILE
,BLLIST_GR_EXCLUDED_NETS_FILE
,BLLIST_SUMMARIZE_IP
,BLLIST_SUMMARIZE_CIDR
):
- Фильтрация записей блэклиста по шаблонам (
BLLIST_IP_FILTER
,BLLIST_IP_FILTER_TYPE
,BLLIST_FQDN_FILTER
,BLLIST_FQDN_FILTER_TYPE
):
Переменные определяют параметры функции предварительной фильтрации записей блэклиста. Подробнее здесь...
- Преобразование кириллических доменов в punycode (
BLLIST_ENABLE_IDN=0
):
В lua-модуле (ruab_parser.lua
) преобразование выполняется дополнительной библиотекой lua-idn. Python-модуль (ruab_parser.py
) уже имеет всё необходимое в стандартной библиотеке. Если существует насущная необходимость учитывать кириллические домены, то с этим лучше справляется именно python-модуль. Данная опция некорректно работает с источником zapret-info
в lua-модуле, поскольку данные имеют кодировку CP1251 и конвертирование кодировок выполняется утилитой iconv, но OpenWrt не поддерживает CP1251. Поэтому, правило такое: если нужны кириллические домены и источник блэклиста zapret-info
- используйте только python-модуль! Вообще, во всём списке блокировок количество кириллических доменов не значительно, без преобразования в punycode они просто не проходят через регулярные выражения и отбрасываются парсером. Включить:
uci set ruantiblock.config.bllist_enable_idn="1"
- Разрешение DNS-имен через альтернативный DNS-сервер (
BLLIST_ALT_NSLOOKUP=0
):
Добавление записи DNS-сервера для каждого домена в конфиге dnsmasq (очень существенно увеличивает размер конфига dnsmasq!):
uci set ruantiblock.config.bllist_alt_nslookup="1"
Если провайдер блокирует сторонние DNS-серверы, то необходимо использовать dnscrypt-proxy (или https-dns-proxy и пр.) на роутере. На сегодняшний день, лучший вариант - применять полное шифрование DNS, вообще без использования этой опции.
Tor также имеет свой собственный резолвер, который вполне можно использовать...
- Альтернативный DNS-сервер (
BLLIST_ALT_DNS_ADDR="8.8.8.8"
):
Альтернативный DNS-сервер для предыдущего пункта.
uci set ruantiblock.config.bllist_alt_dns_addr="8.8.8.8"` # можно указывать с портом: "8.8.8.8#53"
Если ruantiblock.config.bllist_alt_nslookup="1"
, то для каждого домена в конфиге dnsmasq добавляется дополнительная запись, указывающая использовать данный DNS-сервер для этого домена.
Есть и другие параметры для более тонкой настройки, часть из них имеют пояснения в самом конфигурационном файле (/etc/ruantiblock/ruantiblock.conf
). Также, смотрите UCI-конфиг /etc/config/ruantiblock
.
ruantiblock start # Включение ruantiblock. Создаются правила nftables и пр.
ruantiblock stop # Выключение ruantiblock. Очищаются все списки nftset, удаляются правила nftables. Трафик идет стандартным способом, Tor или VPN не используется
ruantiblock destroy # То же, что и stop + удаление всех списков nftset, удаление таблицы nftables и очистка файлов ruantiblock.dnsmasq и ruantiblock.ip
ruantiblock restart # Рестарт
ruantiblock reload # Пересоздание цепочки и правил nftables (а также таблицы маршутизации при VPN-конфигурации)
ruantiblock update # Обновление блэклиста и списков nftset
ruantiblock force-update # Принудительное обновление блэклиста (может потребоваться если предыдущее обновление выполнено некорректно или было прервано в процессе выполнения)
ruantiblock data-files # Создание файлов ruantiblock.dnsmasq и ruantiblock.ip, без обновления сетевой конфигурации
ruantiblock status # Вывод текущего статуса, а также общей инфо (кол-во записей в списках nftset, дата последнего обновления блэклиста и пр.)
Перед изменением конфигурации ruantiblock необходимо обязательно выполнить удаление всех сетов и правил nftables:
/usr/bin/ruantiblock destroy
после изменения настроек выполнить обновление:
/usr/bin/ruantiblock start
/usr/bin/ruantiblock update
/etc/init.d/ruantiblock disable