Выборочный обход блокировок на маршрутизаторах с прошивкой Padavan и Keenetic OS

Инструкций с разными вариантами обхода блокировок Интернет-ресурсов опубликовано огромное количество. Но тема не теряет актуальности. Даже всё чаще звучат инициативы на законодательном уровне заблокировать статьи о методах обхода блокировок. И появились слухи, что Роскомнадзор получит ещё одну пачку денег налогоплательщиков на «более лучшие» блокировки. Опытные пользователи ничего нового и полезного из статьи не узнают. А вот другие получат готовые пошаговые инструкции для простого и эффективного выборочного обхода блокировок на популярных маршрутизаторах с прошивкой Padavan и Keenetic.

iskbtdxuaisqiyg3r4tsrjhj6aw.jpeg


Я около двух лет использовал вариант обхода блокировок от Zolg. На нём основываются многие инструкций в сети. Моя в том числе.

Всё было хорошо, но «лучшее всегда враг хорошего». Во-первых, некоторые новые программы стали слишком «умными» и резолвят домены собственными методами, минуя DNS-сервер маршрутизатора. Это не позволяет dnsmasq на маршрутизаторе добавить адрес во множество ipset для разблокировки и приводит к закономерному результату — ресурс остаётся заблокированным. В Android 9 вообще появилась штатная поддержка DNS-over-TLS, т.е. этот метод обхода блокировки перестаёт работать (если другое устройство ранее не обращалось к dnsmasq). Во-вторых, обновление всего списка доменов из antizapret приводит к непредсказуемым результатам каждый раз. В список могут попасть домены, которые в реальности не заблокированы, и работа которых важна через основной канал. Нужно постоянно быть начеку и руками править сгенерированные файлы. В-третьих, надоело «таскать за собой» огромный список доменов с десятком тысяч казино и подобные, которые просто не нужны. Со временем я понял, что мне нужен лишь небольшой конкретный список заблокированных ресурсов.

Так что я год уже использую немного изменённый метод разблокировки, которым полностью удовлетворён:

  • Простота и лёгкость управления (после настройки).
  • Полный контроль над тем, какие ресурсы нужно разблокировать.
  • Минимальные требования к ресурсам процессора и ОЗУ маршрутизатора.
  • Широкий охват нюансов при обходе блокировок.

Важно отметить, что мой вариант не предназначен для случая, когда вам нужно разблокировать сотни и тысячи доменов. Потому что при старте маршрутизатора происходит резолвинг каждого домена из заданного списка. Чем больше доменов в списке, тем дольше будет происходить инициализация множества ipset для разблокировки.

Основа обхода блокировок та же — сеть Tor. Её использование обусловлено двумя простыми факторами— бесплатность, и вероятность того, что Tor будет заблокирован в России, близка к нолю, в отличие от любого VPN-сервиса. Tor является фундаментом наркотрафика в России от среднего звена до самых низов. Блокировка Tor приведёт к поиску новых инструментов для рынка и снижению уровню анонимности, что повлечёт за собой успешную активизацию работы локальных правоохранительных органов. В конечном итоге это, как вирус, начнёт негативно влиять на верхнее звено. Учитывая последние удивительные новости о связях высших должностных лиц государства с глобальным наркотрафиком в Россию, блокировка Tor в России — это просто табу, хоть она и тривиальная. Ни Роскомнадзор, какие бы миллиарды не выделялись этому ведомству, ни один суд в России не имеют разрешения «сверху» для блокировки Tor. И это уже даже никого не удивляет и не пугает, хоть Россия просто утопает в наркотиках (любой школьник знает, что такое «дакнет», и через 30 минут имеет фактическую возможность в любом городе с населением от 10 тыс. человек беспрепятственно получить любые наркотики практически в любых количествах — такая злая правда жизни). При текущем режиме вероятность блокировки сети Tor ниже, чем вероятность блокировки сайта музея Эрмитаж.

Приведённую инструкцию легко адаптировать для маршрутизаторов с OpenWrt. Также, небольшими изменениям легко заменить Tor на OpenVPN.


Всё очень просто. У вас есть файл /opt/etc/unblock.txt — простой список для разблокировки. Вы можете разблокировать домен, IP-адрес или CIDR. Одна строка — один элемент. Допускаются пустые строки, и можно использовать символ # в начале строки для игнорирования.

Вот пример моего личного файла
###Торрент-трекеры
rutracker.org
rutor.info
rutor.is
mega-tor.org
kinozal.tv
nnm-club.me
nnm-club.ws
tfile.me
tfile-home.org
tfile1.cc
megapeer.org
megapeer.ru
tapochek.net
tparser.org

