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



Содержание



Введение


Я около двух лет использовал вариант обхода блокировок от 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
rustorka.com
uniongang.tv
fast-torrent.ru

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

###Книги
lib.rus.ec
flisland.net
flibusta.site

###Телеграм
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


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

Убедитесь, что у вас используется Entware, а не устаревший Entware-ng. Посмотрите содержимое папки /opt/var/opkg-lists. Там будет присутствовать файл entware или entware-ng. Во втором случае вам нужно обновить прошивку Padavan вашего маршрутизатора до последней версии и заново установить менеджер пакетов Entware. Только после этого приступайте к пошаговой инструкции.

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



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 {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
rustorka.com
uniongang.tv
fast-torrent.ru

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

###Книги
lib.rus.ec
flisland.net
flibusta.site

###Телеграм
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 через веб-интерфейс маршрутизатора — «Дополнительно» > «Персонализация» > «Скрипты» > «Выполнить после перезапуска правил брандмауэра». После редактирования нажмите «Применить».



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



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 OS


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

Если ранее (с прошивкой младше 2.07) вы уже добавляли поддержку Entware, то убедитесь, что у вас используется не устаревший Entware-ng.

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



Для тестов я использовал 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)


Проверьте, что в системе вашего маршрутизатора есть поддержка множества hash:net (как оказалась, не во всех маршрутизаторах Keenetic она есть):

ipset create test hash:net

Если команда никаких ошибок и сообщений не выдала, значит поддержка есть, и просто следуйте инструкции дальше. В противном случае (есть ошибка) в следующем скрипте вам нужно заменить hash:net на hash:ip. При этом вы потеряете возможность разблокировки по CIDR.

Создайте пустое множество адресов с именем 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
rustorka.com
uniongang.tv
fast-torrent.ru

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

###Книги
lib.rus.ec
flisland.net
flibusta.site

###Телеграм
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, который в свою очередь должен быть запущен стартовым скриптом 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-запросов провайдером


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

Если вы уверены, что ваш провайдер не фильтрует 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 активировать внесённые изменения.

Например, разблокировали торрент-трекеры и спокойно смотрите торренты напрямую на вашем любимом Android-боксе:



Дополнительная информация для тех, кто хочет блокировать рекламные домены на маршрутизаторе, в этом комментарии. Для тех, кто хочет использовать dnscrypt в качестве основного резолвера для всех доменов, в этом комментарии.

