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

    Инструкций с разными вариантами обхода блокировок Интернет-ресурсов опубликовано огромное количество. Но тема не теряет актуальности. Даже всё чаще звучат инициативы на законодательном уровне заблокировать статьи о методах обхода блокировок. И появились слухи, что Роскомнадзор получит ещё одну пачку денег налогоплательщиков на «более лучшие» блокировки. Опытные пользователи ничего нового и полезного из статьи не узнают. А вот другие получат готовые пошаговые инструкции для простого и эффективного выборочного обхода блокировок на популярных маршрутизаторах с прошивкой 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
    seasonvar.ru
    
    ###Книги
    lib.rus.ec
    flisland.net
    flibusta.site
    
    ###Телеграм
    telegram.org
    tdesktop.com
    tdesktop.org
    tdesktop.info
    tdesktop.net
    telesco.pe
    telegram.dog
    telegram.me
    t.me
    web.telegram.org
    desktop.telegram.org
    updates.tdesktop.com
    venus.web.telegram.org
    flora.web.telegram.org
    vesta.web.telegram.org
    pluto.web.telegram.org
    aurora.web.telegram.org
    149.154.172.0/22
    91.108.4.0/22
    91.108.8.0/22
    91.108.12.0/22
    91.108.16.0/22
    91.108.56.0/22
    149.154.160.0/22
    149.154.164.0/22
    149.154.168.0/22
    
    ###Разное
    edem.tv
    crimerussia.com
    4pna.com
    2019.vote
    
    ###Проверка Tor
    check.torproject.org
    
    ###Пример разблокировки по IP (убрать # в начале строки)
    #195.82.146.214
    
    ###Пример разблокировки по CIDR (убрать # в начале строки)
    #103.21.244.0/22
    
    ###Пример разблокировки по диапазону (убрать # в начале строки)
    #100.100.100.200-100.100.100.210


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

    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. Только после этого приступайте к пошаговой инструкции.

    Как показали отзывы, в основном проблемы возникают у тех, у кого Entware настроен неверно изначально (т.е. не загружаются скрипты из init.d) во внутренней памяти маршрутизатора. Если у вас Xiaomi Mi Router 3 или 3G, и вы не уверены, что Entware во внутренней памяти у вас работает корректно (автоматический запуск), то просто всё настройте заново. Берёте PROMETHEUS. Обновляет скрипт (1). Обновляете исходный код (2). Собираете и прошиваете самую актуальную прошивку (4). Сбрасываете настройки прошивки (NVRAM и хранилище файлов) — Дополнительно > Администрирование > Настройки. Настраиваете доступ в Интернет на маршрутизаторе и включаете SSH. Выполняете в PROMETHEUS Firmware > Форматирование RWFS. Выбираете Дополнительно > Администрирование > Настройки > Монтировать файловую систему в R/W раздел > UBIFS. Перезагрузите маршрутизатор. Все актуальные скрипты запускаа 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
    seasonvar.ru
    
    ###Книги
    lib.rus.ec
    flisland.net
    flibusta.site
    
    ###Телеграм
    telegram.org
    tdesktop.com
    tdesktop.org
    tdesktop.info
    tdesktop.net
    telesco.pe
    telegram.dog
    telegram.me
    t.me
    web.telegram.org
    desktop.telegram.org
    updates.tdesktop.com
    venus.web.telegram.org
    flora.web.telegram.org
    vesta.web.telegram.org
    pluto.web.telegram.org
    aurora.web.telegram.org
    149.154.172.0/22
    91.108.4.0/22
    91.108.8.0/22
    91.108.12.0/22
    91.108.16.0/22
    91.108.56.0/22
    149.154.160.0/22
    149.154.164.0/22
    149.154.168.0/22
    
    ###Разное
    edem.tv
    crimerussia.com
    4pna.com
    2019.vote
    
    ###Проверка Tor
    check.torproject.org
    
    ###Пример разблокировки по IP (убрать # в начале строки)
    #195.82.146.214
    
    ###Пример разблокировки по CIDR (убрать # в начале строки)
    #103.21.244.0/22
    
    ###Пример разблокировки по диапазону (убрать # в начале строки)
    #100.100.100.200-100.100.100.210


    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
    
      cidr=$(echo $line | grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/[0-9]{1,2}')
    
      if [ ! -z "$cidr" ]; then
        ipset -exist add unblock $cidr
        continue
      fi
        
      range=$(echo $line | grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}-[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}')
    
      if [ ! -z "$range" ]; then
        ipset -exist add unblock $range
        continue
      fi
      
      addr=$(echo $line | grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}')
    
      if [ ! -z "$addr" ]; then
        ipset -exist add unblock $addr
        continue
      fi
      
      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. Ищем в строке диапазон. Если он найден, то добавляем его в unblock. Ищем в строке IP-адрес. Если IP найден, то добавляем его в unblock. Резолвим строку через 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_dnsmasq.sh
    restart_dhcpd
    sleep 3
    /opt/bin/unblock_ipset.sh &

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

    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). Если вы всё сделали верно, то вы увидите надпись «Congratulations. This browser is configured to use Tor.»:




    Настройка маршрутизатора с 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». Если после этого не появляется, то пробуйте без него, но высокая вероятность, что у вас не будет работать разблокировка по диапазону и CIDR (т.к. не будет поддержки множества hash:net).



    Для тестов я использовал 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 -exist
    
    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
    seasonvar.ru
    
    ###Книги
    lib.rus.ec
    flisland.net
    flibusta.site
    
    ###Телеграм
    telegram.org
    tdesktop.com
    tdesktop.org
    tdesktop.info
    tdesktop.net
    telesco.pe
    telegram.dog
    telegram.me
    t.me
    web.telegram.org
    desktop.telegram.org
    updates.tdesktop.com
    venus.web.telegram.org
    flora.web.telegram.org
    vesta.web.telegram.org
    pluto.web.telegram.org
    aurora.web.telegram.org
    149.154.172.0/22
    91.108.4.0/22
    91.108.8.0/22
    91.108.12.0/22
    91.108.16.0/22
    91.108.56.0/22
    149.154.160.0/22
    149.154.164.0/22
    149.154.168.0/22
    
    ###Разное
    edem.tv
    crimerussia.com
    4pna.com
    2019.vote
    
    ###Проверка Tor
    check.torproject.org
    
    ###Пример разблокировки по IP (убрать # в начале строки)
    #195.82.146.214
    
    ###Пример разблокировки по CIDR (убрать # в начале строки)
    #103.21.244.0/22
    
    ###Пример разблокировки по диапазону (убрать # в начале строки)
    #100.100.100.200-100.100.100.210


    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
    
      cidr=$(echo $line | grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/[0-9]{1,2}')
    
      if [ ! -z "$cidr" ]; then
        ipset -exist add unblock $cidr
        continue
      fi
      
      range=$(echo $line | grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}-[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}')
    
      if [ ! -z "$range" ]; then
        ipset -exist add unblock $range
        continue
      fi
      
      addr=$(echo $line | grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}')
    
      if [ ! -z "$addr" ]; then
        ipset -exist add unblock $addr
        continue
      fi
    
      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. Ищем в строке диапазон. Если он найден, то добавляем его в unblock. Ищем в строке IP-адрес. Если IP найден, то добавляем его в unblock. Резолвим строку через 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_dnsmasq.sh
    /opt/etc/init.d/S56dnsmasq restart
    /opt/bin/unblock_ipset.sh &

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

    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
    
    if [ -z "$(iptables-save 2>/dev/null | grep unblock)" ]; then
    	ipset create unblock hash:net -exist
    	iptables -w -t nat -A PREROUTING -i br0 -p tcp -m set --match-set unblock dst -j REDIRECT --to-port 9141
    fi
    
    exit 0

    Если вы в шаге 2 использовали hash:ip, а не hash:net, то замените hash:net на hash:ip. Фактически мы дополнительно дублируем функцию создания множества unblock из 2 шага. Это нужно для подстраховки, если скрипты из fs.d ещё не начали запускаться, а скрипты netfilter.d уже запускаются. Ничего страшного, если unblock уже было создано ранее, команда просто будет проигнорирована.

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

    if [ -z "$(iptables-save 2>/dev/null | grep "udp \-\-dport 53 \-j DNAT")" ]; then
    	iptables -w -t nat -I PREROUTING -i br0 -p udp --dport 53 -j DNAT --to 192.168.0.1
    fi
    
    if [ -z "$(iptables-save 2>/dev/null | grep "tcp \-\-dport 53 \-j DNAT")" ]; then
    	iptables -w -t nat -I PREROUTING -i br0 -p tcp --dport 53 -j DNAT --to 192.168.0.1
    fi

    Замените при необходимости 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
    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-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). Если вы всё сделали верно, то вы увидите надпись «Congratulations. This browser is configured to use Tor.»:




    Основные методы диагностики ошибок после настройки


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

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

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

    ipset list unblock

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

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

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

    iptables-save 2>/dev/null | grep unblock

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

    Если вообще все сайты не работают, т.е. не работает DNS, ошибка где-то в этапе 6 или 10. Возможно, на этапе 9.

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


    Дополнительный обход фильтрации DNS-запросов провайдером


    Если провайдер вмешивается в DNS-трафик, подменяя ответы для заблокированных ресурсов, это очень просто обойти. Для этого мы будем использовать dnscrypt-proxy. При желании и опыте вы легко можете заменить dnscrypt на stubby (DNS over TLS).

    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
    
      cidr=$(echo $line | grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/[0-9]{1,2}')
    
      if [ ! -z "$cidr" ]; then
        ipset -exist add unblock $cidr
        continue
      fi
      
      range=$(echo $line | grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}-[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}')
    
      if [ ! -z "$range" ]; then
        ipset -exist add unblock $range
        continue
      fi
      
      addr=$(echo $line | grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}')
    
      if [ ! -z "$addr" ]; then
        ipset -exist add unblock $addr
        continue
      fi
    
      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 в качестве основного резолвера для всех доменов, в этом комментарии.

    UPDATE 01.04.2019. Часто приходят личные сообщения по статье с типовыми вопросами. Отвечу тут на самые распространённые.

    Как сделать доступными сайты доменной зоны .onion?

    В torrc добавить:
    VirtualAddrNetwork 10.254.0.0/16
    DNSPort 127.0.0.1:9053
    AutomapHostsOnResolve 1

    В dnsmasq.conf добавить:
    server=/onion/127.0.0.1#9053
    ipset=/onion/unblock


    Как сделать обход блокировок для клиентов VPN-сервера, запущенного на маршрутизаторе?

    В torrc строку с TransPort замените на:
    TransPort 0.0.0.0:9141

    Добавьте дополнительный редирект с необходимымм интерфейсом (ИНТЕРФЕЙС — интерфейс VPN-сети):
    iptables -t nat -A PREROUTING -i ИНТЕРФЕЙС -p tcp -m set --match-set unblock dst -j REDIRECT --to-port 9141
    Поделиться публикацией

    Комментарии 77

      0
      Наркотики через Тор, даже не знаю… их же вылавливают пачками на контрольных закупках, особенно по тем адресам, что на заборах. А статья хорошая.
        0
        Полезненько, 7zip и еще куча ресурсов до сих пор блокированы.
          0
          7-zip.org действительно не работает. Добавил его в unblock.txt, заработал сразу.
            0
            git.openwrt.org — заблочен
            nextcloud.com — заблочен
              0
              Если они вам нужны, используйте метод обхода блокировок из статьи и добавляйте эти и другие нужные именно вам домены в unblock.txt.
                0
                я просто привожу сам факт избыточной блокировки добропорядочных сайтов, все методы обхода я знаю.
          0

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

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

            no-resolv
            server=176.103.130.130
            server=176.103.130.131


            Удаляете все другие записи server в файле, если они есть. Всё. В роли серверов DNS будет использоваться AdGuard DNS с блокировокой рекламы.
              +3
              Зачем использовать сторонние 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
                0
                Спасибо.

                Вот вариант для тех, кто действует по инструкции из статьи (единый вариант для 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.
                  0
                  Я же правильно понимаю, что сайты из списка: /opt/etc/adblock.dnsmasq не должны открываться?
                    0
                    Всё верно. Они перестанут работать (не будут резолвиться на стороне клиентов), как и реклама, которая на них ссылается.

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

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

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

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

            Точечный обход для себя я признал малоэффективным и слишком затратным по соотношению к результату.
              0
              Красота! Теперь такое же для микротика )
                0
                Подобное уже было для MikroTik: habr.com/post/413049
                P.S. Я так понял, кто-то промахнулся веткой для ответа.
                Но если все же речь идет о Shadowsocks для RouterOS, то увы, его нет.
                Единственный вариант (как я и сделал) — сменить прошивку на LEDE/OpenWrt 18, там есть поддержка SS.
              0
              Случайно нажал «Отклонить» на комментарии человека (автоматом воспринял кнопку, как «Ответить»). Прошу прощения у него.

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

              У вас используется старая версия Entware-ng, в которой пакеты и их список уже не обновляются. И пакета dnscrypt-proxy2 там нет (только первая версия). Вам нужно обновить прошивку до последней (Entware-ng было переключено на Entware в прошивке от 10.05.2018, commit 8ec3a10) и заново настроить Entware, удалив предыдущую установку Entware-ng. Пакет dnscrypt-proxy2 появится.
                0
                Спасибо, это я писал)
                Прошивку, видимо, руками нужно собирать обновлённую?
                У Padavan-а на официальной странице последнее обновление аж в 2016.
                https://bitbucket.org/padavan/rt-n56u/wiki/Home
                  0
                  Самая свежая версия от 05.11.2018 (commit 32a93db). Установка стандартная — запускаете PROMETHEUS, обновляете исходный код, собираете прошивку и устанавливаете её. Буквально несколько кликов и минуту времени (не считая несколько десятков минут, зависящие от мощности вашего компьютера, которые будут потрачены на компиляцию прошивки). Всё очень просто.

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

                    Вопрос не по теме — подскажите, пожалуйста, где поискать скрипт автоматического переключения между Wi-Fi сетями в режиме AP-Client (WISP)? Нашёл множество статей по автоматическому переключению между WAN<->3G модемом, а по перебору Wi-Fi сетей ничего толкового нет.
                      0
                      Тема прошивки Padavan очень обширная, ещё есть особенности на разных устройствах, ещё есть особенности ранних версий. Все это напрямую не относится к самой статье. Тема Keenetic тоже обширная, и тоже в своё время была поддержка Entware-ng (и остаётся без переустановки). В общем, достаточно знать, что на свежих прошивках обоих типов устройств всё отрабатывается по инструкции идеально. Кто захочет, найдёт упоминание тут в комментариях.

                      По второму вопросу не подскажу.
                      0
                      Самая свежая версия от 05.11.2018 (commit 32a93db).

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

                      Собирается всё тем же PROMETHEUS, только тестовой версией и на свежих дистрибутивах Linux, в отличие от Padavan.
                  0
                  Слишком геморойно вручную списки наполнять, да и в текущих условиях полезнее весь трафик через vpn пропускать, а белые списки делать не для заблокированных ресурсов, а для тех, куда надо получать доступ напрямую через провайдера. Я так и сделал. Pfsense позволяет все это настроить вообще не заглядывая в консоль, но такие игрушечные роутеры для этого уже не подойдут, нужно железо посерьезнее.
                    0
                    Ещё стоит как-то обрабатывать обращения к адресам из заблокированных диапазонов. Это уберёт приличное количество случаев «домен не числится в реестре, но заблокирован».

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

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

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

                        +1
                        Скрипт
                        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


                        Advanced Settings → LAN → DHCP Server → Custom Configuration File «dnsmasq.conf»:
                        addn-hosts=/tmp/block.hosts

                        Скрипт закинуть, например, в Run After Router Started + придумать его периодический запуск, чтобы подтягивать обновления. Главное, не увлекаться количеством подписок, память не резиновая, да и процессору несладко.

                        Если busybox отказывается качать списки по HTTPS, придётся поставить из Entware полноценный wget и ca-certificates.

                        В OpenWrt, конечно, всё культурнее — там есть пакеты adblock и simple-adblock.
                          0
                          работает, спасибо
                      0
                      спасибо все получилось, только на мобильном устройстве (android) при включенном на роутере ip v6 от провайдера, rutracker ни в какую не открывается, идет «заглушка» от провайдера, отключаю ip v6 — на мобильном начинает работать, (остальные из списка работают), на ПК все норм
                        0
                        Инструкция заточена под IPv4 (под IPv6 требуется доработка). У rutracker есть адрес IPv6 2a02:4680:22::214. Если обратиться к нему, то запрос пойдёт мимо обхода блокировок и будет заблокирован провайдером (если провайдер умеет блокировать IPv6).
                          0

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

                        0
                        del
                          0

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

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

                              Поднимаете сервер с 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 и радуетесь интернету.

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

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

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

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

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

                                        0

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

                              0
                              А не подскажите, как сделать, что бы dnscrypt работал не только для адресов в unblock.txt, а вообще для всей системы?
                                0
                                После того, как настроите 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
                                  Работает! Спасибо.

                                  PS: и главное — решение очевидное-то. :))
                                0
                                На форке Padavn от Linaro Tor уже включен в прошивку. Как это отражается на методике?
                                  0
                                  Используйте эту версию Tor с соответствующим конфигурационным файлом. Или выключите и используйте версию из Entware (как по инструкции).
                                  0
                                  Не знаю, может кому и пригодится — блокировка рекламы и нежелательного контента силами не dnsmasq а через dnscrypt-proxy2. Мне их списки для блокировки понравились.

                                  Сами скрипты находятся здесь: github.com/jedisct1/dnscrypt-proxy/tree/master/utils/generate-domains-blacklists

                                  Скачиваем 6 файлов допустим в папку /opt/etc/dnscrypt/

                                  Для работы generate-domains-blacklist.py понадобиться поставить python и ca-certificates:

                                  /opt/etc/cron.weekly/generate-blacklist

                                  А дальше запускаем скрипт генерации черного списка для блокировки рекламы:

                                  python generate-domains-blacklist.py -i > list.txt.tmp && mv -f list.txt.tmp domains-blacklist.txt

                                  На выфходе получим файл domains-blacklist.txt со списком блокировок.

                                  Далее открываем конфиг dnscrypt и указываем файл для блокировки:

                                  blacklist_file = '/opt/etc/dnscrypt/domains-blacklist.txt'

                                  Что бы иметь возможность отслеживать, что именно блокируем добавляем ещё два значения:

                                  log_file = '/opt/var/log/blocked.log'
                                  log_format = 'tsv


                                  Так же можно и для белого списка:

                                  whitelist_file = '/opt/etc/dnscrypt/domains-whitelist.txt'
                                  log_file = '/opt/var/log/whitelisted.log'
                                  log_format = 'tsv'


                                  PS: Можно ещё автоматизировать процесс. Вместо ручного скачивания файлов и генерации списков.

                                  mcedit /opt/etc/cron.weekly/generate-blacklist

                                  Вставляем скрипт:
                                  ~ # cat get-dnscrypt-files.sh 
                                  #!/opt/bin/sh
                                  
                                  DIR="/opt/etc/dnscrypt"
                                  FILE="generate-domains-blacklist.py"
                                  URL="https://raw.githubusercontent.com/jedisct1/dnscrypt-proxy/master/utils/generate-domains-blacklists"
                                  
                                  # check curl
                                  if [ ! -f "/opt/bin/curl" ]; then
                                  	opkg install curl --force-reinstall
                                  fi
                                  
                                  # check dir
                                  if [ ! -d "$DIR" ]; then
                                  	mkdir -p $DIR
                                  fi
                                  
                                  cd $DIR
                                  
                                  # download files
                                  curl -O $URL/domains-blacklist-all.conf \
                                  	-O $URL/domains-blacklist-local-additions.txt \
                                  	-O $URL/domains-blacklist.conf \
                                  	-O $URL/domains-time-restricted.txt \
                                  	-O $URL/domains-whitelist.txt \
                                  	-O $URL/$FILE
                                  
                                  # fix shebang & make executable
                                  sed -i -e 's,#!.*,#!/opt/bin/python,' $FILE && chmod +x $FILE
                                  
                                  # create blacklist
                                  ./$FILE -i > domains-blacklist.txt
                                  
                                  # restart dnscrypt2
                                  /opt/etc/init.d/S09dnscrypt-proxy2 restart


                                  Автор скрипта — TheBB с форума [forum].[keenetic].[net]

                                  Делаем его исполняемым:

                                  chmod +x /opt/etc/cron.weekly/generate-blacklist

                                  И запускаем:

                                  /opt/etc/cron.weekly/generate-blacklist

                                  Раз в неделю список файлов для блокировки будет сам создаваться с помощью задания в cron.
                                    0
                                    Привет! Настроил на своём Keenetic Giga II всё по инструкции, список сайтов взял из реестра, почистил скриптом от записей с кириллицей и убрал звёздочки: то есть, dig'у ничего мешать не должно. Сайты прекрасно открываются, но возник трабл вот в чём: ssh: connect to host 192.168.1.1 port 222: Connection refused
                                    Сначала грешил на то, что dig крайне неспешен и Entware застрял на инициализации, но нет, всё разблокировалось. Куда копать, чтобы привести в чувство Entware'ный ssh?
                                      0
                                      Во-первых, этот метод не предназначен для того, чтобы взять список из тысяч доменов (например, весь список из реестра заблокированных ресурсов) и разблокировать его. Суть и назначение этого метода в другом. Используйте другой метод для вашей задачи, например, изначальный вариант от Zolg (который используется только dnsmasq и формирует список всех заблокированных ресурсов из реестра; например тут в конце статьи можно прочесть реализацию для Keenetic) или бесплатный OpenVPN АнтиЗапрет.

                                      Во-вторых, с чего вы взяли что unblock_ipset завершил свою работу, разблокировка могла сработать через dnsmasq, а скрипт резолвинга доменов продолжает работать. Хоть он должен делать всё в фоне, но мало ли.

                                      В-третьих, были случаи когда на Keenetic у dropbear в Entware слетает порт. Измените кофигурационный файл dropbear через SMB.
                                        0
                                        Так же словил такой глюк, после удаления из web gui пункта «доступ SSH» стало все на свои места. А именно доступ в busybox на порт 222.
                                        0
                                        Подскажите, как нужно изменить скрипт на 9 шаге для Keenetic, чтобы перенаправлять трафик не в Tor, а в VPN туннель (vpn соединение уже установлено).
                                          0
                                          Дал ответ ниже.
                                          0
                                          Вам необходимо в шаге 9 пометить все пакеты с адресатами из unblock и немного подправить сам скрипт:

                                          #!/bin/sh
                                          
                                          [ "$type" == "ip6tables" ] && exit 0
                                          [ "$table" != "mangle" ] && exit 0
                                          [ -z "$(iptables -t mangle -L | grep unblock)" ] || exit 0
                                          
                                          iptables -w -A PREROUTING -t mangle -m set --match-set unblock dst,src -j MARK --set-mark 1
                                          
                                          exit 0


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

                                          При поднятии интерфейса (нужно сделать скрипт на событие) выполнить команды ($IFNAME — имя интерфейса), которые завернут все пакеты с меткой в нужный интерфейс:

                                          echo 0 > /proc/sys/net/ipv4/conf/$IFNAME/rp_filter
                                          ip route flush table 1
                                          ip rule del table 1
                                          ip rule add fwmark 1 table 1 priority 1000
                                          ip route add default dev $IFNAME table 1

                                          Вот тут есть небольшой пример.

                                          При подключении к VPN обязательно запретить роутить весь трафик через него и запретить получение маршрутов (route-noexec для OpenVPN).

                                          Все ресурсы из unblock.txt будут маршрутизироваться через VPN. Остальные через основной канал. В unblock.txt можно добавить адреса DNS-серверов, чтобы DNS-трафик шёл через VPN, тогда можно не использовать dnscrypt (если провайдер фильтрует DNS-трафик).
                                            0
                                            Не понимаю, мозгов не хватает. Ни как не получается на VPN отправить. Через тор все идет нормально. А вот с этим засада. Сам скрипт должен полностью выглядить так как Вы указали выше, или надо какие-то строки от скрипта заворачивающего все в ТОР оставить? Где и как должен быть назван скрипт на событие при поднятии интерфейса? Можно вас попросить полностью указать его содержимое и где он должен находиться? Буду признателен. Извиняюсь за нубство.
                                              0
                                              Основное направление и ключевые изменения я подсказал. Вы просите детальный ответ с пошаговой инструкцией. Я не смогу, к сожалению, вам его дать, т.к. для этого нужно всё смоделировать у себя и вам описать (это требует времени, возможности и желания).
                                                0
                                                Понял. Буду пробовать дальше. Спасибо.
                                            0
                                            Роскомнадзор опять публично буянит и по распоряжению сверху, грозится заблокировать сайт BBC (обиделись). Но вы знаете, что делать, в час X, если этот сайт вам нужен:

                                            1). Добавили в unblock.txt сайт bbc.com.
                                            2). Ввели unblock_update.sh.
                                              0

                                              не проще ли поменять оператора на того, у кого всё пашет? Ну, или сразу весь трафик зарулить через туннель...

                                                0

                                                Не проще.

                                                  0
                                                  А что это за провайдеры, которые забили на требования РКН?
                                                    0

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

                                                0
                                                Для желающих сделал установку на Keenetic с помощью пары команд. ВНИМАНИЕ: Работу этого скрипта на реальном устройстве я пока не проверял (только написал его), не было времени. Если что-то не будет работать, я не виноват. Позже проверю и дополню комментарий.

                                                Загрузите скрипт установки:
                                                opkg install wget ca-certificates
                                                wget --no-check-certificate -O /opt/bin/unblock_keenetic.sh https://raw.githubusercontent.com/Kyrie1965/unblock_keenetic/master/unblock_keenetic.sh
                                                chmod +x /opt/bin/unblock_keenetic.sh

                                                Установка (автоматическое выполнение шагов 1-12):
                                                unblock_keenetic.sh

                                                После автоматической перезагрузки маршрутизатора для реализации «Дополнительный обход фильтрации DNS-запросов провайдером» (если вам это нужно) выполните команду:
                                                unblock_keenetic.sh dnscrypt

                                                Удаление обхода блокировок:
                                                unblock_keenetic.sh remove

                                                Содержимое unblock_keenetic.sh.
                                                  0
                                                  Проверил ваш скрипт установки на KN-1010 — работает! Но автоматической перезагрузки после установки unblock_keenetic.sh не было. Или ее не должно было быть?
                                                    0
                                                    Должна быть. В конце есть команда:
                                                    ndmq -p 'system reboot'

                                                    Потом посмотрю, почему не перезагружается.
                                                    0
                                                    В процессе эксплуатации кинетика, заметил особенность работы данного скрипта. В домашнем сегменте (192.168.1.0/24) всё работает, а для клиентов гостевой — нет (создал гостевую сеть 192.168.2.0/24). Подскажите, пожалуйста, какие нужно внести изменения в скрипт, чтобы он заработал и для гостевой сети?
                                                      0
                                                      В файле /opt/etc/ndm/netfilter.d/100-redirect.sh
                                                      После строки
                                                       iptables -w -t nat -A PREROUTING -i br0 -p tcp -m set --match-set unblock dst -j REDIRECT --to-port 9141
                                                      добавьте строку
                                                       iptables -w -t nat -A PREROUTING -i br1 -p tcp -m set --match-set unblock dst -j REDIRECT --to-port 9141
                                                        0
                                                        Добавил. Перезапустил скрипт командой «unblock_update.sh». Безрезультатно. Может быть надо перезапускать другой командой или ребутнуть роутер?
                                                        А после строки
                                                        iptables -w -t nat -I PREROUTING -i br0 -p udp --dport 53 -j DNAT --to 192.168.1.1

                                                        не надо добавлять
                                                        iptables -w -t nat -I PREROUTING -i br1 -p udp --dport 53 -j DNAT --to 192.168.1.1

                                                        ???
                                                          0
                                                          В терминале введите ifconfig, там увидите сетевые адаптеры и соответствующие им ip, если br1 соответствует вашей гостевой сети(192.168.2.*), то введите прямо в терминале команду, которую добавляли. Результат должен быть сразу
                                                            0
                                                            ip соответствующие гостевой сети, команду вводил. Не фурычит.
                                                              0
                                                              Проверяете с пк/ноута? Если да, то в командной строке ipconfig /flushdns и в браузере ctrl+f5 на нужном сайте
                                                                0
                                                                И с пк и с ноута и с ведроида. ipconfig /flushdns сразу пробовал, после редактирования файла и потом тоже. Толку 0. Ладно, оставлю вопрос до завтра. Пойду спать.
                                                    0
                                                    В очередной раз полез с телефона в домашней сети на кинозал.тв и получил РКН)
                                                    Всякие орботы и впн на телефоне не хотелось запускать.
                                                    И дай, думаю, загуглю, может есть какой-то годный мануал для обхода блокировок на кинетике. И попал сюда.
                                                    В общем — спасибо! Все отлично работает.
                                                      0
                                                      Пожалуйста.
                                                      0
                                                      Добавил в конце поста ответы на два самых распространённых вопроса, которые приходят через личные сообщения:
                                                      Как сделать доступными сайты доменной зоны .onion?
                                                      Как сделать обход блокировок для клиентов VPN-сервера, запущенного на маршрутизаторе?
                                                        0

                                                        подскажите попробовал обновиться на новую версию keenetic os 3.00.A.2.0-1 и после этого получаю такие ошибки:
                                                        ~ # unblock_update.sh
                                                        /opt/etc/init.d/S56dnsmasq: /opt/etc/init.d/rc.func: line 101: can't create /dev/null: Permission denied


                                                        в логах роутера такое:
                                                        Апр 11 21:19:00
                                                        ndm
                                                        Opkg::Manager: /opt/etc/ndm/netfilter.d/100-redirect.sh: /opt/etc/ndm/netfilter.d/100-redirect.sh: line 10: can't create /dev/null: Permission denied.
                                                        Апр 11 21:19:01
                                                        ndm
                                                        Opkg::Manager: /opt/etc/ndm/netfilter.d/100-redirect.sh: /opt/etc/ndm/netfilter.d/100-redirect.sh: line 14: can't create /dev/null: Permission denied.

                                                          0
                                                          Какие-то проблемы доступа к /dev/null. Это плохо и это проблемы прошивки.
                                                            0
                                                            Проблема в следующем — после установки данного скрипта, меняется владелец /dev/null с root на nobody:
                                                            ~ # ls -l /dev/null
                                                            crw-rw-rw-    1 nobody   root        1,   3 Jan  1  1970 /dev/null

                                                            Я решил проблему так:
                                                            1. Открыл в текстовом редакторе файл /opt/etc/dnsmasq.conf:
                                                            ~ # mcedit /opt/etc/dnsmasq.conf

                                                            2. Изменил строку user=nobody на user=root, сохранил(нажал F2) и закрыл файл(нажал F10).
                                                            3. Вернул владельца на root:
                                                            ~ # chown -R root:root /dev/null

                                                            4. Перезапустил dnsmasq:
                                                            ~ # /opt/etc/init.d/S56dnsmasq restart

                                                            ~ # ps | grep dnsmasq
                                                             7469 root      3096 S    dnsmasq
                                                             9000 root      4788 S    grep dnsmasq

                                                            Ошибок пока не наблюдается. Подробнее разбирается на форуме Кинетика, в соответствующей теме:
                                                            forum.keenetic.net/topic/6500-ошибка-devnull-permission-denied/#comment-74798
                                                              0
                                                              Убрал log-facility=/dev/null в dnsmasq.conf.
                                                            0
                                                            del
                                                            0
                                                            подскажите по доступу к сайтам доменной зоны .onion, добавил соответствующие строки в конфиги, но сайты не открываются, у меня настроен dnscrypt-proxy. в инструкции порт указан для .onion 9053, пробовал ставить 9153, но сайты также недоступны, что нужно еще сделать (keenetic)? хотя команда выдает, что:
                                                            dig +short godnotabatovgyqz.onion @localhost -p 9153
                                                            10.126.232.31

                                                            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                                            Самое читаемое