Обход замедления YouTube и блокировок на прошивке Keenetic с помощью nfqws / tpws (zapret)

Если у роутера Keenetic нет USB-порта, то инструкция вам не подойдёт.
(долбите техподдержку Keenetic, чтобы они реализовали возможность развернуть Entware на внутренней памяти при отсутствии USB-порта)

Если у вас прошивка версии 3.0 или новее, обязательно установите компонент «Модули ядра подсистемы Netfilter» (веб-интерфейс управления роутером → Параметры системы → Показать компоненты). Если вы не видите этот компонент в списке дсступных, то, возможно, сначала нужно установить компонент “Поддержка IPv6”.

Если у вас прошивка версии 2.08 или старее, то нужно обновиться, потому что модули Netfilter появились лишь в версии 2.09.

Что это?

Модификация трафика с помощью утилит, разработанных в рамках проекта zapret, таким образом, что оборудование Роскомнадзора и провайдера не может корректно разобрать ваш трафик и осуществить цензуру.

nfqws

Автоматическая установка (теоретически, кроме YouTube может разблокировать доступ к прочим заблокированным сайтам).

В ядре KeeneticOS есть баг, приводящий к утечке памяти при использовании nfqws. Предположительно, баг будет исправлен в прошивке 4.2 beta 3.

tpws

tpws имеет смысл пробовать, только если не устраивает работа nfqws

Автоматическая установка (теоретически, кроме YouTube может разблокировать доступ к прочим заблокированным сайтам). В отличие от описанной ниже ручной установки поддерживает работу на нескольких интерфейсах, что позволяет, например, настроить обход замедления и блокировок для клиентов, подключённых к VPN-серверу роутера.

Если проблемы с доступом к YouTube сохраняются на подключённых к роутеру устройствах Android, заблокируйте на роутере трафик QUIC

Межсетевой экран → Домашняя сеть → Добавить правило
Включить правило: Включено
Описание: Блокировать QUIC
Действие: Запретить
Протокол: UDP
Номер порта назначения: Равен 443
Остальные параметры оставляем без изменений

Если нужно заблокировать QUIC в других сегментах (например#, в гостевой сети), то создайте там аналогичное правило.

Если в системном журнале возникают ошибки, связанные с iptables

Установите компонент «Модули ядра подсистемы Netfilter» (веб-интерфейс управления роутером → Параметры системы → Показать компоненты).

Если в системном журнале возникают ошибки, связанные с ip6tables и ваш провайдер не поддерживает IPv6
Игнорируйте их или отключите поддержку IPv6 в файле /opt/etc/nfqws/nfqws.conf (или /opt/etc/tpws/tpws.conf):

IPV6_ENABLED=0
Устаревшее: Ручная установка (менее продвинутый вариант, оставлен здесь по историческим причинам)
  1. Обязательно устанавливаем компонент «Модули ядра подсистемы Netfilter» (веб-интерфейс управления роутером → Параметры системы → Показать компоненты).

  2. Разворачиваем Entware на внутреннем или внешнем накопителе. При разворачивании запоминаем, как назывался архив, который поместили на роутер (mips, mipsel, aarch64).

Доходим в инструкции до команды opkg update, выполняем её и ставим необходимые пакеты:

opkg install ipset curl gzip grep iptables nano
  1. Скачиваем утилиту tpws: вспоминаем, как назывался архив при разворачивании Entware, в зависимости от этого выполняем команду.
  • mips:
curl https://raw.githubusercontent.com/bol-van/zapret/master/binaries/mips32r1-msb/tpws -o /opt/usr/bin/tpws
  • mipsel:
curl https://raw.githubusercontent.com/bol-van/zapret/master/binaries/mips32r1-lsb/tpws -o /opt/usr/bin/tpws
  • aarch64:
curl https://raw.githubusercontent.com/bol-van/zapret/master/binaries/aarch64/tpws -o /opt/usr/bin/tpws

Делаем бинарник tpws исполняемым:

chmod +x /opt/usr/bin/tpws
  1. Создаём скрипт инициализацции:
nano /opt/etc/init.d/S51tpws

Открывается редактор текста, туда вставляем:

#!/bin/sh

SCRIPT=/opt/usr/bin/tpws
PIDFILE=/opt/var/run/tpws.pid
ARGS="--daemon --bind-addr 192.168.1.1 --port 999 --disorder --tlsrec=sni --split-pos=2 --hostlist=/opt/etc/zapret-hosts-user.txt --pidfile $PIDFILE"

start() { 
  if [ -f $PIDFILE ] && kill -0 $(cat $PIDFILE); then
    echo 'Service TPWS is already running' >&2
    return 1
  fi
  $SCRIPT $ARGS
  iptables -t nat -A PREROUTING -i br0 -p tcp --dport 443 -j REDIRECT --to-port 999
  echo 'Started TPWS service'
}

stop() {
  iptables -t nat -D PREROUTING -i br0 -p tcp --dport 443 -j REDIRECT --to-port 999
  if [ ! -f "$PIDFILE" ] || ! kill -0 $(cat "$PIDFILE"); then
    echo 'Service TPWS is not running' >&2
    return 1
  fi
  echo 'Stopping TPWS service...'
  kill -15 $(cat "$PIDFILE") && rm -f "$PIDFILE"
}

status() {
  if [ -f $PIDFILE ] && kill -0 $(cat $PIDFILE); then
    echo 'Service TPWS is running'
  else
    echo 'Service TPWS is stopped'
  fi
}

case "$1" in
  start)
    start
    ;;
  stop)
    stop
    ;;
  status)
    status
    ;;
  restart)
    stop
    start
    ;;
  *)
    echo "Usage: $0 {start|stop|restart|status}"