Комментарии (43)


  1. epishman
    04.01.2019 05:06

    Наркотики через Тор, даже не знаю… их же вылавливают пачками на контрольных закупках, особенно по тем адресам, что на заборах. А статья хорошая.


  1. Ivanii
    04.01.2019 09:05

    Полезненько, 7zip и еще куча ресурсов до сих пор блокированы.


    1. Kyrie1965 Автор
      04.01.2019 11:02

      7-zip.org действительно не работает. Добавил его в unblock.txt, заработал сразу.


      1. solalex
        04.01.2019 11:44

        git.openwrt.org — заблочен
        nextcloud.com — заблочен


        1. Kyrie1965 Автор
          04.01.2019 11:47

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


          1. solalex
            04.01.2019 12:00

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


  1. rostislav-zp
    04.01.2019 09:06

    А настройку блокировки рекламы не пробовали? сколько ни пытался-то вообще пропадает интернет, то ничего не блокирует.приходится pi-hole+vpn использовать. Прошивал падаван на xiaomi mi router, который с четырьмя антенами. Уже около года работает. Из всех моих роутеров, доволен этим больше всего


    1. Kyrie1965 Автор
      04.01.2019 10:57

      А что её пробовать? Берёте и блокируете. Самый идеальный вариант через дополнения для бразузере, в этом случае охватываются все нюансы и особенности, т.к. у блокировщика есть доступ к содержимому сайта. Если хотите на стороне маршрутизатора, то, применительно инструкции, на этапе 10 (редактирование конфигурационного файла dnsmasq) добавляете:

      no-resolv
      server=176.103.130.130
      server=176.103.130.131


      Удаляете все другие записи server в файле, если они есть. Всё. В роли серверов DNS будет использоваться AdGuard DNS с блокировокой рекламы.


      1. ValdikSS
        04.01.2019 15:36
        +1

        Зачем использовать сторонние DNS, блокирующие рекламу, когда можно сделать то же самое локально, буквально одной строкой?

        curl --compressed https://cdn.raletag.gq/rueasyhosts.txt https://adaway.org/hosts.txt | awk '{sub("\r$", ""); sub("^www\\.", "", $2); if ($0 && $0 !~ /^#/ && $2 && $2 !~ /^$/ && $2 != "localhost") print "server=/." $2 "/";}' | sort -u > /etc/dnsmasq-adblock-list.conf


        1. Kyrie1965 Автор
          06.01.2019 16:21

          Спасибо.

          Вот вариант для тех, кто действует по инструкции из статьи (единый вариант для Padavan и Keenetic OS)
          Выполните команды:

          opkg update
          opkg install curl ca-certificates ca-bundle
          touch /opt/etc/adblock.dnsmasq

          В 10-м шаге инструкции (уже после того, как вы проделаете все действия по инструкции и у вас всё работает, как нужно) добавьте в конфигурационный файл dnsmasq.conf строку:

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

          Создайте скрипт adblock_update.sh:

          mcedit /opt/bin/adblock_update.sh

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

          #!/bin/sh
          
          curl --compressed https://cdn.raletag.gq/rueasyhosts.txt https://adaway.org/hosts.txt | awk '{sub("\r$", ""); sub("^www\\.", "", $2); if ($0 && $0 !~ /^#/ && $2 && $2 !~ /^$/ && $2 != "localhost") print "server=/." $2 "/";}' | sort -u > /opt/etc/adblock.dnsmasq
          
          if [ ! -e "/opt/etc/init.d/S56dnsmasq" ]; then
            restart_dhcpd
          else
            /opt/etc/init.d/S56dnsmasq restart
          fi

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

          chmod +x /opt/bin/adblock_update.sh

          Запустите скрипт adblock_update.sh (вы можете запускать его при необходимости обновления списка доменов с рекламой):

          adblock_update.sh

          Чтобы отключить блокировку рекламных доменов, удалите строку conf-file=/opt/etc/adblock.dnsmasq из dnsmasq.conf.


          1. jryj
            06.01.2019 20:44

            Я же правильно понимаю, что сайты из списка: /opt/etc/adblock.dnsmasq не должны открываться?


            1. Kyrie1965 Автор
              06.01.2019 21:11

              Всё верно. Они перестанут работать (не будут резолвиться на стороне клиентов), как и реклама, которая на них ссылается.

              Тут нужно быть аккуратным, потому что список рубит лишнее, и что-то нужное может перестать работать. Например, у меня kinozal.tv отвалился с таким подходом.


  1. Renaissance
    04.01.2019 12:05

    Немного личной практики, если кому интересно:

    перепробовал множество вариантов обхода блокировок прямо на маршрутизаторе, но в итоге остановился на варианте Shadowsocks на конечных устройствах. Весь трафик по умолчанию в браузере гоняю через SS, а исключения контролируются через расширение SwitchyOmega. На смартфонах SS тоже настроен и включается в случае необходимости, оно просто работает и удобно вполне.

    В случае, если чему-то кроме браузера требуется доступ к заблокированным ресурсам, в SS просто включается режим System Proxy и можно спокойно работать дальше.

    В итоге, получил 2-в-1: обход блокировок и хотя бы какая-то «анонимность» в сети.

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


    1. ClearAirTurbulence
      04.01.2019 13:12

      Красота! Теперь такое же для микротика )


      1. Renaissance
        04.01.2019 13:21

        Подобное уже было для MikroTik: habr.com/post/413049
        P.S. Я так понял, кто-то промахнулся веткой для ответа.
        Но если все же речь идет о Shadowsocks для RouterOS, то увы, его нет.
        Единственный вариант (как я и сделал) — сменить прошивку на LEDE/OpenWrt 18, там есть поддержка SS.


  1. Kyrie1965 Автор
    04.01.2019 17:36

    Случайно нажал «Отклонить» на комментарии человека (автоматом воспринял кнопку, как «Ответить»). Прошу прощения у него.

    У него всё заработло на Padavan, но был вопрос относительно dnscrypt-proxy2 — его нет в Entware. В чём дело?

    У вас используется старая версия Entware-ng, в которой пакеты и их список уже не обновляются. И пакета dnscrypt-proxy2 там нет (только первая версия). Вам нужно обновить прошивку до последней (Entware-ng было переключено на Entware в прошивке от 10.05.2018, commit 8ec3a10) и заново настроить Entware, удалив предыдущую установку Entware-ng. Пакет dnscrypt-proxy2 появится.


    1. ATmegAdriVeR
      04.01.2019 17:47

      Спасибо, это я писал)
      Прошивку, видимо, руками нужно собирать обновлённую?
      У Padavan-а на официальной странице последнее обновление аж в 2016.
      https://bitbucket.org/padavan/rt-n56u/wiki/Home


      1. Kyrie1965 Автор
        04.01.2019 17:51

        Самая свежая версия от 05.11.2018 (commit 32a93db). Установка стандартная — запускаете PROMETHEUS, обновляете исходный код, собираете прошивку и устанавливаете её. Буквально несколько кликов и минуту времени (не считая несколько десятков минут, зависящие от мощности вашего компьютера, которые будут потрачены на компиляцию прошивки). Всё очень просто.

        Затем форматируете (чтобы избавиться от старой версии Entware-ng) раздел/диск/внутреннюю память под Entware для установки свежей версии.


        1. ATmegAdriVeR
          05.01.2019 20:21

          Спасибо, получилось, правда, не за 10 минут)
          Возможно, стоит добавить ссылку на процедуры сборки прошивки в статью? Или указать, что работа с dnscrypt-proxy2 возможно только на свежесобранных образах.

          Вопрос не по теме — подскажите, пожалуйста, где поискать скрипт автоматического переключения между Wi-Fi сетями в режиме AP-Client (WISP)? Нашёл множество статей по автоматическому переключению между WAN<->3G модемом, а по перебору Wi-Fi сетей ничего толкового нет.


          1. Kyrie1965 Автор
            05.01.2019 20:39

            Тема прошивки Padavan очень обширная, ещё есть особенности на разных устройствах, ещё есть особенности ранних версий. Все это напрямую не относится к самой статье. Тема Keenetic тоже обширная, и тоже в своё время была поддержка Entware-ng (и остаётся без переустановки). В общем, достаточно знать, что на свежих прошивках обоих типов устройств всё отрабатывается по инструкции идеально. Кто захочет, найдёт упоминание тут в комментариях.

            По второму вопросу не подскажу.


        1. dartraiden
          05.01.2019 00:00

          Самая свежая версия от 05.11.2018 (commit 32a93db).

          Если хочется ещё свежее — есть форк. Там обновлён некоторый софт, добавлена поддержка SMB 3, исправлены некоторые мелкие ошибки…

          Собирается всё тем же PROMETHEUS, только тестовой версией и на свежих дистрибутивах Linux, в отличие от Padavan.


  1. Bonio
    04.01.2019 18:58

    Слишком геморойно вручную списки наполнять, да и в текущих условиях полезнее весь трафик через vpn пропускать, а белые списки делать не для заблокированных ресурсов, а для тех, куда надо получать доступ напрямую через провайдера. Я так и сделал. Pfsense позволяет все это настроить вообще не заглядывая в консоль, но такие игрушечные роутеры для этого уже не подойдут, нужно железо посерьезнее.


  1. dartraiden
    04.01.2019 19:54

    Ещё стоит как-то обрабатывать обращения к адресам из заблокированных диапазонов. Это уберёт приличное количество случаев «домен не числится в реестре, но заблокирован».

    Но всё чаще я натыкаюсь на ситуации, когда провайдер, не умеющий обнюхать HTTPS и прочитать в SNI, на какой домен обращается пользователь, рубит все HTTPS-соединения на IP-адрес, на котором кроме «запрещёнки» висит и непричастный ресурс. Руками добавлять откровенно лень, видимо, пора полностью обернуться в VPN.

    Сейчас у меня комбинированная схема: заблокированные ресурсы пущены через VPN, заблокированные «за компанию» — через Tor, поднятый там же, на роутере, а реклама режется с помощью dnsmasq, список рекламных доменов формируется громадным bash-скриптом, который я всё никак не дополирую.


    1. rostislav-zp
      05.01.2019 02:20

      А на скрипт как-то можно взглянуть? сколько ни читал мануалов, не подтягиваются списки блокировки.точнее роутер их качает, но не видит что блокировать. Кстати насчет списков есть очень толковый ресурс- tspprs.com


      1. dartraiden
        05.01.2019 04:08

        Скрипт
        sleep 9
        PATH=/opt/sbin:/opt/bin:/opt/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
        
        # 0.0.0.0 is defined as a non-routable meta-address used to designate an invalid, unknown, or non applicable target. Using 0.0.0.0 is empirically faster, possibly because there's no wait for a timeout resolution
        ENDPOINT_IP4=0.0.0.0
        
        
        # Download and process the files needed to make the lists (enable/add more, if you want)
        
        # broad blocklist
        wget -qO- "https://www.mvps.org/winhelp2002/hosts.txt" | awk -v r="$ENDPOINT_IP4" '{sub(/^0.0.0.0/, r)} $0 ~ "^"r' > /tmp/block.build.list
        
        # focus on ad related domains
        wget -qO- "https://pgl.yoyo.org/as/serverlist.php?hostformat=hosts&showintro=1&mimetype=plaintext" | awk -v r="$ENDPOINT_IP4" '{sub(/^127.0.0.1/, r)} $0 ~ "^"r' >> /tmp/block.build.list
        
        # focus on malware
        wget -qO- "https://www.malwaredomainlist.com/hostslist/hosts.txt" | awk -v r="$ENDPOINT_IP4" '{sub(/^127.0.0.1/, r)} $0 ~ "^"r' >> /tmp/block.build.list
        
        # focus on mobile ads
        wget -qO- "https://adaway.org/hosts.txt" | awk -v r="$ENDPOINT_IP4" '{sub(/^127.0.0.1/, r)} $0 ~ "^"r' >> /tmp/block.build.list
        
        # broad blocklist
        wget -qO- "https://someonewhocares.org/hosts/hosts" | awk -v r="$ENDPOINT_IP4" '{sub(/^127.0.0.1/, r)} $0 ~ "^"r' >> /tmp/block.build.list
        
        # focus on malicious bitcoin mining sites
        wget -qO- "https://raw.githubusercontent.com/hoshsadiq/adblock-nocoin-list/master/hosts.txt" | awk -v r="$ENDPOINT_IP4" '{sub(/^0.0.0.0/, r)} $0 ~ "^"r' >> /tmp/block.build.list
        
        # focus on zeus botnet by abuse.ch
        wget -qO- "https://zeustracker.abuse.ch/blocklist.php?download=hostfile" | awk -v r="$ENDPOINT_IP4" '{sub(/^127.0.0.1/, r)} $0 ~ "^"r' >> /tmp/block.build.list
        
        # focus on malware
        wget -qO- "https://mirror1.malwaredomains.com/files/justdomains" | grep -v -e ^# -e ^$ | awk -v r="$ENDPOINT_IP4 " '{sub(//, r)} $0 ~ "^"r' >> /tmp/block.build.list
        
        # focus on malvertising by disconnect.me
        wget -qO- "https://s3.amazonaws.com/lists.disconnect.me/simple_malvertising.txt" | grep -v -e ^# -e ^$ | awk -v r="$ENDPOINT_IP4 " '{sub(//, r)} $0 ~ "^"r' >> /tmp/block.build.list
        
        # focus on ad by disconnect.me
        wget -qO- "https://s3.amazonaws.com/lists.disconnect.me/simple_ad.txt" | grep -v -e ^# -e ^$ | awk -v r="$ENDPOINT_IP4 " '{sub(//, r)} $0 ~ "^"r' >> /tmp/block.build.list
        
        # focus on tracking by disconnect.me (Last-Modified: 31 Jul 2015)
        # wget -qO- "https://s3.amazonaws.com/lists.disconnect.me/simple_tracking.txt" | grep -v -e ^# -e ^$ | awk -v r="$ENDPOINT_IP4 " '{sub(//, r)} $0 ~ "^"r' >> /tmp/block.build.list
        
        # focus on ransomware by abuse.ch
        wget -qO- "https://ransomwaretracker.abuse.ch/downloads/RW_DOMBL.txt" | grep -v -e ^# -e ^$ | awk -v r="$ENDPOINT_IP4 " '{sub(//, r)} $0 ~ "^"r' >> /tmp/block.build.list
        
        # focus on sites which have used DMCA takedowns to force removal from other blacklists (Last-Modified: 20 Aug 2017)
        # wget -qO- "https://ssl.bblck.me/blacklists/domain-list.txt" | grep -v -e ^# -e ^$ | awk -v r="$ENDPOINT_IP4 " '{sub(//, r)} $0 ~ "^"r' >> /tmp/block.build.list
        
        # generic blocklist, fewer false positives down to the low sensitivity list with more false positives
        wget -qO- "https://dshield.org/feeds/suspiciousdomains_High.txt" | grep -v -e ^# -e ^$ | awk -v r="$ENDPOINT_IP4 " '{sub(//, r)} $0 ~ "^"r' >> /tmp/block.build.list
        
        # focus on ad related domains (Last-Modified: 14 Feb 2018)
        # wget -qO- "https://hostsfile.mine.nu/Hosts" | awk -v r="$ENDPOINT_IP4" '{sub(/^127.0.0.1/, r)} $0 ~ "^"r' >> /tmp/block.build.list
        
        # broad blocklist
        # wget -qO- "https://hosts-file.net/ad_servers.txt" | awk -v r="$ENDPOINT_IP4" '{sub(/^127.0.0.1/, r)} $0 ~ "^"r' >> /tmp/block.build.list
        
        # broad blocklist (Last-Modified: 18 Mar 2018)
        # wget -qO- "http://sysctl.org/cameleon/hosts" | awk -v r="$ENDPOINT_IP4" '{sub(/^127.0.0.1/, r)} $0 ~ "^"r' >> /tmp/block.build.list
        
        # generic blocklist
        # wget -qO- "https://dshield.org/feeds/suspiciousdomains_Medium.txt" | grep -v -e ^# -e ^$ | awk -v r="$ENDPOINT_IP4 " '{sub(//, r)} $0 ~ "^"r' >> /tmp/block.build.list
        
        # generic blocklist
        # wget -qO- "https://dshield.org/feeds/suspiciousdomains_Low.txt" | grep -v -e ^# -e ^$ | awk -v r="$ENDPOINT_IP4 " '{sub(//, r)} $0 ~ "^"r' >> /tmp/block.build.list
        
        # focus on feodo botnet
        # wget -qO- "https://feodotracker.abuse.ch/blocklist/?download=domainblocklist" | grep -v -e ^# -e ^$ | awk -v r="$ENDPOINT_IP4 " '{sub(//, r)} $0 ~ "^"r' >> /tmp/block.build.list
        
        # generic blocklist (Last-Modified: 15 Apr 2018)
        # wget -qO- "https://raw.githubusercontent.com/Dawsey21/Lists/master/main-blacklist.txt" | grep -v -e ^# -e ^$ | awk -v r="$ENDPOINT_IP4 " '{sub(//, r)} $0 ~ "^"r' >> /tmp/block.build.list
        
        # focus on windows telemetry domains
        # wget -qO- "https://raw.githubusercontent.com/crazy-max/WindowsSpyBlocker/master/data/hosts/spy.txt" | awk -v r="$ENDPOINT_IP4" '{sub(/^0.0.0.0/, r)} $0 ~ "^"r' >> /tmp/block.build.list
        
        # focus on malware by disconnect.me
        # wget -qO- "https://s3.amazonaws.com/lists.disconnect.me/simple_malware.txt" | grep -v -e ^# -e ^$ | awk -v r="$ENDPOINT_IP4 " '{sub(//, r)} $0 ~ "^"r' >> /tmp/block.build.list
        
        # focus on intrusive online consultants and callback widgets
        # wget -qO- "https://raw.githubusercontent.com/pafnuty/onlineConsultantBlocker/master/hosts" | awk -v r="$ENDPOINT_IP4" '{sub(/^0.0.0.0/, r)} $0 ~ "^"r' >> /tmp/block.build.list
        
        # focus on malicious bitcoin mining sites
        # wget -qO- "https://raw.githubusercontent.com/greatis/Anti-WebMiner/master/hosts" | awk -v r="$ENDPOINT_IP4" '{sub(/^0.0.0.0/, r)} $0 ~ "^"r' >> /tmp/block.build.list
        
        # focus on dead websites (against typos in URLs)
        # wget -qO- "https://raw.githubusercontent.com/FadeMind/hosts.extras/master/add.Dead/hosts" | awk -v r="$ENDPOINT_IP4" '{sub(/^0.0.0.0/, r)} $0 ~ "^"r' >> /tmp/block.build.list
        
        # focus on spam
        # wget -qO- "https://raw.githubusercontent.com/FadeMind/hosts.extras/master/add.Spam/hosts" | awk -v r="$ENDPOINT_IP4" '{sub(/^0.0.0.0/, r)} $0 ~ "^"r' >> /tmp/block.build.list
        
        # focus on malicious bitcoin mining sites
        # wget -qO- "https://gitlab.com/ZeroDot1/CoinBlockerLists/raw/master/hosts" | awk -v r="$ENDPOINT_IP4" '{sub(/^0.0.0.0/, r)} $0 ~ "^"r' >> /tmp/block.build.list
        
        # broad blocklist
        # wget -qO- "https://raw.githubusercontent.com/mitchellkrogza/Badd-Boyz-Hosts/master/hosts" | awk -v r="$ENDPOINT_IP4" '{sub(/^0.0.0.0/, r)} $0 ~ "^"r' >> /tmp/block.build.list
        
        # focus on ads and tracking domains
        # wget -qO- "https://raw.githubusercontent.com/lightswitch05/hosts/master/ads-and-tracking-extended.txt" | awk -v r="$ENDPOINT_IP4" '{sub(/^0.0.0.0/, r)} $0 ~ "^"r' >> /tmp/block.build.list
        
        # focus on Windows installers ads sources
        # wget -qO- "https://raw.githubusercontent.com/FadeMind/hosts.extras/master/UncheckyAds/hosts" | awk -v r="$ENDPOINT_IP4" '{sub(/^0.0.0.0/, r)} $0 ~ "^"r' >> /tmp/block.build.list
        
        # focus on 2o7 network tracking
        # wget -qO- "https://raw.githubusercontent.com/FadeMind/hosts.extras/master/add.2o7Net/hosts" | awk -v r="$ENDPOINT_IP4" '{sub(/^0.0.0.0/, r)} $0 ~ "^"r' >> /tmp/block.build.list
        
        # focus on 2o7 network tracking
        # wget -qO- "https://raw.githubusercontent.com/azet12/KADhosts/master/KADhosts.txt" | awk -v r="$ENDPOINT_IP4" '{sub(/^0.0.0.0/, r)} $0 ~ "^"r' >> /tmp/block.build.list
        
        # Add black list, if non-empty
        if [ -s "/etc/storage/black.list" ]
        then
            awk -v r="$ENDPOINT_IP4" '/^[^#]/ { print r,$1 }' /etc/storage/black.list >> /tmp/block.build.list
        fi
        
        
        # Sort the download/black lists
        awk '{sub(/\r$/,"");print $1,$2}' /tmp/block.build.list | sort -u > /tmp/block.build.before
        
        
        # Filter (if applicable)
        if [ -s "/etc/storage/white.list" ]
        then
            # Filter the blacklist, suppressing whitelist matches
            # This is relatively slow
            egrep -v "^[[:space:]]*$" /etc/storage/white.list | awk '/^[^#]/ {sub(/\r$/,"");print $1}' | grep -vf - /tmp/block.build.before > /tmp/block.hosts
        else
            cat /tmp/block.build.before > /tmp/block.hosts
        fi
        
        
        # Delete files used to build list to free up the limited space
        rm -f /tmp/block.build.list
        rm -f /tmp/block.build.before
        
        
        killall dnsmasq
        /usr/sbin/dnsmasq


        1. rostislav-zp
          05.01.2019 10:58

          работает, спасибо


  1. valeramalko
    05.01.2019 21:11

    спасибо все получилось, только на мобильном устройстве (android) при включенном на роутере ip v6 от провайдера, rutracker ни в какую не открывается, идет «заглушка» от провайдера, отключаю ip v6 — на мобильном начинает работать, (остальные из списка работают), на ПК все норм


    1. Kyrie1965 Автор
      05.01.2019 21:15

      Инструкция заточена под IPv4 (под IPv6 требуется доработка). У rutracker есть адрес IPv6 2a02:4680:22::214. Если обратиться к нему, то запрос пойдёт мимо обхода блокировок и будет заблокирован провайдером (если провайдер умеет блокировать IPv6).


      1. snizovtsev
        06.01.2019 01:40

        РКН уже поддерживает IPv6 в выгрузке, так что это не на долго.


  1. bustEXZ
    05.01.2019 14:14

    del


  1. snizovtsev
    06.01.2019 01:45

    На Xiaomi R3G прекрасно работает OpenWrt, где всё вообще можно буквально мышкой настроить. В отличие от Padavan там используется свежее upstream ядро с нормально написанными драйверами, а не китайские утекшие поделки через ndiswrapper.


    1. Kyrie1965 Автор
      06.01.2019 02:01

      Расскажите, пожалуйста, как реализовать указанный в статье (или подобный) метод выборочного обхода блокировок «буквально мышкой» в OpenWrt.


      1. snizovtsev
        06.01.2019 11:41

        Поднимаете сервер с shadowsocks, устанавливаете OpenWrt (самая сложная часть), открываете 192.168.1.1, устанавливаете пакеты shadowsocks-libev-ss-redir и shadowsocks-libev-ss-rules, открываете вкладку Services->shadowsocks-libev, вводите адрес сервера и пароль, открываете вкладку "Redir rules", ставите политику "local-out default" в "checkdst", в destinantion settings заливаете файл со списком IP (можно с подсетями в формате ipset), dst default "bypass", для надёжности ставите галку в "forward recentrst" для автодобавления правил после получения нескольких TCP RST с одного адреса.
        Готово, жмёте кнопку apply и радуетесь интернету.


        1. Kyrie1965 Автор
          06.01.2019 12:45

          Если не учитывать, что это банальный ввод в заблуждение, аналогично, можно сказать, что обход блокировок делается в два клика не любом маршрутизаторе вообще — покупаете быстрый VPN-сервер и добавляете его в настройки маршрутизатора и гоните весь трафик через него — готово.

          А что вы будете делать с сайтами, которые меняют свой IP (и вы их заведомо не знаете)?


          1. snizovtsev
            06.01.2019 13:07

            Регулярно обновлять список IP, у LuCi (веб интерфейс OpenWrt) есть прекрасный API для всего, чего можно сделать "мышкой". Не вижу смысла резолвить баш скриптами на встроенной системе (роутере), когда это можно без ограничений на используемые инструменты делать на сервере (этакий SDN-way). Да и всё уже зарезолвили, конвертируйте из csv и пользуйтесь. Для пущей подстраховки есть автодобоваление айпишников в ipset по многократному tcp rst (что делают провайдеры для https).
            Есть ещё вариант по публичным данным один раз в полгода генерировать таблицу всех нероссийских IP — в любом случае трафик пойдёт через европу, в азии мало полезного контента для нас. Скрипты есть на гитхабе.


            1. Kyrie1965 Автор
              06.01.2019 13:28

              Т.е. это выльется в реальности в кучку скриптов и никаких «буквально настроить мышкой» там нет. В итоге, мы имеем, что человеку, у которого уже есть маршрутизатор Keenetic или с прошивкой Padavan, на свой маршрутизатор надо поставить OpenWrt, арендовать сервер с ежемесячной оплатой, настроить его, настроить маршрутизатора с OpwenWrt (по инструкции, которой по сути нет, при этом действий будет не меньше и не проще, чем описанное в статья, и не охватывает существенные частные случаи, т.к. из ваших же данных вы оперируете только IP, а не доменами, например нет внесения IP во множество при резолвинге). Вывод — ваши слова не соответствуют действительности, и OpenWrt никакой выгоды не несёт для конкретной реализации, описанной в статье (затрата большего количества усилий, времени, денег, и при этом получите результат по эффективности хуже или, как максимум, не лучше). Какое бы крутое ядро с upstream там не было, это не играет никакой роли для конкретной задачи. Скрипач не нужен.


              1. snizovtsev
                06.01.2019 13:57

                Для прокси достаточно самого слабого инстанса, который стоит копейки. И даже их можно без ущерба разделить на знакомых, есть даже готовый набор ansible рецептов для поднятие всех мыслимых сервисов сразу с порталом раздачи доступов для знакомых. У Tor низкая скорость и высокая задержка by design, для ежедневного неосознанного использования это не годится. Учитывая, что скоро гуглить придётся тоже через прокси для нормальной выдачи — tor не вариант. Кстати, как с ним рекапча дружит?


              1. snizovtsev
                06.01.2019 14:27

                Ах, да, совсем забыл. Китайцы уже давно придумали технические решения для автоматического распространения списков блокировки — гуглится по слову gfwlist. Например в клиенте shadowsocks для macos достаточно просто указать url, для openwrt наверняка тоже есть готовый пакет. Нужно просто нам тоже взять и адаптировать это к РКН.


  1. jryj
    06.01.2019 13:45

    А не подскажите, как сделать, что бы dnscrypt работал не только для адресов в unblock.txt, а вообще для всей системы?


    1. Kyrie1965 Автор
      06.01.2019 13:52

      После того, как настроите dnscrypt, выполните 10-й шаг настроек повторно. Только удалите поле «server=8.8.8.8» и добавьте:

      no-resolv
      server=127.0.0.1#9153

      Перезапустите dnsmasq.

      На Padavan:
      restart_dhcpd

      На Keenetic:
      /opt/etc/init.d/S56dnsmasq restart

      dnsmasq начнёт использовать только dnscrypt для резолвинга.


      1. jryj
        06.01.2019 18:59
        +1

        Работает! Спасибо.

        PS: и главное — решение очевидное-то. :))


  1. prived
    07.01.2019 17:12

    На форке Padavn от Linaro Tor уже включен в прошивку. Как это отражается на методике?


    1. Kyrie1965 Автор
      07.01.2019 17:13

      Используйте эту версию Tor с соответствующим конфигурационным файлом. Или выключите и используйте версию из Entware (как по инструкции).