#Каталоги медиаконтента для программ
hdrezka.ag
hdrezka.me
filmix.co
filmix.cc

###Книги
lib.rus.ec
flibusta.is

###Телеграм
telegram.org
web.telegram.org
desktop.telegram.org
tdesktop.com
updates.tdesktop.com
venus.web.telegram.org
flora.web.telegram.org
vesta.web.telegram.org
pluto.web.telegram.org
aurora.web.telegram.org

###Разное
edem.tv
crimerussia.com
4pna.com
2019.vote

###Проверка Tor
check.torproject.org

###Пример разблокировки по IP (убрать # в начале строки)
#195.82.146.214

###Пример разблокировки по CIDR (убрать # в начале строки)
#103.21.244.0/22


После редактирования этого файла вы просто выполняете команду для применения новой конфигурации:

unblock_update.sh


Все ресурсы из unblock.txt разблокируются без необходимости перезагружать маршрутизатор.

  • При инициализации маршрутизатора создаётся пустое множество IP-адресов ipset с именем unblock.
  • В брандмауэр добавляется правило перенаправления всех пакетов с адресатами из unblock в сервис Tor.
  • Запускается сервис Tor в режиме прозрачного прокси.
  • Запускается специальный скрипт unblock_ipset.sh, который резолвит все домены из unblock.txt и добавляет их IP-адреса в множество unblock. IP-адреса и CIDR из этого файла тоже добавляются в unblock.
  • Запускается dnsmasq с дополнительным конфигурационным файлом unblock.dnsmasq, в котором указано добавление IP-адресов доменов из unblock.txt в множество unblock при резолвинге.
  • cron с определенной периодичностью запускает unblock_ipset.sh, чтобы частично компенсировать возможные случаи с нюансами.
  • При необходимости все домены из unblock.txt (и только они) резолвятся через dnscrypt-proxy, если провайдер фильтрует DNS.


У вас должен быть маршрутизатор с установленной прошивкой Padavan и уже настроенным менеджером пакетов Entware. В Windows для подключения подключения к маршрутизатору по SSH вы можете использовать клиент PuTTY.

Для тестов я использовал популярный Xiaomi Mi Router 3G (Entware установлен во внутреннюю память) с самой свежей прошивкой — 32a93db. Всё будет работать даже на легендарном малыше WT3020 AD/F/H за 10$.

thkf2kvtt2rhtnbxvmx0qri7dsk.jpeg

1. Установка необходимого ПО на маршрутизаторе.

opkg update
opkg install mc tor tor-geoip bind-dig cron


mc — файловый менеджер Midnight Commander. Он нужен лишь из-за удобного редактора mcedit. Если вы привыкли пользоваться другим текстовым редактором, то mc можно не устанавливать.
tor — сервис Tor.
tor-geoip — база гео-IP для Tor.
bind-dig — DNS-клиент (аналог nslookup и host).
cron — планировщик заданий.

2. Инициализация ipset, создание множества IP-адресов unblock (start_script.sh).


Подключите необходимые модули и создайте пустое множество адресов с именем unblock при загрузке маршрутизатора. Для этого откройте в редакторе файл /etc/storage/start_script.sh:

mcedit /etc/storage/start_script.sh


Добавьте в конце:

modprobe ip_set
modprobe ip_set_hash_ip
modprobe ip_set_hash_net
modprobe ip_set_bitmap_ip
modprobe ip_set_list_set
modprobe xt_set

ipset create unblock hash:net


Чтобы вставить из буфера, используйте Shift+Insert, сохранить — F2, выйти — F10.

trzpcqqnadbonhsb0x3ebe7ltpo.png

При желании вы можете отредактировать файл start_script.sh через веб-интерфейс маршрутизатора — «Дополнительно» > «Персонализация» > «Скрипты» > «Выполнить перед инициализацией маршрутизатора». После редактирования нажмите «Применить».

yraa8qgcfwu-vesrp3wvvne2vui.png

3. Настройка Tor.


Удалите содержимое конфигурационного файла Tor:

cat /dev/null > /opt/etc/tor/torrc


Откройте файл конфигурации Tor:

mcedit /opt/etc/tor/torrc


Вставьте (Shift+Insert) содержимое:

User admin
PidFile /opt/var/run/tor.pid
ExcludeExitNodes {RU},{UA},{AM},{KG},{BY}
StrictNodes 1
TransPort 192.168.0.1:9141
ExitRelay 0
ExitPolicy reject *:*
ExitPolicy reject6 *:*
GeoIPFile /opt/share/tor/geoip
GeoIPv6File /opt/share/tor/geoip6
DataDirectory /opt/var/lib/tor


