Skip to content
gSpot edited this page Sep 22, 2024 · 35 revisions

Описание

Ruantiblock - решение для обхода блокировок (при помощи Tor, VPN-соединения или других решений для проксификации трафика поддерживающих локальные прозрачные прокси (Shadowsocks + ss-redir, Redsocks и пр.)) с выборочной проксификацией трафика к заблокированным ресурсам (при этом доступ к остальным ресурсам осуществляется напрямую). В качестве источника списка блокировок поддерживаются выгрузки с сайтов: https://rublacklist.net, zapret-info и https://antifilter.download, а также список созданный самим пользователем. Включает в себя функции управления правилами nftables и парсер списка блокировок. Доступны конфигурации с использованием доменных имен (dnsmasq) и IP адресов (включая диапазоны CIDR).

Данная версия решения предназначена для OpenWrt. В отличии от других решений подобного типа не имеет жёсткой интеграции и привязки исключительно к OpenWrt (при этом поддерживает конфигурацию через UCI, а также имеется функциональное LuCI-приложение) и может быть перенесено на другие Linux. Вся конфигурация находится в одном месте, все операции выполняются с помощью одного скрипта (/usr/bin/ruantiblock), широкие возможности конфигурации. Помимо прочего, данное решение предлагает опции для собственной тонкой настройки оптимизации списка блокировок: группировка и суммаризация IP, объединение поддоменов, фильтрация записей по шаблонам...

Текущая актуальная ветка ruantiblock v1.x (для OpenWrt >= 23.05 с использованием nftables). Старая ветка v0.9 (для OpenWrt <= 22.03 с использованием iptables, более не развивается).

Установка

Автоматическая установка с помощью скрипта - ruantiblock v1.x (OpenWrt >= 23.05)

Самостоятельная установка и настройка ruantiblock v1.x (OpenWrt >= 23.05)

Автоматическая установка с помощью скрипта - ruantiblock v0.9 (OpenWrt 21.02, 22.03)

Самостоятельная установка и настройка ruantiblock v0.9 (OpenWrt 21.02, 22.03)

Старая вики для ruantiblock v0.9 (под iptables, OpenWrt 21.02, 22.03)

Дополнительно

Использование бесплатных Shadowsocks прокси проекта Outline

Настройка ruantiblock для совместной работы с прокси сервером sing‑box

Режимы прокси

Доступны три режима проксификации трафика: с использованием сети Tor, клиентского VPN соединения (OpenVPN, PPTP, WireGuard, OpenConnect и прочие, предоставляющие сетевой интерфейс для маршрутизации трафика) и прозрачного прокси (например, 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, т.е список блокировок статичен и формируется только при обновлении.

  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. Реестр в исходном виде. Содержит много дополнительных данных для каждой записи, что увеличивает размер файла (к тому же в кодировке CP1251). Очень надёжный источник, сбоев практически не бывает, расположен на GitHub (есть зеркала).

rublacklist - https://rublacklist.net. Блэклист от Роскомсвободы. В режиме fqdn, также, содержит много лишних данных и огромный размер выгрузки, но имеет удобный API. Иногда бывают проблемы с надёжностью (недоступность сайта и пр). Можно использовать в случае недоступности других источников.

antifilter - https://antifilter.download. Этот источник для устройств, которым не хватает оперативной памяти для полных списков блокировок. Доступен только вариант ip - оптимизированный список IP адресов (все адреса приведены к маске /24). Очень компактен в размере, но покрывает большое количество лишних IP адресов в диапазонах. Ссылку на файл блэклиста из этого источника можно добавить в список удалённых записей пользователя и получать IP адреса напрямую без установки парсера. Файл имеет простой формат совместимый с форматом файла записей пользователя. Добавление суммированного списка IP в user_entries_remote:

uci set ruantiblock.config.add_user_entries="1"
uci add_list ruantiblock.config.user_entries_remote="https://antifilter.download/list/ipsum.lst"
uci set ruantiblock.config.bllist_preset=""
uci set ruantiblock.config.bllist_module=""
uci commit ruantiblock
/usr/bin/ruantiblock update

Модули-парсеры:

Установка модуля необходима для самостоятельного формирования списка блокировок силами роутера. Модуль выкачивает данные из источника, выполняет их преобразование (включая оптимизации) в необходимый для работы формат. Модуль требуется для всех источников блэклиста (zapret-info, rublacklist, antifilter), кроме ruantiblock, который предоставляет уже готовые и оптимизированные конфиги.

/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.

  • Проксификация трафика локальных клиентов (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'
  • 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"
  • Запись событий в syslog (ENABLE_LOGGING=1):

Опция включает запись событий в системный лог. Отключить:

uci set ruantiblock.config.enable_logging="0"
  • Включение режима полного прокси (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