-
Notifications
You must be signed in to change notification settings - Fork 5
Home
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 конфигурация
Обновление блэклиста может выполняться в 3-х режимах:
-
Режим ip - в этом режиме модули загружают из блэклиста все ip-адреса и диапазоны CIDR, которые содержатся в записях, и они сразу помещаются в соответствующие ipset'ы. Это жесткий вариант блокировки, когда провайдер просто дропает пакеты на все ip-адреса из реестра, и заблокированными оказываются множество доменов висящих на одном ip.
-
Режим fqdn - в этом режиме из блэклиста извлекаются только записи, находящиеся в полях FQDN. Также в этих записях встречается некоторое кол-во ip адресов (сайты с ip-адресом вместо домена, типа: http://192.168.0.1, в блэклист попадают как домен 192.168.0.1). FQDN записи заносятся в конфиг dnsmasq и, далее, dnsmasq формирует временный список ipset по мере обращения к этим доменам - записи добавляются и удаляются динамически на основе DNS-запросов и таймаута. Этот вариант работает с провайдерами выполняющими блокировку по FQDN или URL.
-
Режим 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
значения переменных берутся непосредственно из определений в самих скриптах, но конфиг является приоритетным.
- Проксификация трафика локальных клиентов (
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
):
Есть и другие параметры для более тонкой настройки, часть из них имеют пояснения в самом конфигурационном файле.
Скрипт 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.