Замените при необходимости 192.168.0.1 на внутренний адрес вашего маршрутизатора (LAN). Краткое описание конфигурации:

  • Исключить выходные узлы: Россия, Украина, Армения Киргизия, Беларусь.
  • Повесить «прозрачный» прокси на адрес 192.168.0.1, порт 9141.
  • Запретить быть точкой выхода.

4. Список доменов (и не только) для обхода блокировки (unblock.txt).


unblock.txt — простой список для разблокировки. Вы можете разблокировать домен, IP-адрес или CIDR. Одна строка — один элемент. Пустые строки (в том числе с пробелами и табуляциями) игнорируются. Можно использовать символ # в начале строки для игнорирования.

Создайте файл /opt/etc/unblock.txt:

mcedit /opt/etc/unblock.txt


Каждая строка может содержать доменное имя, IP-адрес или CIDR. Можно использовать символ # для комментирования строк.

Вот пример моего личного файла
###Торрент-трекеры
rutracker.org
rutor.info
rutor.is
mega-tor.org
kinozal.tv
nnm-club.me
nnm-club.ws
tfile.me
tfile-home.org
tfile1.cc
megapeer.org
megapeer.ru
tapochek.net
tparser.org

#Каталоги медиаконтента для программ
hdrezka.ag
hdrezka.me
filmix.co
filmix.cc

###Книги
lib.rus.ec
flibusta.is

###Телеграм
telegram.org
web.telegram.org
desktop.telegram.org
tdesktop.com
updates.tdesktop.com
venus.web.telegram.org
flora.web.telegram.org
vesta.web.telegram.org
pluto.web.telegram.org
aurora.web.telegram.org

###Разное
edem.tv
crimerussia.com
4pna.com
2019.vote

###Проверка Tor
check.torproject.org

###Пример разблокировки по IP (убрать # в начале строки)
#195.82.146.214

###Пример разблокировки по CIDR (убрать # в начале строки)
#103.21.244.0/22


5. Скрипт для заполнения множества unblock IP-адресами заданного списка доменов (unblock_ipset.sh).


Создайте скрипт /opt/bin/unblock_ipset.sh:

mcedit /opt/bin/unblock_ipset.sh


Вставьте (Shift+Insert) содержимое:

#!/bin/sh

until ADDRS=$(dig +short google.com @localhost) && [ -n "$ADDRS" ] > /dev/null 2>&1; do sleep 5; done

while read line || [ -n "$line" ]; do

  [ -z "$line" ] && continue
  [ "${line:0:1}" = "#" ] && continue

  echo $line | grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/[0-9]{1,2}' | awk '{system("ipset -exist add unblock "$1)}'
  dig +short $line @localhost | grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | awk '{system("ipset -exist add unblock "$1)}'

done < /opt/etc/unblock.txt


Дайте права на исполнение:

chmod +x /opt/bin/unblock_ipset.sh


Скрипт достаточно простой. Ждём, когда заработает резолвинг домена google.com (если этого не сделать, то при загрузке маршрутизатора не будет заполнено множество unblock, т.к. маршрутизатор будет находиться ещё в процессе инициализации). Читаем строки в файле unblock.txt. У прочитанных строк автоматически удалены пробелы и табуляция в начале и в конце. Пропускаем пустые строки. Пропускаем строки, которые начинают на символ #. Ищем в строке CIDR. Если CIDR найден, то добавляем его в unblock. Резолвим строку через dig. Все IP-адреса результата добавляем в unblock.

Если строка является CIDR (мы её уже внесли в unblock), то dig выдаст нулевой результат.
Если строка является IP-адресом, то dig выдаст этот же IP-адрес, и мы его добавим в unblock.

6. Скрипт для формирования дополнительного конфигурационного файла dnsmasq из заданного списка доменов (unblock_dnsmasq.sh).


Создайте скрипт /opt/bin/unblock_dnsmasq.sh:

mcedit /opt/bin/unblock_dnsmasq.sh


Вставьте (Shift+Insert) содержимое:

#!/bin/sh

cat /dev/null > /opt/etc/unblock.dnsmasq

while read line || [ -n "$line" ]; do

  [ -z "$line" ] && continue
  [ "${line:0:1}" = "#" ] && continue

  echo $line | grep -Eq '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' && continue

  echo "ipset=/$line/unblock" >> /opt/etc/unblock.dnsmasq

done < /opt/etc/unblock.txt


Дайте права на исполнение:

chmod +x /opt/bin/unblock_dnsmasq.sh


