Jump to content
b1st

Обход блокировок на роутере!

273 posts in this topic

Начиная с версии 2.13.A.3.0-1 в ядре появилась поддержка NFQUEUE и стало возможно использовать наработки от bol-van. Делюсь своим вариантом настройки с нуля.

Устанавливаем компоненты системы (через веб интерфейс) :

  1. Протокол IPv6. Поддержка открытых пакетов. Перезагрузка.
  2. Подключаем entware. Модули ядра подсистемы Netfilter. Перезагрузка.
  3. Пакет расширения Xtables-addons для Netfilter. Перезагрузка.

Далее работаем по ssh:

ssh root@192.168.1.1

Ставим необходимые пакеты:

opkg install ipset curl bind-tools iptables cron nano

Для того чтобы можно было пользоваться crontab -e в /opt/etc/profile добавляем строку (это не обязательно):

export EDITOR='/opt/bin/nano'

В файле /opt/etc/init.d/S10cron вместо ARGS="-s" оставляем просто ARGS="" иначе в логах будет мусор каждую минуту.

Скачиваем и распаковываем anti-zapret:

curl -L https://github.com/bol-van/zapret/archive/master.zip -o zapret.zip
unzip ./zapret.zip -d /opt
mv /opt/zapret-master/ /opt/zapret 
find /opt/zapret/ipset/ -name *.sh -print0 | xargs -0 chmod +x

Копируем бинарные версии nfqws и tpws соответствующие нашей архитектуре (можно просто позапускать версии из разных папок и посмотреть что заработает)

cp /opt/zapret/binaries/mips32r1-lsb/nfqws /opt/zapret/nfq/nfqws
chmod +x /opt/zapret/nfq/nfqws
cp /opt/zapret/binaries/mips32r1-lsb/tpws  /opt/zapret/tpws/tpws
chmod +x /opt/zapret/tpws/tpws

Инициализирующий скрипт я изначально брал от debian версии, но так изменений получилось много то проще скачать форкнутую версию чем править оригинал:

curl https://raw.githubusercontent.com/LukyanovM/zapret/master/init.d/keenetic/S99zapret -o /opt/etc/init.d/S99zapret
chmod +x /opt/etc/init.d/S99zapret

На что нужно здесь обратить внимание:

  1. По умолчанию используется профиль для РТК.
  2. Появилась переменная BLACKHOLE, для которой нужно указать адрес заглушки провайдера. Правило отсева заглушки задействованно только в профиле для РТК.
  3. Скрипт автоматом загружает ядерный модуль iptable_raw.ko. Без него работать не будет.
  4. Из скрипта вынесена вся логика по парсингу выгрузки из РКН. Вместо этого он использует готовый айписет. Иначе при загрузке системы ndm убивает всю группу OPKG по таймауту (это на keenetic viva, на других моделях не проверял).

Кратко о логике самой программы. Чтобы выбирать профили и методы противодействия нужно хорошо понимать с чем боремся - хороший анализ даст BlockCheck. DPI у РТК и Билайна пропускает сегментированные начальные пакеты, здесь достаточно использовать nfqws (как наиболее быстрый) с опцией --wsize (начальный размер пакета). Модифицируются только пакеты предназначенные для заблокированных сайтов, остальной трафик остаётся чистым. Именно для этих целей нужна выгрузка из РКН.

Включаем сохранение готовых айписетов, для этого в конец файла /opt/zapret/ipset/create_ipset.sh добавляем строку:

ipset save zapret -f /opt/zapret/ipset/zapret.ipset

Прежде чем ворочать выгрузками из РКН создаём тестовый айписет, в файл  /opt/zapret/ipset/zapret-hosts-user.txt добавляем строчки:

rutracker.org
kinozal.tv

Генерируем пользовательский айписет:

/opt/zapret/ipset/get_user.sh

Делаем пробный запуск:

/opt/etc/init.d/S99zapret start

Если всё хорошо, то в консоли должно быть примерно так:

Checking iptable_raw.ko kernel module
iptable_raw.ko loaded
Restoring ipset
Adding iptables rule
Starting anti-zapret: zapret.

На данном этапе за роутером должны заработать рутрекер и кинозал. Если тут всё нормально, можно приступать к выгрузке из РКН. Для этой цели есть два скрипта: get_reestr.sh и get_antizapret.sh. Первый берет оригинал реестра и парсит его в айпи самостоятельно - нагрузка низкая, но парсить может сутками. Второй берет готовый список айпи с antizapret.prostovpn.org, отрабатывает за полминуты. Я использовал второй вариант:

/opt/zapret/ipset/get_antizapret.sh

Cейчас за роутером должно заработать всё. Осталось только вставить в cron актуализацию выгрузки:

cp /opt/zapret/ipset/get_antizapret.sh /opt/etc/cron.daily/get_antizapret.sh

Правим cron скрипт /opt/etc/cron.daily/get_antizapret.sh:

Строку 

SCRIPT=$(readlink -f $0)

удаляем, а строку

EXEDIR=$(dirname $SCRIPT)

меняем на 

EXEDIR=/opt/zapret/ipset

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

