:(
:(

Всех категорический приветствую. Буквально первого августа, прямо в ночь, стал у меня жутко лагать YouTube. Естественно, мне это сильно не понравилось. Ну, что же, давайте разбираться, почему и как это исправить в условиях моей личной сети.

Что случилось?
Хорошо описано произошедшее здесь, на хабре - https://habr.com/ru/articles/832678/
Если совсем кратко, своими словами - во время установки SSL соединения в открытом виде домен передается к которому мы подключаемся(так называемое SNI). И если это googlevideo.com то начинают твориться "интересные вещи". Можно проверить это локально коммандами из статьи.

$ curl https://speedtest.selectel.ru/100MB -o/dev/null

В терминале моего ноутбука
В терминале моего ноутбука

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

$ curl --connect-to ::speedtest.selectel.ru https://manifest.googlevideo.com/100MB -k -o/dev/null

В терминале моего ноутбука
В терминале моего ноутбука

Вот и всё, приплыли...

Что делать?
Очевидно, что нас режут по домену с помощью DPI. Уже существуют довольно известные проекты, типа Goodbye DPI. Но он под венду, коей у меня дома вообще нету, да и требует установки на единичный компьютер и не позволяет вылечить всю мою домашнюю сеть. Спасибо автору, прямо в ридми он собрал список проектов делающие аналогичные трюки под другие операционки. Вся суть этих проектов, в том, что бы как то извратить передаваемую в открытом виде строку домена. Если совсем просто объяснять на пальцах, то в случае открытого HTTP запроста поменять заголовок Host например вот так:

Host: googlevideo.com
vs
hoSt:googlevideo.com  # поменян регистр и убран пробел

И те, странные штуковины, творящие чудные вещи, не смогут считать корретно проанализировать трафик и что-то сделать. В случае TLS подключения, я так понял, что просто берется TLS пакет и бьется на несколько TCPшных, так, чтобы части строки с доменом находились в разных TCP пакетах. И заодно меняют порядок TCP пакетов, сначала конец, потом начало шлют. Сам протокол TCP это дозволяет и на конечном сервере все будет работать корректно. А вот чудесные железки слишком глупы и их авторы явно спек не читали. Вот такое вот милое соревнование.

Мне же, напомню, хотелось вылечить всю мою домашнюю сеть, а для этого сделать это нужно прямо на роутере. Роутер у меня Zyxel Keenetic Giga III, которому уже наверное лет десять... Keentic уже стал отдельным брендом без Zyxel, а роутер у меня все это время работал как часы. Я начал думать обновиться и купить какой нибудь роутер, на который можно было бы поставить OpenWrt. Мануал далее валиден для любого роутера под линуксом имеющий iptables и init.d.

Почитав немного, какого же оказалось мое удивление, что на довольно таки закрытый Zyxel можно поставить набор бинарей линукса и менеджер пакетов OPKG от OpenWrt. Роутер был довольно дорогим, не зря я за него деньги отдавал, спустя столько лет он смог меня удивить. Пару абзацев далее - можно пропустить, если у вас не Keentic. Сейчас мы будем запускать OPKG на моем роутере. Вообще есть целый мануал от производителя как это делать. Я опишу очень кратко.

Для начало надо будет зайти в веб интерфейс и доставить все компненты OPKG.

UI роутера где доставляем компоненты родной прошивки
UI роутера где доставляем компоненты родной прошивки

Внутренней памяти, как водится обычно, в таких устройствах - кот наплаках, с трудом под прошивку. Не беда. Берем USB флешку, форматируем в EXT4. В корне делаем директорию install и кладем набор бинерей с оффсайта(точнее по ссылке на проект entware с официальной документации). В моем случае под платформу mipsel - https://bin.entware.net/mipselsf-k3.4/installer/EN_mipsel-installer.tar.gz Побродив по https://bin.entware.net/ можно найти аналогичный интсаллер для ARM или mips на bigendian, если у вас какой то хитрый keenetic. Далее, втыкаем флешку в роутер, если все хорошо, роутер сам развернет и удалит архив. А мы сможем подключиться по ssh на порт 222.

Кстати, если вы ошибетесь в платформе, лучше просто идите на ssh роутера на 22 порту и пробуйте в консоле exec sh .

Если не та платформа - будет четко видна ошибка. Я сразу не понял какой у меня проц, пришлось перебирать.

Если файл есть и не для той платформы - то exec format error. Если файла нет, то четко пишет что нету.
Если файл есть и не для той платформы - то exec format error. Если файла нет, то четко пишет что нету.

Пароль для входа по ssh на 22 такой же как веб интерфейсе. На 222 логин пароль - root/keenetic. После первого входа не забываем сделать passwd и поменять пароль. Если все удалось, то либо через ssh подключение на 222 порт, либо через exec sh мы наконец то получаем почти полноценный линукс на зюкселе. Ура! И огромное спасибо производителю за эту фишку.

А вот мы и на роутере, в линуксе
А вот мы и на роутере, в линуксе

Ну а теперь часть общая для роутеров с OpenWrt или аналогичным линуксом. Все что нам осталось сделать, это поставить софтину, которая будет крутить-вертеть и хотеть обмануть TCP пакеты и завернуть весь трафик на эту софтину. Софта навалом такого. Для начала давайте сразу поставим что нам может потребоваться, в моем случае:

# opkg update
# opkg install ipset curl gzip grep git-http gcc make cmake

Если у вас мало места - можете ничего не ставить. Через scp можете закинуть бинарь и все.

Теперь я начал выбирать проект, что запуститься. Мне довольно понравился вот этот. Просто потому, что он с пол пинка собрался из сырцов прям на роутере, запустился и заработал. Но, к сожалению, он дает только SOCKS прокси и настраивать каждое устройство в домашней сети у меня никакого желания нету. Лезем дальше, нашелся проект zapret. Выглядит очень здорово, но его автоматические скрипты установки начали слишком много ошибок писать, больше того, в чем я готов разбираться и доставить проект штатно. Да и код скриптов тоже сложноват. Ну да ладно, беглое прочтение ридми сказало мне, что есть бинарик, которые делает все что нужно, он даже лежит собранный прямо в репе для разных платформ. Вот он то мне и нужен. А скрипты, ладно, без них сам все сделаю. Итого, вот что нужно:

# opkg update
# opkg install iptables
# mkdir git
# cd git
# git clone https://github.com/bol-van/zapret.git
# cd zapret
# ./install_bin.sh
# cd /opt/etc/init.d/
# vi S51tpws

И далее вставить код сервиса, который написал я.

#!/bin/sh

SCRIPT=/opt/root/git/zapret/tpws/tpws
PIDFILE=/var/run/tpws.pid
ARGS="--daemon --bind-addr 192.168.0.1 --port 999 --disorder --tlsrec=sni --split-pos=2 --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 80 -j REDIRECT --to-port 999
  iptables -t nat -A PREROUTING -i br0 -p tcp --dport 443 -j REDIRECT --to-port 999
  echo 'Started TPWS service'
}

stop() {
  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"
  iptables -t nat -D PREROUTING -i br0 -p tcp --dport 80 -j REDIRECT --to-port 999
  iptables -t nat -D PREROUTING -i br0 -p tcp --dport 443 -j REDIRECT --to-port 999
}

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

Далее

# chmod +x /opt/etc/init.d/S51tpws
# /opt/etc/init.d/S51tpws start

Замеряем

На моем ноутбуке, после запуска сервиса на роутере
На моем ноутбуке, после запуска сервиса на роутере

Пробуем YouTube ручками и видим глазками, что он стал работать оооочень быстро.

Небольшие пояснения. Код выше использует лишь один бинарь из проекта zapret - tpws . У него интерфейс прозрачной прокси, которая коверкает пакеты обманывая DPI. У этого бинаря куча флажков для старта. В коде сервиса init.d я указал аргументы для запуска, которые работают для меня. Можете убрать --daemon и запускать просто в терминале играясь с параметрами. Незабудьте прописать маршруты на ваш сервис в iptables перед тем как вращать его руками. В моем случае прямо в коде сервиса маршруты добавляются и удаляются.

Из специфичного. init.d на зюкселе почему то лежит в /opt/etc. На голой OpenWrt скорее всего в корне /etc. Префикс S51 файла сервиса S51tpws взят откуда-то из потрохов entware, без этого префикса сервис не стартует при запуске сам. Опять же, в голой OpenWrt скорее всего не нужно. br0 - имя интерфейса локальной сети, на ней айпи моего роутера 192.168.0.1. Чтобы сервис tpws слушал на этом интерфейсе только(а не на ещё и внешнем), я его же прописал среди аргуметов на запуск сервиса.

Вот собственное и все. Теперь весь трафик идущий на внешние порты 80 и 443 из моей сети обрабатываются и извращаются сервисом tpws. Я думаю, что далеко не секрет, если я скажу, что скорее всего, ютьюб будет полностью забанен в обозримом будущем. Исходя из этого, данное решение носит временный характер. Либо же, возможно, в будущем там будет другой бинарь, который весь трафик будет отправлять по ICMP на мою приватную виртуалку где нибудь в Нидерландах... Главное начало, и такая конструкция на домашнем роутере мне очень по душе. Всем спасибо, если дочитали до конца.

p.s. я даю полное согласие на перепечатку данной статьи в любых источниках. Объявляю ее public domain. Делайте, что хотите, но лучше улучшайте и развивайте :)

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


  1. V1tol
    03.08.2024 15:03
    +3

    Но, к сожалению, он дает только SOCKS прокси и настраивать каждое устройство в домашней сети у меня никакого желания нету.

    Можно было SOCKS клиент самого роутера подключить. По такой схеме много чего из Entware заводят глобально для всей сети.


  1. sintech
    03.08.2024 15:03

    Получается в бинарник редиректятся только http(s) запросы и на скорость скачки это влиять особо не должно?


    1. nkha Автор
      03.08.2024 15:03
      +4

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


    1. foxyrus
      03.08.2024 15:03
      +3

      Более того, там есть конфиг MODE_FILTER=hostlist который будет пропускать через мясорубку пакеты содержащие в url определённый домен.


  1. UserCrypt
    03.08.2024 15:03
    +3

    Каких только способов не найдут. И уверен, через неделю-вторую через радио начнут обходить замедление ютуб, а то и вовсе блокировку.


    1. pda0
      03.08.2024 15:03

      Так блокировка работает так же, только отбрасывают не сколько-то процентов соединений, а 100.


    1. senchik
      03.08.2024 15:03

      Способов много, но в данном случае только один верный это интересоваться наконец то массово политикой и выбирать адекватных лидеров...


  1. Popadanec
    03.08.2024 15:03
    +5

    Сохраняйте страницу локально, а то она вероятно скоро отправится в бан по geo IP.


    1. Sequoza
      03.08.2024 15:03
      +3

      Будет интересно, по какой причине они её забанят, ведь нельзя писать информацию по обходу блокировок, а youtube у нас не заблочен.


      1. DrMefistO
        03.08.2024 15:03

        Пока не заблочен, а потом скажут что гугол "некачественный сервис" предоставляет, а это якобы повод для блока. С твитором так и было.


      1. dartraiden
        03.08.2024 15:03

        по какой причине они её забанят,

        По причине требования Роскомнадзора.

        Вам приходит требование и дальше у вас есть выбор:

        • вы блокируете сразу и (опционально) начинаете бодаться (оспаривание, суды, вот это всё)

        • вы начинаете бодаться, на время бодания ваш ресурс будет заблокирован в России целиком (потому что HTTPS)

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


  1. SinsI
    03.08.2024 15:03

    Будет ли работать YouTube, если подменять в запросах браузера адрес googlevideo.com на его ip? А ещё лучше- ipv6?

    Тогда можно было бы сделать скрипт для tempermonkey и не мучаться с сомнительным левым софтом...


    1. Vindicar
      03.08.2024 15:03
      +3

      Как я понял, подмена-то нужна при установлении TLS соединения, там именно доменное имя - на случай, если несколько сайтов на одном IP сидят. Браузерные расширения вроде на этот уровень не допускаются.


    1. vESNik
      03.08.2024 15:03

      На ipv6 работает на полной скорости


      1. leprosorium2habr
        03.08.2024 15:03

        в yota на ipv4 (лоб4) вообще нет никаких замедлений


    1. UranusExplorer
      03.08.2024 15:03
      +1

      подменять в запросах браузера адрес googlevideo.com на его ip

      В этом случае скорее всего получите отлуп от гугловского сервера, потому что он должен предьявить вам валидный TLS-сертификат, а они у него там есть только для доменов (вроде вообще какой-то из RFC запрещал генерить TLS-сертификаты для IP, а даже если и не запрещал, Гуглу это не надо). Есть, конечно, вероятность, что он вам выдаст сертификат для какого-нибудь своего домена "по умолчанию", но тогда паниковать начнет уже браузер.


    1. Noortvel
      03.08.2024 15:03

      Покачто работает. DnsOverHttps => Подмена хоста ИП. Как запустить через браузер это счастье я не знаю, но вот загрузчики работают. https://github.com/kkdai/youtube + https://github.com/stopcenz/fakesni


    1. dartraiden
      03.08.2024 15:03

      на его ip

      Хорошая шутка - у Google балансировщики и огромная куча адресов.


  1. rendov
    03.08.2024 15:03
    +11

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

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


    1. Artyom_Silchenko
      03.08.2024 15:03

      Загрузка бинарника на https://virustotal.com поможет выявить подобную муть?


      1. nkha Автор
        03.08.2024 15:03
        +1

        нет, вирустотал не спасет... Со временем может и причислят к вирусам, но на это потребуется время. Тут только доверять проекту, либо собирать из сырцов.

        tpws не собрался на роутере, т.к. на нем нету пакета libcap-dev. Можно собрать на компе с кросскомпилятором... но проект вроде не новый, я ему доверился.


        1. andreishe
          03.08.2024 15:03
          +3

          собирать из сырцов

          Как будто вы их вычитывать будете перед сборкой.


      1. rendov
        03.08.2024 15:03

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


    1. dartraiden
      03.08.2024 15:03

      О, на двачах как раз эту тему "не кочяйте посоны там вирус" разгоняют, передавайте им привет


  1. DimoniXo
    03.08.2024 15:03
    +14

    Теперь пол страны будет сидеть через прокси/впн благодаря блокировке ютуба. В моём окружении даже самые лояльные теперь называют власть последними словами, попутно добавляя к ежемесячным расходам оплату зарубежного vps. Гениальный ход.


    1. Dolios
      03.08.2024 15:03
      +4

      Это временно. Уже сейчас я начинаю замечать как контент мейкеры начинают дублировать свои видео на рутуб и в ютубовских роликах рекламируют его. Типа, если ютуб забанят, идите все сюда. Потом они поймут, что на рутубе получают доход с рекламы (им же там отдают часть рекламных доходов?) и уйдут туда окончательно. На ютуб будут ходить те, кому нужен зарубежный контент, а это, имхо, статистически незначимое меньшинство в РФ.


      1. DimoniXo
        03.08.2024 15:03
        +4

        Не замечаю такого. Даже летсплейщики открыто проигнорили вк/рутуб, предпочитая дублировать контент в телеграме или твиче. И я не вижу снижения числа просмотров их видео. Разве что всякие Пучковы перейдут на отечественные платформы, разумеется за государственное вознаграждение.


        1. Dolios
          03.08.2024 15:03
          +5

          Даже летсплейщики

          Я не знаю, что это такое. Я смотрю, в основном, научпоп. Вот пример такого переманивания: https://youtu.be/A-Q3HW60c7g?si=xLdD6I2oUVYTSyug&t=808 УПМ тоже начали альтернативные площадки пиарить, но ссылку сходу не найду.

          предпочитая дублировать контент в телеграме

          Под "рутубом" я имел в виду, не только, собственно, рутуб, но и вконтакт, и мессенджеры. Надо было в кавычки взять.

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

          Мобильная революция убивает интернет. Слесари с домохозяйками не имеют других устройств кроме телефона. Сначала интернет сильно сегментировали, каждый вебсайт начал писать своё приложение. Доходит до идиотизма, пользователи реддита не понимают, что реддит, это вебсайт, один из многих и что есть такая штука, как браузер, которая показывает любой сайт, а не только реддит или вконтакт. А теперь все начали писать супераппы. Недавно охренел от того, что телега при переходе по ссылке не открыла браузер, а стала мне сайт внутри себя показывать. При этом, естественно, меня никто не спросил, нужна ли мне эта дичь.


        1. aGGre55or
          03.08.2024 15:03

          Летсплейщики - это специфичная фигня. Странно что не заметили, это уже скоро год как тренд. Более того, весь мой плейлист давно дублирует видео в рутуб и дзен. Поэтому чего-то нового хорошего в ютубе или недублируемого на другие площадки для меня вообще не появляется.

          Парадокс №1: На ютуб теперь ходят смотреть старые советские фильмы (лучше качество), а на рутуб, спасибо двачу - голливудские фильмы, от терминатора до шлака последних лет.

          Парадокс №2: Половина контента культура.рф (сюрприз!) находится на каналах ютуб.

          Онлайн-кинотеатры плачут уже полгода. Так что пора замечать)


          1. DimoniXo
            03.08.2024 15:03

            Если и есть те, кто дублирует контент в вк, то делают они это по остаточному принципу, с запозданием и пропусками. С большим трудом нашёл в своих подписках тех, кто контент дублирует. Количество просмотров в десятки раз ниже, а серии выходят спустя недели после появления их на ютубе.

            Пример


  1. aegoroff
    03.08.2024 15:03
    +5

    Спасибо автору, прямо в ридми он собрал список проектов делающие аналогичные трюки под другие операционки. Вся суть этих проектов, в том, что бы как то извратить передаваемую в открытом виде строку домена.

    на самом деле автор упомянутой статьи топил не совсем за это, а за то, чтобы разбить TCP пакет на 2 части, передавая их в обратном порядке с SNI посередине, что и было сделано в его проекте https://github.com/Waujito/youtubeUnblock а в других ссылках возможно конечно и то что вы говорите, является рецептом от замедления.

    Если совсем кратко, своими словами - во время установки SSL соединения в открытом виде домен передается к которому мы подключаемся(так называемое SNI).

    может лучше так? "Если совсем кратко, своими словами - во время установки SSL соединения, домен, к которому мы подключаемся(так называемое SNI), передается в открытом виде." А то я весь мозг сломал пока понял фразу :)