Скрипт достаточно простой. Последовательно читаем строки из /opt/etc/unblock.txt. У прочитанных строк автоматически удалены пробелы и табуляция в начале и в конце. Пропускаем пустые строки. Пропускаем строки, которые начинают на #. Пропускаем строки, которые содержат IP-адрес (IP или CIDR), т.е. нас интересуют только строки с именами доменов. В файл /opt/etc/unblock.dnsmasq вносим строки вида «ipset=/доменное_имя/unblock». Это означает, что после определения IP-адресов конкретного домена они будут автоматически добавлены во множество unblock.

Обязательно запустите скрипт для генерация файла unblock.dnsmasq:

unblock_dnsmasq.sh


Проверьте, что файл unblock.dnsmasq создался:

cat /opt/etc/unblock.dnsmasq


7. Скрипт ручного принудительного обновления системы после редактирования списка доменов (unblock_update.sh).


Создайте скрипт /opt/bin/unblock_update.sh:

mcedit /opt/bin/unblock_update.sh


Вставьте (Shift+Insert) содержимое:

#!/bin/sh

ipset flush unblock

/opt/bin/unblock_ipset.sh
/opt/bin/unblock_dnsmasq.sh
restart_dhcpd


Дайте права на исполнение:

chmod +x /opt/bin/unblock_update.sh


8. Скрипт автоматического заполнения множества unblock при загрузке маршрутизатора (S99unblock).


Создайте скрипт /opt/etc/init.d/S99unblock:

mcedit /opt/etc/init.d/S99unblock


Вставьте (Shift+Insert) содержимое:

#!/bin/sh

[ "$1" != "start" ] && exit 0

/opt/bin/unblock_ipset.sh &


Дайте права на исполнение:

chmod +x /opt/etc/init.d/S99unblock


9. Перенаправление пакетов с адресатами из unblock в Tor (post_iptables_script.sh).


Откройте в редакторе файл /etc/storage/post_iptables_script.sh:

mcedit /etc/storage/post_iptables_script.sh


Добавьте в конце:

iptables -t nat -A PREROUTING -i br0 -p tcp -m set --match-set unblock dst -j REDIRECT --to-port 9141


afu2dld3v0nrhtjwfekvo6i-wsi.png

При желании вы можете отредактировать файл post_iptables_script.sh через веб-интерфейс маршрутизатора — «Дополнительно» > «Персонализация» > «Скрипты» > «Выполнить после перезапуска правил брандмауэра». После редактирования нажмите «Применить».

pvbeotspo0xhzrukgp3dgvu5aws.png

В этот же файл вы можете добавить (это необязательно) перенаправление всех запросов на внешний порт 53 на себя. Это нужно, чтобы клиенты в локальной сети не использовали сторонние DNS-сервисы. Запросы будут идти через штатный DNS-сервер.

iptables -t nat -I PREROUTING -i br0 -p udp --dport 53 -j DNAT --to 192.168.0.1
iptables -t nat -I PREROUTING -i br0 -p tcp --dport 53 -j DNAT --to 192.168.0.1


Замените при необходимости 192.168.0.1 на внутренний адрес вашего маршрутизатора (LAN).

10. Подключение дополнительного конфигурационного файла к dnsmasq.


Нам необходимо подключить созданный файл unblock.dnsmasq к dnsmasq. Для этого откройте в редакторе файл /etc/storage/dnsmasq/dnsmasq.conf:

mcedit /etc/storage/dnsmasq/dnsmasq.conf


Добавьте в конце:

conf-file=/opt/etc/unblock.dnsmasq


Если хотите (это необязательно), можете добавить дополнительный сервер для резолвинга и надёжности:

server=8.8.8.8


При желании вы можете отредактировать файл dnsmasq.conf через веб-интерфейс маршрутизатора — «Дополнительно» > «LAN» > «DHCP-сервер» > «Пользовательский файл конфигурации dnsmasq.conf». После редактирования нажмите «Применить».

x0ar4cm6v9pgsluqabh74qck-s0.png

11. Добавление задачи в cron для периодического обновления содержимого множества unblock.


Это дополнительная страховка на тот случай, если программы/устройства используют свой собственный метод резолвинга, а IP-адрес домена изменился. Всё, что нужно сделать, это с желаемой периодичностью запускать скрипт unblock_ipset.sh. Для примера будем запускать каждый день в 6 утра.

Замените в файле конфигурации cron имя root на admin:

sed -i 's/root/admin/g' /opt/etc/crontab


Откройте в редакторе файл /opt/etc/crontab:

mcedit /opt/etc/crontab


Добавьте в конце:

00 06 * * * admin /opt/bin/unblock_ipset.sh


При желании вы можете закомментировать все остальные шаблонные задачи. Вот, как будет выглядеть ваш файл crontab:

hflbfcv04lpvzlrjmehoc3l51ts.png