/opt/etc/init.d/S99zapret stop

UPD: Если протокол HTTPS так и не заработал можно настроить прозрачное проксирование через тор или пустить заблокированный трафик через штатный openvpn.

Edited by Михаил Лукьянов
Дополнение про tor
  • Thanks 5
  • Upvote 2

Share this post


Link to post
Share on other sites
В 26.09.2018 в 18:18, Nuck-TH сказал:

И как быть с HTTPS? NDM вроде как постоянно перезаписывает таблицу NAT, да и моего понимания работы сетевых интерфесов не хватает, чтобы переписать правила iptables под местные условия :(

С HTTPS вариантов немного - tor, прокси и vpn. С tor всё оказалось просто. Так как не нужно прозрачное проксирование на прикладном уровне (что умеет только squid с peek&slice), то достаточно просто инкапсуляции одного транспортного протокола в другой (TLS в SOCKS5). С этой задачей легко справляется tor+redsocks:

opkg install redsocks tor

Что поменять в дефолтном /opt/etc/tor/torrc:

Log notice syslog
RunAsDaemon 1
DataDirectory /opt/var/lib/tor

Что поменять в дефолтном /opt/etc/redsocks.conf:

в секции base:

log_info = off;
log = "syslog:local7";
daemon = on;
redirector = iptables;

в секции redsocks:

local_ip = 192.168.1.1;
local_port = 8888;
ip = 127.0.0.1;
port = 9050;
type = socks5;

В скрипт S99zapret добавлено правило для перенаправления запрещенного HTTPS трафика в redsocks, скрипт нужно перекачать с гитхаба. Для того чтобы NDM не сбрасывало правило в таблице nat нужно создать следующий файл /opt/etc/ndm/netfilter.d/redsocks.sh:

#!/opt/bin/sh
[ "$type" == "ip6tables" ] && exit 0
[ "$table" != "nat" ] && exit 0   # check the table name
iptables -t nat -I PREROUTING -p tcp --dport 443 -m set --match-set zapret dst -j REDIRECT --to-port 8888
/opt/bin/logger "redsocks redirected https rule created for zapret via netfilter hook"

не забыть конечно:

chmod +x /opt/etc/ndm/netfilter.d/redsocks.sh

Проверяем:

/opt/etc/init.d/S35tor start
/opt/etc/init.d/S23redsocks start
/opt/etc/init.d/S99zapret stop
/opt/etc/init.d/S99zapret start

Что интересно у меня https://2ip.ru/ и https://yandex.ru/internet/ часто показывают выход через tor, а не напрямую. Видимо какой-то не тот диапазон IP попал в реестр:(

Edited by Михаил Лукьянов
  • Thanks 3

Share this post


Link to post
Share on other sites
2 часа назад, Сергей «Solaris» Сидоров сказал:

Мне не повезло, провайдер не пропускает и фрагментированные пакеты вообще. А сработает ли вариант если  пустить и HTTP и HTTPS через tor, дополнив ваш скрипт строкой для  80 порта? типа такого.

Для тех у кого не работает фрагментация в скрипте нужно выбирать ACTION=modification, это правда пока работает только для HTTP трафика. TOR снижает скорость - так бы все уже давно в него завернулись и не вылазили.

  • Thanks 1

Share this post


Link to post
Share on other sites
1 час назад, Dmitry Soloviev сказал:

Добрый день.

Результаты проверки blockcheck с компьютера.

  Показать содержимое

BlockCheck v0.0.9.6
Для получения корректных результатов используйте DNS-сервер провайдера и отключите средства обхода блокировок.

Проверка работоспособности IPv6: IPv6 недоступен.
[O] Тестируем IPv4 DNS
    Через системный DNS:     ['104.20.134.45', '104.20.135.45', '104.24.10.70', '104.24.11.70', '184.173.136.161', '195.8.215.136', '195.82.146.214', '5.178.68.100']
    Через Google DNS:     ['104.20.134.45', '104.20.135.45', '104.24.10.70', '104.24.11.70', '184.173.136.161', '195.8.215.136', '195.82.146.214', '5.178.68.100']
    Через Google API:     ['104.20.134.45', '104.20.135.45', '104.24.10.70', '104.24.11.70', '184.173.136.161', '195.8.215.136', '195.82.146.214', '5.178.68.100']
    Через недоступный DNS:     ['195.82.146.214']
[?] DNS-записи не подменяются
[?] DNS перенаправляется

[O] Тестируем HTTP (по настоящим IP-адресам сайтов)
    Открываем http://pbooru.com/
[?] Сайт открывается
    Открываем http://pbooru.com/index.php?page=post&s=view&id=303026
[?] Получен неожиданный ответ, скорее всего, страница-заглушка провайдера. Пробуем через прокси.
[?] Сайт открывается через прокси
    Открываем http://furry.booru.org/
[?] Сайт открывается
    Открываем http://rutracker.org/forum/index.php
[?] Сайт не открывается, пробуем через прокси
[?] Сайт открывается через прокси
    Открываем http://furry.booru.org/index.php?page=post&s=view&id=111173
[?] Получен неожиданный ответ, скорее всего, страница-заглушка провайдера. Пробуем через прокси.
[?] Сайт открывается через прокси
    Открываем http://a.putinhuylo.com/
[?] Сайт открывается

[O] Тестируем HTTPS
    Открываем https://www.dailymotion.com/
[?] Сайт не открывается
    Открываем https://lolibooru.moe/
[?] Сайт не открывается
    Открываем https://e621.net/
[?] Сайт не открывается
    Открываем https://rutracker.org/forum/index.php
[?] Сайт не открывается

[O] Тестируем обход DPI
    Пробуем способ «табуляция в конце домена» на rutracker.org
[?] Ошибка: timeout('timed out',)
    Пробуем способ «необычный порядок заголовков» на rutracker.org
[?] Ошибка: timeout('timed out',)
    Пробуем способ «фрагментирование заголовка, hoSt и отсутствие пробела одновременно» на rutracker.org
[?] Ошибка: timeout('timed out',)
    Пробуем способ «фрагментирование заголовка» на rutracker.org
[?] Ошибка: timeout('timed out',)
    Пробуем способ «отсутствие пробела между двоеточием и значением заголовка Host» на rutracker.org
[?] Ошибка: timeout('timed out',)
    Пробуем способ «дополнительный пробел после GET» на rutracker.org
[?] Ошибка: timeout('timed out',)
    Пробуем способ «перенос строки перед GET» на rutracker.org
[?] Ошибка: timeout('timed out',)
    Пробуем способ «заголовок hoSt вместо Host» на rutracker.org
[?] Ошибка: timeout('timed out',)
    Пробуем способ «заголовок hOSt вместо Host» на rutracker.org
[?] Ошибка: timeout('timed out',)
    Пробуем способ «значение Host БОЛЬШИМИ БУКВАМИ» на rutracker.org
[?] Ошибка: timeout('timed out',)
    Пробуем способ «точка в конце домена» на rutracker.org
[?] Ошибка: timeout('timed out',)
    Пробуем способ «перенос строки в заголовках в UNIX-стиле» на rutracker.org
[?] Ошибка: timeout('timed out',)
    Пробуем способ «табуляция в конце домена» на pbooru.com
[?] Сайт не открывается
    Пробуем способ «необычный порядок заголовков» на pbooru.com
[?] Сайт не открывается
    Пробуем способ «фрагментирование заголовка, hoSt и отсутствие пробела одновременно» на pbooru.com
[?] Сайт открывается
    Пробуем способ «фрагментирование заголовка» на pbooru.com
[?] Сайт не открывается
    Пробуем способ «отсутствие пробела между двоеточием и значением заголовка Host» на pbooru.com
[?] Сайт открывается
    Пробуем способ «дополнительный пробел после GET» на pbooru.com
[?] Сайт не открывается
    Пробуем способ «перенос строки перед GET» на pbooru.com
[?] Сайт открывается
    Пробуем способ «заголовок hoSt вместо Host» на pbooru.com
[?] Сайт не открывается
    Пробуем способ «заголовок hOSt вместо Host» на pbooru.com
[?] Сайт не открывается
    Пробуем способ «значение Host БОЛЬШИМИ БУКВАМИ» на pbooru.com
[?] Сайт не открывается
    Пробуем способ «точка в конце домена» на pbooru.com
[?] Сайт не открывается
    Пробуем способ «перенос строки в заголовках в UNIX-стиле» на pbooru.com
[?] Сайт не открывается

[!] Результат:
[?] Ваш провайдер перенаправляет сторонние IPv4 DNS-серверы на свой, но не подменяет DNS-записи.
 Это несколько странно и часто встречается в мобильных сетях.
 Если вы хотите использовать сторонний DNS, вам следует использовать шифрованный канал до DNS-серверов, например, через VPN, Tor, HTTPS/Socks прокси или DNSCrypt, но обходу блокировок это не поможет.
[?] Ваш провайдер полностью блокирует доступ к HTTPS-сайтам из реестра.
[?] У вашего провайдера "обычный" DPI. Вам поможет HTTPS/Socks прокси, VPN или Tor.
 

Правильно ли я понимаю, чтобы заработал обход блокировок по инструкции от @Михаил Лукьянов, требуется изначально разобраться с DNS запросами, например через DNSCrypt?

Нет. Blockcheck тесты обхода DPI проводит по своей базе IP адресов - если нет ни одного метода обхода блокировок то ни goodbyedpi ни antizapret работать не будут (с DNSCrypt или нет - неважно). Для вас только тор и VPN. А что за провайдер?

Edited by Михаил Лукьянов
  • Thanks 1

Share this post


Link to post
Share on other sites
59 минут назад, Михаил Лукьянов сказал:

Нет. Blockcheck тесты обхода DPI проводит по своей базе IP адресов - если нет ни одного метода обхода блокировок то ни goodbyedpi ни antizapret работать не будут (с DNSCrypt или нет - неважно). Для вас только тор и VPN. А что за провайдер?

Провайдер малоизвестный - Мортон Телеком. Но, к сожалению, альтернативы подключения проводного интернета кроме него нет.

Придется значит TOR пробовать.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×