Skip to content
This repository has been archived by the owner on Jan 2, 2023. It is now read-only.
gSpotx2f edited this page May 12, 2020 · 15 revisions

Описание

ruantiblock - решение позволяющее использовать выборочную проксификацию (посредством tor либо VPN-соединения) для доступа к заблокированным ресурсам из блэклиста с сайтов http://antizapret.info, http://rublacklist.net и zapret-info, или из списка созданного пользователем. При этом доступ к остальным ресурсам осуществляется напрямую. Включает в себя, помимо текстового парсера, функции управления правилами iptables и списками ipset. Можно включать и отключать в любой момент, не нуждается в перезагрузке роутера при обновлении блэклиста (принудительно перезапускает dnsmasq). Может работать как с tor, так и с VPN конфигурацией. При использовании VPN и awk-модуля не требует дополнительных пакетов и может быть установлено во внутреннюю память роутера.

Решение создавалось для домашнего роутера с прошивкой от Padavan'а (https://bitbucket.org/padavan/), хотя ни что не мешает использовать и в других Linux, при изменении некоторых настроек конфигурации...

Версия для OpenWrt здесь: https://github.com/gSpotx2f/ruantiblock_openwrt.

Установка

Установка в /opt с использованием Entware. Tor конфигурация

Установка в /opt с использованием Entware. VPN конфигурация

Установка во внутреннюю память без использования Entware. VPN конфигурация

Установка с использованием собственного списка блокировок (без загрузки и обработки блэклистов с antizapret.info и rublacklist.net)

Режимы обновления блэклиста и парсеры