12. Перезагрузка маршрутизатора.


Выполните команду:

reboot


После перезагрузки откройте в браузере сайт check.torproject.org (он должен быть добавлен в unblock.txt). Если вы всё сделали верно, то вы увидите:

wa19dzxbu8qtldwrvkeijfqna7q.png


У вас должен быть маршрутизатор Keenetic/Zyxel с уже настроенным менеджером пакетов Entware (OPKG). Например, вот список некоторых маршрутизаторов, которые поддерживают Entware: Keenetic II, Keenetic III, Extra, Extra II, Giga II, Giga III, Omni, Omni II, Viva, Ultra, Ultra II, Omni (KN-1410), Extra (KN-1710), Giga (KN-1010), Ultra (KN-1810), Viva (KN-1910), DSL (KN-2010), Duo (KN-2110). Инструкцию по настройке Entware можно посмотреть тут (до 10 пункта).

Обязательно включите «Модули ядра подсистемы Netfilter» — Общие настройки > Изменить набор компонентов.

vvdhhirhcktuefrgbxh3fkx5i0i.png

Для тестов я использовал Keenetic Ultra (KN-1810) с самой свежей прошивкой — 2.14.C.0.0–4.

Важное замечание. Вам придётся отключить штатный DNS-сервер в системе, мы будем использовать dnsmasq вместо него. Вы потеряете возможность назначать DNS-сервисы (Яндекс.DNS/SkyDNS/AdGuard DNS) индивидуально для клиентов, но без проблем сможете использовать их глобально через настройки dnsmasq при необходимости.

1. Установка необходимого ПО на маршрутизаторе.

opkg update
opkg install mc tor tor-geoip bind-dig cron dnsmasq-full ipset iptables


mc — файловый менеджер Midnight Commander. Он нужен лишь из-за удобного редактора mcedit. Если вы привыкли пользоваться другим текстовым редактором, то mc можно не устанавливать.
tor — сервис Tor.
tor-geoip — база гео-IP для Tor.
bind-dig — DNS-клиент (аналог nslookup и host).
cron — планировщик заданий.
dnsmasq-full — DNS-сервер.
ipset и iptables — консольные утилиты ipset и iptables (возможно, они уже есть в системе и не нужны, я добавил их для подстраховки).

2. Инициализация ipset, создание множества IP-адресов unblock (100-ipset.sh).


Создайте пустое множество адресов с именем unblock при загрузке маршрутизатора. Для этого создайте файл /opt/etc/ndm/fs.d/100-ipset.sh:

mcedit /opt/etc/ndm/fs.d/100-ipset.sh


Вставьте (Shift+Insert) содержимое:

#!/bin/sh

[ "$1" != "start" ] && exit 0

ipset create unblock hash:net

exit 0


Чтобы вставить из буфера, используйте Shift+Insert, сохранить — F2, выйти — F10.

Дайте права на исполнение:

chmod +x /opt/etc/ndm/fs.d/100-ipset.sh


3. Настройка Tor.


Удалите содержимое конфигурационного файла Tor:

cat /dev/null > /opt/etc/tor/torrc


Откройте файл конфигурации Tor:

mcedit /opt/etc/tor/torrc


Вставьте (Shift+Insert) содержимое:

User root
PidFile /opt/var/run/tor.pid
ExcludeExitNodes {RU},{UA},{AM},{KG},{BY}
StrictNodes 1
TransPort 192.168.0.1:9141
ExitRelay 0
ExitPolicy reject *:*
ExitPolicy reject6 *:*
GeoIPFile /opt/share/tor/geoip
GeoIPv6File /opt/share/tor/geoip6
DataDirectory /opt/var/lib/tor


Замените при необходимости 192.168.0.1 на внутренний адрес вашего маршрутизатора (LAN). Краткое описание конфигурации:

  • Исключить выходные узлы: Россия, Украина, Армения Киргизия, Беларусь.
  • Повесить «прозрачный» прокси на адрес 192.168.0.1, порт 9141.
  • Запретить быть точкой выхода.

4. Список доменов (и не только) для обхода блокировки (unblock.txt).


unblock.txt — простой список для разблокировки. Вы можете разблокировать домен, IP-адрес или CIDR. Одна строка — один элемент. Пустые строки (в том числе с пробелами и табуляциями) игнорируются. Можно использовать символ # в начале строки для игнорирования.

Создайте файл /opt/etc/unblock.txt:

mcedit /opt/etc/unblock.txt


Каждая строка может содержать доменное имя, IP-адрес или CIDR. Можно использовать символ # для комментирования строк.

