Skip to content
gSpot edited this page Nov 18, 2024 · 39 revisions

Описание

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

  • Главное нововведение версии 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) не требуют установки модуля-парсера (см. далее).

Типы обхода блокировок:

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

  1. ip - модули загружают из блэклиста все IP адреса и диапазоны CIDR, которые содержатся в записях, и они сразу помещаются в соответствующие nftset'ы. Данный вариант не задействует в своей работе dnsmasq, т.е список блокировок статичен и формируется только при обновлении. Нужно отметить, что nftables имеет проблемы с большими сетами IP адресов. Даже на избыточно мощном железе эта проблема приводит к существенным подтормаживаниям утилиты nft при работе с таблицей в которой находится такой сет. Для устройств с ограниченными ресрсами (CPU, RAM) эта проблема может привести к существенной утечке памяти в моменты обновления блэклиста. Количество записей при котором проблема становится заметной - около 100000 записей, но всё зависит от количества доступной оперативной памяти. Поэтому использовать режим ip нужно лишь понимая к чему это может привести на вашем устройстве.

  2. 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
Clone this wiki locally