esac

Сохраняем (Ctrl+X, в ответ на вопрос о сохранении нажимаем Y, в ответ на вопрос об имени файла нажимаем Enter).

Делаем скрипт исполняемым:

chmod +x /opt/etc/init.d/S51tpws
  1. Учим Keenetic не забывать правила. Создаём скрипт:
nano /opt/etc/ndm/netfilter.d/100-tpws.sh

Открывается редактор текста, туда вставляем:

#!/bin/sh

if [ ! -f /opt/var/run/tpws.pid ] || ! kill -0 $(cat /opt/var/run/tpws.pid); then
    exit
fi

[ "$type" == "ip6tables" ] && exit
[ "$table" != "nat" ] && exit

if [ -z "$(iptables-save 2>/dev/null | grep 999)" ]; then
    iptables -t nat -A PREROUTING -i br0 -p tcp --dport 443 -j REDIRECT --to-port 999
fi

Сохраняем (Ctrl+X, в ответ на вопрос о сохранении нажимаем Y, в ответ на вопрос об имени файла нажимаем Enter).

192.168.1.1 — адрес вашего роутера в локальной сети. Если он у вас другой, то соответственно скорректируйте в скрипте.

Делаем скрипт исполняемым

chmod +x /opt/etc/ndm/netfilter.d/100-tpws.sh
  1. Добавляем в /opt/etc/zapret-hosts-user.txt домен googlevideo.com:
echo googlevideo.com > /opt/etc/zapret-hosts-user.txt
  1. Запускаем TPWS:
/opt/etc/init.d/S51tpws start

Если вы хоите всё удалить и вернуть как было, то в веб-интерфейсе роутера в разделе настроек OPKG выставьте «Накопитель: не выбран», а также удалите правила, созданные на шаге 8.

Что можно улучшить (TODO):

  • (сделано) При остановке init-скрипта убивать правила файерволла, даже если TPWS не запущен (мало ли, вдруг его кто-то раньше укокошил)
  • (сделано) В 100-tpws.sh переместить проверку на запущенность TPWS в начало скрипта (если он не запущен, то нет смысла делать прочие проверки)
  • (сделано) Убрать правила для 80 порта (ютуб не работает по HTTP)
  • (сделано) Добавить ограничение по домену (чтобы применять дурение только к ютубу)
  • (сделано) Добавить правила для блокировки QUIC
  • (сделано) Потестировать не только ручной, но и автоматический запуск при запуске роутера
  • (сделано) Возможно, собрать пакет, чтобы всё ставилось одной командой из Entware