Вот пример моего личного файла
###Торрент-трекеры
rutracker.org
rutor.info
rutor.is
mega-tor.org
kinozal.tv
nnm-club.me
nnm-club.ws
tfile.me
tfile-home.org
tfile1.cc
megapeer.org
megapeer.ru
tapochek.net
tparser.org

#Каталоги медиаконтента для программ
hdrezka.ag
hdrezka.me
filmix.co
filmix.cc

###Книги
lib.rus.ec
flibusta.is

###Телеграм
telegram.org
web.telegram.org
desktop.telegram.org
tdesktop.com
updates.tdesktop.com
venus.web.telegram.org
flora.web.telegram.org
vesta.web.telegram.org
pluto.web.telegram.org
aurora.web.telegram.org

###Разное
edem.tv
crimerussia.com
4pna.com
2019.vote

###Проверка Tor
check.torproject.org

###Пример разблокировки по IP (убрать # в начале строки)
#195.82.146.214

###Пример разблокировки по CIDR (убрать # в начале строки)
#103.21.244.0/22

5. Скрипт для заполнения множества unblock IP-адресами заданного списка доменов (unblock_ipset.sh).


Создайте скрипт /opt/bin/unblock_ipset.sh:

mcedit /opt/bin/unblock_ipset.sh


Вставьте (Shift+Insert) содержимое:

#!/bin/sh

until ADDRS=$(dig +short google.com @localhost) && [ -n "$ADDRS" ] > /dev/null 2>&1; do sleep 5; done

while read line || [ -n "$line" ]; do

  [ -z "$line" ] && continue
  [ "${line:0:1}" = "#" ] && continue

  echo $line | grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/[0-9]{1,2}' | awk '{system("ipset -exist add unblock "$1)}'
  dig +short $line @localhost | grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | awk '{system("ipset -exist add unblock "$1)}'

done < /opt/etc/unblock.txt


Дайте права на исполнение:

chmod +x /opt/bin/unblock_ipset.sh


Скрипт достаточно простой. Ждём, когда заработает резолвинг домена google.com (если этого не сделать, то при загрузке маршрутизатора не будет заполнено множество unblock, т.к. маршрутизатор будет находиться ещё в процессе инициализации). Читаем строки в файле unblock.txt. У прочитанных строк автоматически удалены пробелы и табуляция в начале и в конце. Пропускаем пустые строки. Пропускаем строки, которые начинают на символ #. Ищем в строке CIDR. Если CIDR найден, то добавляем его в unblock. Резолвим строку через dig. Все IP-адреса результата добавляем в unblock.

Если строка является CIDR (мы её уже внесли в unblock), то dig выдаст нулевой результат.
Если строка является IP-адресом, то dig выдаст этот же IP-адрес, и мы его добавим в unblock.

6. Скрипт для формирования дополнительного конфигурационного файла dnsmasq из заданного списка доменов (unblock_dnsmasq.sh).


Создайте скрипт /opt/bin/unblock_dnsmasq.sh:

mcedit /opt/bin/unblock_dnsmasq.sh


Вставьте (Shift+Insert) содержимое:

#!/bin/sh

cat /dev/null > /opt/etc/unblock.dnsmasq

while read line || [ -n "$line" ]; do

  [ -z "$line" ] && continue
  [ "${line:0:1}" = "#" ] && continue

  echo $line | grep -Eq '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' && continue

  echo "ipset=/$line/unblock" >> /opt/etc/unblock.dnsmasq

done < /opt/etc/unblock.txt


Дайте права на исполнение:

chmod +x /opt/bin/unblock_dnsmasq.sh


Скрипт достаточно простой. Последовательно читаем строки из /opt/etc/unblock.txt. У прочитанных строк автоматически удалены пробелы и табуляция в начале и в конце. Пропускаем пустые строки. Пропускаем строки, которые начинают на #. Пропускаем строки, которые содержат IP-адрес (IP или CIDR), т.е. нас интересуют только строки с именами доменов. В файл /opt/etc/unblock.dnsmasq вносим строки вида «ipset=/доменное_имя/unblock». Это означает, что после определения IP-адресов конкретного домена они будут автоматически добавлены во множество unblock.

Обязательно запустите скрипт для генерация файла unblock.dnsmasq:

unblock_dnsmasq.sh


Проверьте, что файл unblock.dnsmasq создался:

cat /opt/etc/unblock.dnsmasq


7. Скрипт ручного принудительного обновления системы после редактирования списка доменов (unblock_update.sh).


Создайте скрипт /opt/bin/unblock_update.sh:

mcedit /opt/bin/unblock_update.sh


Вставьте (Shift+Insert) содержимое:

#!/bin/sh

ipset flush unblock

