Хабрахабр

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

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

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

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

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

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

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

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

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

Всё очень просто. У вас есть файл /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.

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

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.

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

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 ,{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

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

Это нужно, чтобы клиенты в локальной сети не использовали сторонние DNS-сервисы. В этот же файл вы можете добавить (это необязательно) перенаправление всех запросов на внешний порт 53 на себя. Запросы будут идти через штатный 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». После редактирования нажмите «Применить».

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:

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

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

reboot

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

У вас должен быть маршрутизатор 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» — Общие настройки > Изменить набор компонентов.

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

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

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

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

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:

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

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

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

ipset list unblock

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

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

Проверьте наличие редиректа в 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 активировать внесённые изменения.

Показать больше

Похожие публикации

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Хабрахабр

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

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

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

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

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

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

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

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

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

Всё очень просто. У вас есть файл /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.

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

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.

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

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 ,{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

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

Это нужно, чтобы клиенты в локальной сети не использовали сторонние DNS-сервисы. В этот же файл вы можете добавить (это необязательно) перенаправление всех запросов на внешний порт 53 на себя. Запросы будут идти через штатный 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». После редактирования нажмите «Применить».

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:

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

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

reboot

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

У вас должен быть маршрутизатор 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» — Общие настройки > Изменить набор компонентов.

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

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

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

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

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:

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

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

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

ipset list unblock

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

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

Проверьте наличие редиректа в 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 активировать внесённые изменения.

Показать больше

Похожие публикации

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»