Прозрачный обход блокировок padavan

Содержание

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

Инструкций с разными вариантами обхода блокировок Интернет-ресурсов опубликовано огромное количество. Но тема не теряет актуальности. Даже всё чаще звучат инициативы на законодательном уровне заблокировать статьи о методах обхода блокировок. И появились слухи, что Роскомнадзор получит ещё одну пачку денег налогоплательщиков на «более лучшие» блокировки. Опытные пользователи ничего нового и полезного из статьи не узнают. А вот другие получат готовые пошаговые инструкции для простого и эффективного выборочного обхода блокировок на популярных маршрутизаторах с прошивкой 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. Одна строка — один элемент. Допускаются пустые строки, и можно использовать символ # в начале строки для игнорирования.

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

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

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

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

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

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

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:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Скрипт достаточно простой. Ждём, когда заработает резолвинг домена 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:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Скрипт достаточно простой. Ждём, когда заработает резолвинг домена 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:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Источник

Adblock
detector