/opt/bin/unblock_ipset.sh
/opt/bin/unblock_dnsmasq.sh
/opt/etc/init.d/S56dnsmasq restart


Дайте права на исполнение:

chmod +x /opt/bin/unblock_update.sh


8. Скрипт автоматического заполнения множества unblock при загрузке маршрутизатора (S99unblock).


Создайте скрипт /opt/etc/init.d/S99unblock:

mcedit /opt/etc/init.d/S99unblock


Вставьте (Shift+Insert) содержимое:

#!/bin/sh

[ "$1" != "start" ] && exit 0

/opt/bin/unblock_ipset.sh &


Дайте права на исполнение:

chmod +x /opt/etc/init.d/S99unblock


9. Перенаправление пакетов с адресатами из unblock в Tor (100-redirect.sh).


Для этого создайте файл /opt/etc/ndm/netfilter.d/100-redirect.sh:

mcedit /opt/etc/ndm/netfilter.d/100-redirect.sh


Вставьте (Shift+Insert) содержимое:

#!/bin/sh

[ "$type" == "ip6tables" ] && exit 0
[ -z "$(iptables -t nat -L | grep unblock)" ] || exit 0

iptables -w -t nat -A PREROUTING -i br0 -p tcp -m set --match-set unblock dst -j REDIRECT --to-port 9141

exit 0


В этот же файл вы можете добавить (это необязательно) перенаправление всех запросов на внешний порт 53 на себя. Это нужно, чтобы клиенты в локальной сети не использовали сторонние DNS-сервисы. Запросы будут идти через штатный DNS-сервер.

iptables -w -t nat -I PREROUTING -i br0 -p udp --dport 53 -j DNAT --to 192.168.0.1
iptables -w -t nat -I PREROUTING -i br0 -p tcp --dport 53 -j DNAT --to 192.168.0.1


Замените при необходимости 192.168.0.1 на внутренний адрес вашего маршрутизатора (LAN).

jzjmegyocml7w5yupbsqjpwzxaw.png

Дайте права на исполнение:

chmod +x /opt/etc/ndm/netfilter.d/100-redirect.sh


10. Настройка dnsmasq и подключение дополнительного конфигурационного файла к dnsmasq.


Удалите содержимое конфигурационного файла dnsmasq:

cat /dev/null > /opt/etc/dnsmasq.conf


Откройте файл конфигурации dnsmasq:

mcedit /opt/etc/dnsmasq.conf


Вставьте (Shift+Insert) содержимое:

user=nobody
resolv-file=/etc/resolv.conf
no-poll
bogus-priv
no-negcache
clear-on-reload
bind-dynamic
listen-address=192.168.0.1
listen-address=127.0.0.1
min-port=4096
cache-size=1536
expand-hosts
log-facility=/dev/null
log-async

conf-file=/opt/etc/unblock.dnsmasq
server=8.8.8.8


Замените при необходимости 192.168.0.1 на внутренний адрес вашего маршрутизатора (LAN).

11. Добавление задачи в cron для периодического обновления содержимого множества unblock.


Это дополнительная страховка на тот случай, если программы/устройства используют свой собственный метод резолвинга, а IP-адрес домена изменился. Всё, что нужно сделать, это с желаемой периодичностью запускать скрипт unblock_ipset.sh. Для примера будем запускать каждый день в 6 утра.

Откройте в редакторе файл /opt/etc/crontab:

mcedit /opt/etc/crontab


Добавьте в конце:

00 06 * * * root /opt/bin/unblock_ipset.sh


При желании вы можете закомментировать все остальные шаблонные задачи. Вот, как будет выглядеть ваш файл crontab:

ley5slcvjfvs-9odj9air9qdd8s.png

12. Отключение штатного DNS-сервера и перезагрузка маршрутизатора.


Подключитесь к CLI маршрутизатора Keenetic (порт 23 для Telnet и 22 для SSH, если в системе добавлен компонент «Сервер SSH»).

Выполните команду:

opkg dns-override
system configuration save
system reboot


Встроенный в прошивку DNS-сервер будет выключен, и вместо него будет использоваться dnsmasq из состава Entware. Маршрутизатор при загрузке проверяет, подмонтирована ли папка opt (есть ли флешка/диск с Entware). Если есть, то штатный DNS-сервер не используется. Если нет, используется. Т.е. вынув флешку и перезагрузив маршрутизатор, у вас всё будет работать, как и раньше (перед настройкой).

После перезагрузки откройте в браузере сайт check.torproject.org (он должен быть добавлен в unblock.txt). Если вы всё сделали верно, то вы увидите:

wa19dzxbu8qtldwrvkeijfqna7q.png


Если после настройки что-то работает не так, как нужно, используйте простые команды для определения проблемного этапа.