Обновление блэклиста может выполняться в 3-х режимах:

  1. Режим ip - в этом режиме модули загружают из блэклиста все ip-адреса и диапазоны CIDR, которые содержатся в записях, и они сразу помещаются в соответствующие ipset'ы. Это жесткий вариант блокировки, когда провайдер просто дропает пакеты на все ip-адреса из реестра, и заблокированными оказываются множество доменов висящих на одном ip.

  2. Режим fqdn - в этом режиме из блэклиста извлекаются только записи, находящиеся в полях FQDN. Также в этих записях встречается некоторое кол-во ip адресов (сайты с ip-адресом вместо домена, типа: http://192.168.0.1, в блэклист попадают как домен 192.168.0.1). FQDN записи заносятся в конфиг dnsmasq и, далее, dnsmasq формирует временный список ipset по мере обращения к этим доменам - записи добавляются и удаляются динамически на основе DNS-запросов и таймаута. Этот вариант работает с провайдерами выполняющими блокировку по FQDN или URL.

  3. Режим hybrid - этот режим работает так же как и fqdn, но из записей блэклиста в которых отсутствует доменное имя, в ipset'ы добавляются ip-адреса и CIDR диапазоны. Т.е. домены обрабатывает dnsmasq, а CIDR-подсети и ip-адреса без доменов помещаются сразу в ipset. Это режим по умолчанию.

Режим работы модулей определяет переменная BLOCK_MODE (ip, fqdn, hybrid) в конфиге /opt/etc/ruantiblock/ruantiblock.conf.

Изначально скрипт работает в tor-конфигурации (PROXY_MODE=1) и использует lua-модуль (ruab_parser.lua). Shell-модули (awk) предназначены для тех случаев, когда нет возможности использовать lua (например, при установке ruantiblock во внутреннюю память роутера).

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

ruab_parser.lua - универсальный модуль, работает с antizapret.info, rublacklist.net и zapret-info. Это стандартный модуль, работает быстро, но требует установки lua из Entware.

ruab_parser.sh - универсальный модуль, работает с antizapret.info, rublacklist.net и zapret-info. Написан на awk, не требует зависимостей и даже наличия Entware на роутере. Работает значительно медленнее предыдущего парсера если используется awk из прошивки роутера (/usr/bin/awk). Однако, при использовании awk из Entware (/opt/bin/awk) скорость работы значительно возрастает.

Используемый модуль определяется в конфиге /opt/etc/ruantiblock/ruantiblock.conf в переменной BLLIST_MODULE_CMD. Перменная BL_UPDATE_MODE определяет источник блэклиста: antizapret - antizapret.info, rublacklist - rublacklist.net, zapret-info - https://raw.githubusercontent.com/zapret-info/z-i/master/dump.csv.

Дополнительные настройки (в конфигурационном файле /opt/etc/ruantiblock/ruantiblock.conf)

Конфигурационный файл /opt/etc/ruantiblock/ruantiblock.conf содержит некоторые переменные настроек, которые переопределяют аналогичные переменные в выполняемых скриптах. При отсутствии /opt/etc/ruantiblock/ruantiblock.conf значения переменных берутся непосредственно из определений в самих скриптах, но конфиг является приоритетным.

  • Проксификация трафика локальных клиентов (PROXY_LOCAL_CLIENTS=1):

Эта опция включает обработку трафика локальных приложений роутера в ruantiblock. Т.е. различные сетевые утилиты установленные на самом роутере, также, ходят на заблокированные сайты через tor или VPN. Можно отключить если нет необходимости: PROXY_LOCAL_CLIENTS=0.

  • Html-страница с информацией о статусе (HTML_INFO=1):

Каждый раз при обновлении данных или статуса создаётся html-страница http://my.router/custom/ruantiblock.html, которая доступна на встроенном веб-сервере прошивки. Отключить: HTML_INFO=0

  • Запись событий в syslog (USE_LOGGER=1):

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

  • Полная проксификация всего трафика, без фильтрации блэклиста:

При активном ruantiblock можно включить режим полного прокси выполнив в консоли: /opt/usr/bin/ruantiblock.sh total-proxy-on. В этом режиме весь трафик заворачивается в tor или VPN, без применения правил блэклиста. Также можно отключить в любой момент: /opt/usr/bin/ruantiblock.sh total-proxy-off. Этот режим доступен только при отключенной проксификации локальных клиентов (PROXY_LOCAL_CLIENTS=0). Переменная DEF_TOTAL_PROXY=1 включает режим полного прокси сразу при старте ruantiblock.

  • Разрешение DNS-имен через альтернативный DNS-сервер (ALT_NSLOOKUP=1):

Если Ваш провайдер не блокирует сторонние DNS-серверы и не изменяет DNS-трафик, то можно использовать вместо провайдерского DNS-сервера, к примеру, 8.8.8.8 (выставить в веб-интерфейсе роутера на странице WAN -> Получать адреса DNS-серверов автоматически? в 0 и WAN -> DNS-сервер 1: в 8.8.8.8) и отключить разрешение DNS-имен через альтернативный DNS-сервер, что значительно уменьшает размер итогового конфига dnsmasq (к тому же, он перестанет загаживать лог своим выводом после перезапуска). Переменная ALT_NSLOOKUP=0.

Если же провайдер блокирует сторонние DNS-серверы, то лучший вариант - использовать dnscrypt-proxy (GitHub) на роутере (есть в Entware). В этом случае разрешение имён также может осуществляться либо полностью через dnscrypt-proxy (ALT_NSLOOKUP=0), либо только для заблокированных доменов (ALT_DNS_ADDR="127.0.0.1#<порт dnscrypt-proxy>", ALT_NSLOOKUP=1), при соответствующих настройках самого dnscrypt-proxy.

Также и tor имеет свой собственный резолвер, который вполне можно использовать (ALT_DNS_ADDR="127.0.0.1#9053", ALT_NSLOOKUP=1).

  • Альтернативный DNS-сервер (ALT_DNS_ADDR="8.8.8.8"):

Альтернативный DNS-сервер для предыдущего пункта. Если ALT_NSLOOKUP=1, то для каждого домена в конфиге dnsmasq добавляется дополнительная запись, указывающая использовать данный DNS-сервер для этого домена. (Можно указывать с портом: ALT_DNS_ADDR = "8.8.8.8#53")

  • Преобразование кириллических доменов в punycode (USE_IDN=0):

Преобразование выполняется внешней утилитой idn. В lua-модуле (ruab_parser.lua) можно использовать библиотеку lua-idn (если доступна). idn немного увеличивает время работы парсера. Вообще, во всём списке блокировок кириллических доменов ничтожно мало (около 200). Без конвертирования в punycode они просто не проходят через регулярные выражения и отбрасываются парсером... Включить: USE_IDN=1.

  • Преобразование кодировки блэклиста (USE_ICONV=0):

Опция необходима для источника zapret-info, поскольку файл имеет кодировку CP1251. Конвертирование кодировок выполняется внешней утилитой iconv. Для lua-модуля (ruab_parser.lua) можно использовать библиотеку lua-iconv (если доступна). Эта опция имеет смысл (и используется) при USE_IDN=1, т.е. для конвертирования только кириллических доменов перед преобразованием в punycode. Включить: USE_ICONV=1.

  • Фильтрация записей блэклиста по шаблонам (ENTRIES_FILTER, ENTRIES_FILTER_FILE, ENTRIES_FILTER_PATTERNS):

Переменные определяют параметры функции предварительной фильтрации записей блэклиста. Подробнее здесь...

  • Лимиты субдоменов и ip-адресов для оптимизации записей в итоговых конфигах ipset и dnsmasq (SD_LIMIT, IP_LIMIT, OPT_EXCLUDE_SLD, OPT_EXCLUDE_NETS):

Подробнее здесь...

Есть и другие параметры для более тонкой настройки, часть из них имеют пояснения в самом конфигурационном файле.

Поиск записей в конфигах dnsmasq и ipset

Скрипт ruab_search.sh предназначен для поиска записей в конфигурационных файлах dnsmasq и ipset. С его помощью можно выяснить находится ли домен или ip-адрес в правилах ruantiblock.

1. Скачивание в /opt/usr/bin:

wget --no-check-certificate -O /opt/usr/bin/ruab_search.sh https://raw.githubusercontent.com/gSpotx2f/ruantiblock/master/opt/usr/bin/ruab_search.sh
chmod +x /opt/usr/bin/ruab_search.sh

2. Использование:

Вывод любых совпадений с шаблоном:

/opt/usr/bin/ruab_search.sh "thepiratebay.org"
/opt/usr/bin/ruab_search.sh "abc"

Можно использовать регулярные выражения:

/opt/usr/bin/ruab_search.sh "^torrent"
/opt/usr/bin/ruab_search.sh "^195[.]154[.]"
/opt/usr/bin/ruab_search.sh "/21$"

Пользовательские записи в блэклисте

Можно добавлять собственные записи к списку блокировок (не заблокированные сайты на которые необходимо всегда ходить через прокси). Эта функция включается переменной ADD_USER_ENTRIES=1 в конфиге /opt/etc/ruantiblock/ruantiblock.conf. Нужно создать текстовый файл с записями (ip, CIDR или FQDN, одна на строку) /opt/etc/ruantiblock/ruab_user_entries, либо при установке во внутреннюю память: /etc/storage/ruantiblock/ruab_user_entries (также необходимо изменить переменную USER_ENTRIES_FILE="/etc/storage/ruantiblock/ruab_user_entries" в ruantiblock.sh, чтобы сохранить этот файл в storage). В записях FQDN можно задать DNS-сервер для разрешения данного домена (через пробел). Также можно комментировать строки (# - первый символ строки).

Пример файла ruab_user_entries:

# FQDN
domain.net
# FQDN с DNS-сервером
sub.domain.com 8.8.8.8
# FQDN с DNS-сервером и портом. #53 - не комментарий, а порт
sub.domain.com 8.8.8.8#53
# ip
74.125.131.19
# CIDR
74.125.0.0/16

Параметры запуска:

ruantiblock.sh start           # Включение ruantiblock. Создаются списки ipset, правила iptables и пр.
ruantiblock.sh stop            # Выключение ruantiblock. Очищаются все списки ipset, удаляются правила iptables. Трафик идет стандартным способом, tor или VPN не используется
ruantiblock.sh destroy         # То же, что и stop + удаление всех списков ipset и очистка файлов ruantiblock.dnsmasq и ruantiblock.ip
ruantiblock.sh restart         # Рестарт
ruantiblock.sh update          # Обновление блэклиста и списков ipset
ruantiblock.sh force-update    # Принудительное обновление блэклиста (может потребоваться в случае если предыдущее обновление выполнено некорректно или было прервано в процессе выполнения)
ruantiblock.sh data-files      # Создание файлов ruantiblock.dnsmasq и ruantiblock.ip, без обновления сетевой конфигурации
ruantiblock.sh total-proxy-on  # Включение режима полного прокси. Весь трафик всегда идёт через прокси (tor или VPN), списки блокировок не используются для фильтрации (работает при включенном ruantiblock)
ruantiblock.sh total-proxy-off # Выключение режима полного прокси (работает при включенном ruantiblock)
ruantiblock.sh status          # Вывод текущего статуса, а также общей инфо (кол-во записей в списках ipset, дату последнего обновления и пр.)
ruantiblock.sh html-info       # Обновление html-страницы статуса

Инфо можно увидеть по URL: http://my.router/custom/ruantiblock.html, либо в консоли: /opt/usr/bin/ruantiblock.sh status или /etc/storage/ruantiblock.sh status, в зависимости от установки.

Перед изменением конфигурации ruantiblock.sh необходимо обязательно выполнить удаление всех сетов и правил iptables:

/opt/usr/bin/ruantiblock.sh destroy

после изменения настроек выполнить обновление:

/opt/usr/bin/ruantiblock.sh start
/opt/usr/bin/ruantiblock.sh update

Или при установке во внутреннюю память:

/etc/storage/ruantiblock.sh destroy

и

/etc/storage/ruantiblock.sh start
/etc/storage/ruantiblock.sh update

Отключение автостарта (запуска при старте роутера)

Если установка выполнена в /opt, то стартовый скрипт находится в /opt/etc/init.d/S40ruantiblock. Для отключения ruantiblock выполните в консоли:

/opt/usr/bin/ruantiblock.sh destroy
mv /opt/etc/init.d/S40ruantiblock /opt/etc/init.d/K40ruantiblock

Если установка выполнена во внутреннюю память, то запуск выполняется из /etc/storage/started_script.sh. Для отключения ruantiblock выполните в консоли:

/etc/storage/ruantiblock.sh destroy

В веб-интерфейсе роутера на странице Персонализация -> Скрипты в поле Выполнить после полного запуска маршрутизатора: (или в /etc/storage/started_script.sh) удалите следующие строки:

/etc/storage/ruantiblock.sh start
/etc/storage/ruantiblock.sh update

Источники

Основная идея взята из статьи: https://habrahabr.ru/post/270657. Всё, что относится к VPN, отсюда: https://github.com/DontBeAPadavan/rublock-via-vpn.

Clone this wiki locally