Closed wassalam01 closed 3 weeks ago
TL;DR: Всё сложно. Вообще по идее этим должны заниматься авторы, т.к. в россии DPI один и нет особого смысла делать разные настройки, достаточно нескольких рабочих пресетов с разными техниками, наиболее корректных / оптимальных с точки зрения работы сети. Но, как многие уже говорили, у этого автора, к сожалению, с документированием проблемы (или со свободным временем). =(( Параметры не понятны не только вам, некоторые вещи я вообще в коде смотрел.
Но если хочется покопаться, то я вошёл так (правда у меня ИТшное образование и немного хакерского):
--split
, --disorder
и --fake
;chrome://net-internals/#sockets
нажать Close idle sockets
;Но для googlevideo.com
уже начинается такая магия, что даже не понятно как оно ещё может его проверять... Сейчас, судя по всему, корректно туда пропускает только поддомены гугла, а не корректно поломки версии, всё с перепроверкой последнего пакета перед ответом сервера.
Супер! Спасибо огромное за объяснение!
Моё скромное мнение.
Тут такая ситуевина: ТСПУ - это "чёрный ящик", поэтому сравнивая нормальный и покоцанный ClientHello не многое можно понять, по части того, какие настройки вставлять, ибо не ясно, на что именно реагирует эта самая вундервафля. По крайней мере мне эти сравнения практически ничего не подсказали (с другой стороны у меня двойка по сетевой магии).
Из опыта подборов понял, что самая полезная вещь не Wireshark, а банальный ключ -x2 (--debug 2)
самого же byedpi. В его выдаче смотрим на строки, заканчивающиеся на evt: EV_TUNNEL, mod_iter: [число]
- если они есть после попытки зайти на сайт, это говорит об успешном начале передаче пакетов (но не о скорости). Число mod_iter
в норме должно быть около 400 или больше, маленькие числа говорят о том, что ТСПУ всё обнаружило и гадит в поток данных, чтобы его затормозить (желательно до нуля). С googlevideo.com дело обстоит именно так: ТСПУ коннект не разрывает, но гадит в него.
Ещё советы:
-s
на -d
, -q
, -o
), а не тупо добавлять новые. Несколько подряд идущих однотипных методов могут помочь, но не более двух (как тот же популярный -s1 -q1
), далее уже сам byedpi рискует не собрать всё обратно.-Y (--drop-sack)
, -S (--md5sig)
, -F (--tfo)
. Они помогают, но не часто.-At
, и пробуем что-нибудь дальше, например -f (--fake)
и/или -r (--tlsrec)
.-b (--buf-size)
и -R (--round)
. Есть ещё более зверский вариант: добавляем в параметры сплита повторы и пропуски: например -s1:3:1
(3 повтора, 1 пропуск).-s1 -s20 -q40 -o10
и в которых не более трёх -A (--auto)
. Каждое -A
(кроме заключительного -An
или -As
) срабатывает, чтобы пробиться через один этап защиты, а ТСПУ это, судя по всему, всего один. Дополнительные препоны это могут быть старая система Ревизор и подобная же фиговина у магистральщика, и они, как правило, перенаправляют на страницу с надписью "А низзя!" (c) Слава Полунин). На подобные перенаправления реагирует -Ar (--auto r)
, либо тот же -At (--auto t)
- смотря как это перенаправление организовано, и что срабатывает первым - ТСПУ или Ревизор.ТСПУ - это "чёрный ящик", поэтому сравнивая нормальный и покоцанный ClientHello не многое можно понять, по части того, какие настройки вставлять, ибо не ясно, на что именно реагирует эта самая вундервафля.
Ну да, тут надо думать как бы вы сами стали это блокировать, изобретать свой DPI. После применения параметров в Wireshark'е можно увидеть к каким модификациям пакета они приводят, что доходит до сервера, а что нет. Ещё можно увидеть если параметры работают не для всех соединений с одним сайтом.
С googlevideo.com дело обстоит именно так: ТСПУ коннект не разрывает, но гадит в него.
Из моих наблюдений, googlevideo.com
уже давно блокируется сразу и полностью, просто там идёт параллельно несколько соединений и у него не всегда получается.
1. Не стоит тупо наворачивать кучу параметров не понимая, что делаешь.
Добавлю, что это замедляет работу сети, особенно если нет фильтра по доменам.
6. Может помочь игра с размером буфера
-b (--buf-size)
С этим лучше не играть, этот параметр про оптимизацию копирования данных между прокси и ОС, на обход он не влияет.
... добавляем, для начала
-At
... Каждое-A
(кроме заключительного-An
или-As
) срабатывает, чтобы пробиться через один этап защиты, а ТСПУ это, судя по всему, всего один.
Вообще этот параметр предназначен для смены одного способа на другой: либо с общей строкой для всех сайтов, либо если по умолчанию не применяется ничего. Лично я собираю сайты с одинаковым способом обхода в один файл, а --auto
использую на случай, если наткнусь на то, чего нет в списках. -A n
указывается в конце блока, остальные в начале!
Несколько фильтров я на практике ни разу не видел, да и не понимаю я все эти упоминания про старые не выключенные системы: операторам тупо не выгодно держать включёнными несколько железок, особенно если они уже заменены на ТСПУ. Но, как говорится в описании параметров ByeDPI и zapret'а, в сети есть другие фильтры, для защита от DDoS и т.п. И чтобы пробиться через все "ящики", параметры должны удовлетворять их все одновременно, --auto
тут не поможет (вроде).
... и они, как правило, перенаправляют на страницу с надписью "А низзя!"
Перенаправление может быть только по HTTP, но при правильной настройке наткнуться на него почти невозможно и обходить смысла нет:
https://
. Раньше Хром использовал его по умолчанию, а с добавлением этой настройки как идиот стал использовать HTTP...TFO supported!
new conn: fd=13, addr=216.58.207.202:443
TFO supported!
new conn: fd=14, addr=216.58.207.202:443
host: youtubei.googleapis.com (515)
state: 2
split: pos=0-1 (1), m: DESYNC_SPLIT
send: Resource temporarily unavailable
send: Resource temporarily unavailable
split: pos=1-1 (-1), m: DESYNC_DISOOB
host: youtubei.googleapis.com (191)
state: 2
split: pos=0-1 (1), m: DESYNC_SPLIT
send: Resource temporarily unavailable
send: Resource temporarily unavailable
split: pos=1-1 (-1), m: DESYNC_DISOOB
offset: 1, skip
offset: 1, skip
offset: 1, skip
offset: 1, skip
close: fd=12 (pair=14), recv: 1143, rounds: 2
close: fd=14 (pair=12), recv: 384, rounds: 1
close: fd=9 (pair=10), recv: 7272, rounds: 6
close: fd=10 (pair=9), recv: 15807, rounds: 5
close: fd=7 (pair=8), recv: 715, rounds: 2
close: fd=8 (pair=7), recv: 258, rounds: 1
close: fd=11 (pair=13), recv: 6150, rounds: 3
close: fd=13 (pair=11), recv: 18947, rounds: 2
client_loop: send disconnect: Broken pipe
что значит round? Я могу в блоке -At на 10й попытке включить например опцию -M и вторую --tls-rec? send: Resource temporarily unavailable Это нормальное поведение? Что значит state?
round это видимо один обмен запрос-ответ. У меня стоят все дурения на --round 1 и этого хватает. Что касается auto, у меня переключается несколько режимов. Это просто для примера, реально может не работать:
--proto udp --udp-fake 5 --ttl 2 \
--auto=none --proto http --mod-http=h,d \
--auto=none --proto tls --disorder +s --split 0+sm --round 1 \
--auto=torst,redirect,ssl_err --proto tls --disorder 2 --split 7 --round 1
Видимо да, можно включить, например, --round 10-11, только смысла в этом немного
@EvgenKo423 поправьте ссылки с issue на discussions https://github.com/hufrea/byedpi/discussions/218#discussioncomment-11062421, в issue старый текст, не могу править.
Для начала стоит ответить на другой вопрос. Как, перехватив первый пакет, понять на какой домен идет обращение?
Посмотрите как выглядит TLS ClentHello (тут например).
По первым 6-ти байтам (или даже по 3-м, если грубо) можно понять, что это приветственное сообщение TLS.
Затем нужно перейти к блоку расширений, пропустив ненужное для нас. Делаем это так:
Пропускаем первые 43 байта и читаем первый (относительно смещения, т.е. по позиции 43) байт. Этот байт - размер SessionID, добавляем к нему текущее смещение (44) и читаем уже 2 байта. Это - размер шифронаборов, добавляем его к текущей позиции. Пропускаем 2 байта, и вот мы у блока расширений.
Заголовок расширения выглядит так - 2 байта тип + 2 байта размер. Домен хранится в расширении SNI, его тип 0x0000. И так, проходимся по блоку: читаем тип, если это не 0x0000, то добавляем к текущей позиции размер этого расширение, тем самым перейдя к следующему, снова читаем тип, и так пока не наткнемся на искомый.
Если знать на каком IP лежит сайт, однако сам IP заблокировать невозможно, т.к. на нем могут быть другие сайты, то можно поступить иначе. Можно ничего не парсить, а просто при обращении на этот адрес грубо искать домен в первых пакетах. Или же можно сделать список разрешенных доменов, что лежат на этом IP, и разрешать лишь те соединения, что их содержат.
Алгоритмы могут быть разные. Задача - понять и сломать их. На вооружении есть split, disorder, fake, oob и tlsrec
. Что они делают написано в README, в конце есть дополнительные ссылки. Поняв, как работает DPI, вы также и поймете что и по каким позициям стоит применять. Для примерного понимания хватит и вышеописанного. Если хочется узнать, почему и как такие штуки, как split и disorder, работают, то стоит изучить еще и протокол TCP.
Но, как многие уже говорили, у этого автора, к сожалению, с документированием проблемы.
Было бы здорово, если бы говорили что именно написать, а лучше присылали бы PR. Мне сложно понять чего конкретно от меня хотят. Параметры описаны, в репозитории Zapret-а куча подробностей, не вижу смысла пересказывать их.
Число mod_iter в норме должно быть около 400 или больше, маленькие числа говорят о том, что ТСПУ всё обнаружило и гадит в поток данных
Это число - номер итерации цикла событий, в который соединение было добавлено или изменено. Для первых соединений оно всегда маленькое.
Может помочь игра с размером буфера -b (--buf-size)
Я уже писал - этого делать не стоит. Это скажется на скорости соединения и потреблении ресурсов процессора (чем меньше размер буфера, тем больше циклов чтения будет совершенно). Если параметр -b
с определенным числом влияет на обход, то стоит поиграться со сплитами на позициях кратными этому числу.
Пробуем добавлять модификаторы: -Y (--drop-sack), -S (--md5sig), -F (--tfo)
-Y
вообще не стоит использовать. Он добавляет существенную задержку к соединению (около 200ms) и ломает disorder. Он имеет смысл только при особом сочетании параметров .
На --tfo
опираться не следует, т.к. большинство сайтов его не поддерживают. При подборе он только внесет неясность.
Огромное спасибо автору за проделанную работу. Моя ситуация осложнена еще и тем что у меня мак, но не в этом суть вопроса. А суть вопроса следующая она заключается в моем опыте использования как пользователя. Я скачал и запустил программу само-собой ничего не заработало, долго отдуплял запустилась ли она, или нет. Потом понял что запустилась, полез разбираться с параметрами их много они классные, только не все очевидны для меня, нашел в ишью чужие настройки которые сработали, потом очередная волна жалоб на то что ютуб перестал работать, экспериментирую с настройками завышаю цифры, бац работает радуюсь (не долго) какой я мамкин хакер. Но я не понимаю что я делаю, в этом и суть вопроса, понимаю что за 21 день можно выучить си, но у меня не получилось ) Вопрос, как можно понимать какие крутилки крутить, что мне прочитать для этого. Смотреть TCP дампом пакеты, ставить какие то интерсепторы. Научиться читать логи, запускаться в дебаге и что-то логировать? Понимаю что мне никто ничем не обязан, но за спрос как говорится денег не берут.