Отобразите содержимое множества unblock:

ipset list unblock


Если система сообщит, что такого множества нет, то ошибка на этапе 2 или вы не включили модуль Netfilter в системе (в случае с Keenetic).

Если множество окажется пустым, то не отработал скрипт unblock_ipset.sh, который в свою очередь должен быть запущен стартовым скриптом S99unblock. Запустите этот скрипт unblock_ipset.sh вручную. Если множество заполнилось, то ошибка на этапе 8. Если скрипт не может выполниться (скорее всего, ожидает резолвинга google.com), то ошибка где-то на стороне DNS-сервера, возможно, на этапе 10 или 6.

Проверьте наличие редиректа в iptables:

iptables-save | grep unblock


Если его нет, то ошибка на этапе 9.

Если все сайты из unblock.txt не работают (превышено время ожидания), но все другие работают, то проблема где-то на стороне Tor, ошибка на этапе 3.

Если проверка с сайтом check.torproject.org (он должен быть добавлен в unblock.txt) проходит, но для других ресурсов продолжает открываться заглушка от провайдера, скорее всего, провайдер вмешивается в DNS-трафик, подменяя ответы.


Если провайдер вмешивается в DNS-трафик, подменяя ответы для заблокированных ресурсов, это очень просто обойти. Для этого мы будем использовать dnscrypt-proxy. dnscrypt будет использоваться только для тех доменов, которые перечислены в unblock.txt. Все остальные запросы будут идти через штатные DNS-серверы.

У вас уже должен быть настроен описанный выше обход блокировок. Нижеследующие настройки идентичны для Padavan и Keenetic OS.

Установите дополнительное ПО на маршрутизаторе:

opkg update
opkg install dnscrypt-proxy2


Откройте файл конфигурации dnscrypt-proxy:

mcedit /opt/etc/dnscrypt-proxy.toml


Найдите параметры listen_addresses, fallback_resolver, cache и измените их:

listen_addresses = ['127.0.0.1:9153']
fallback_resolver = '77.88.8.8:1253'
cache = false


77.88.8.8:1253 — это адрес DNS-сервера Яндекс с нестандартным портом. Он является резервным на тот случай, если у dnscrypt-proxy возникнут какие-то проблемы.

Запустите dnscrypt-proxy:

/opt/etc/init.d/S09dnscrypt-proxy2 start


Убедитесь, что dnscrypt-proxy работает (вы должны в ответ увидеть список IP-адресов):

dig +short google.com @localhost -p 9153


Откройте в редакторе скрипт /opt/bin/unblock_ipset.sh:

mcedit /opt/bin/unblock_ipset.sh


Замените содержимое на:

#!/bin/sh

until ADDRS=$(dig +short google.com @localhost -p 9153) && [ -n "$ADDRS" ] > /dev/null 2>&1; do sleep 5; done

while read line || [ -n "$line" ]; do

  [ -z "$line" ] && continue
  [ "${line:0:1}" = "#" ] && continue

  echo $line | grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/[0-9]{1,2}' | awk '{system("ipset -exist add unblock "$1)}'
  dig +short $line @localhost -p 9153 | grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | awk '{system("ipset -exist add unblock "$1)}'

done < /opt/etc/unblock.txt


Мы внесли небольшое изменение — теперь dig для резолвинга использует не штатный DNS-сервер, а dnscrypt-proxy с портом 9153.

Откройте в редакторе скрипт /opt/bin/unblock_dnsmasq.sh:

mcedit /opt/bin/unblock_dnsmasq.sh


Замените содержимое на:

#!/bin/sh

cat /dev/null > /opt/etc/unblock.dnsmasq

while read line || [ -n "$line" ]; do

  [ -z "$line" ] && continue
  [ "${line:0:1}" = "#" ] && continue

  echo $line | grep -Eq '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' && continue

  echo "ipset=/$line/unblock" >> /opt/etc/unblock.dnsmasq
  echo "server=/$line/127.0.0.1#9153" >> /opt/etc/unblock.dnsmasq

done < /opt/etc/unblock.txt


Мы внесли небольшое изменение — теперь при генерации файла unblock.dnsmasq дополнительно вносятся строки вида «server=/доменное_имя/127.0.0.1#9153». Это означает, что резолвинг доменов из списка будет происходить через dnscrypt-proxy.

Выполните unblock_update.sh:

unblock_update.sh


Готово. Все сложные настройки позади. Теперь вы будете только редактировать список unblock.txt при необходимости, добавляя или удаляя из него домены или IP-адреса для разблокировки, и командой unblock_update.sh активировать внесённые изменения.

© Habrahabr.ru