hufrea / byedpi

Bypass DPI
MIT License
1.72k stars 111 forks source link

Поделитесь пожалуйста опытом подбора настроек под себя. #220

Closed wassalam01 closed 3 weeks ago

wassalam01 commented 1 month ago

Огромное спасибо автору за проделанную работу. Моя ситуация осложнена еще и тем что у меня мак, но не в этом суть вопроса. А суть вопроса следующая она заключается в моем опыте использования как пользователя. Я скачал и запустил программу само-собой ничего не заработало, долго отдуплял запустилась ли она, или нет. Потом понял что запустилась, полез разбираться с параметрами их много они классные, только не все очевидны для меня, нашел в ишью чужие настройки которые сработали, потом очередная волна жалоб на то что ютуб перестал работать, экспериментирую с настройками завышаю цифры, бац работает радуюсь (не долго) какой я мамкин хакер. Но я не понимаю что я делаю, в этом и суть вопроса, понимаю что за 21 день можно выучить си, но у меня не получилось ) Вопрос, как можно понимать какие крутилки крутить, что мне прочитать для этого. Смотреть TCP дампом пакеты, ставить какие то интерсепторы. Научиться читать логи, запускаться в дебаге и что-то логировать? Понимаю что мне никто ничем не обязан, но за спрос как говорится денег не берут.

EvgenKo423 commented 4 weeks ago

TL;DR: Всё сложно. Вообще по идее этим должны заниматься авторы, т.к. в россии DPI один и нет особого смысла делать разные настройки, достаточно нескольких рабочих пресетов с разными техниками, наиболее корректных / оптимальных с точки зрения работы сети. Но, как многие уже говорили, у этого автора, к сожалению, с документированием проблемы (или со свободным временем). =(( Параметры не понятны не только вам, некоторые вещи я вообще в коде смотрел.

Но если хочется покопаться, то я вошёл так (правда у меня ИТшное образование и немного хакерского):

  1. Вот в этой портянке от господина bol-van'а очень хороший пересказ теории с разными нюансами. Там всё в куче и частично про его утилиты, так что фильтруйте (утилиты, кстати, тоже более продвинутые и вроде как даже лучшие для линуксов (hufrea, уж извини));
    • в частности, про --split, --disorder и --fake;
    • осложняется всё тем, что на уровне прокси это можно реализовать тока через костыли, поэтому если есть возможность, лучше использовать утилиты, работающие на уровне системы (GoodbyeDPI / nfqws из zapret'а, правда подключение последнего это отдельный вид извращений);
  2. Запускаете мониторинг трафика (например, Wireshark'ом);
  3. Загружаете сайт, отключаете захват и смотрите как должно выглядеть соединение;
  4. Выбираете любой заблокированный сайт, желательно полегче и без поддоменов, и для упрощения анализа желательно чтобы в сеть в это время больше ничего не лезло;
    • разные сайты могут блокироваться по-разному, но в основном одинаково, по SNI;
  5. Повторяете 2-3 и смотрите что происходит там;
    • в основном нас интересует Client Hello, в средней области отображается понятная структура пакета;
    • в хроме соединение с сайтом не закрывается, так что чтобы пошло новое соединение надо перед этим закрыть вкладку и на странице chrome://net-internals/#sockets нажать Close idle sockets;
  6. Подбираете параметры, при которых в запросе будет использоваться разрешённый домен или DPI не сможет проверить запрос, а сервер его поймёт;
  7. Повторяете 2-3 и смотрите что изменилось.

Но для googlevideo.com уже начинается такая магия, что даже не понятно как оно ещё может его проверять... Сейчас, судя по всему, корректно туда пропускает только поддомены гугла, а не корректно поломки версии, всё с перепроверкой последнего пакета перед ответом сервера.

wassalam01 commented 4 weeks ago

Супер! Спасибо огромное за объяснение!

zimbabwe303 commented 4 weeks ago

Моё скромное мнение.

Тут такая ситуевина: ТСПУ - это "чёрный ящик", поэтому сравнивая нормальный и покоцанный ClientHello не многое можно понять, по части того, какие настройки вставлять, ибо не ясно, на что именно реагирует эта самая вундервафля. По крайней мере мне эти сравнения практически ничего не подсказали (с другой стороны у меня двойка по сетевой магии).

Из опыта подборов понял, что самая полезная вещь не Wireshark, а банальный ключ -x2 (--debug 2) самого же byedpi. В его выдаче смотрим на строки, заканчивающиеся на evt: EV_TUNNEL, mod_iter: [число] - если они есть после попытки зайти на сайт, это говорит об успешном начале передаче пакетов (но не о скорости). Число mod_iter в норме должно быть около 400 или больше, маленькие числа говорят о том, что ТСПУ всё обнаружило и гадит в поток данных, чтобы его затормозить (желательно до нуля). С googlevideo.com дело обстоит именно так: ТСПУ коннект не разрывает, но гадит в него.

Ещё советы:

  1. Не стоит тупо наворачивать кучу параметров не понимая, что делаешь. Осознанный минимализм всегда побеждает, а бессмысленный хаос - его и ТСПУ умеет создавать.
  2. Большие значения имеющихся параметров редко выручают: если ТСПУ уже научено обнаружать тот или иной метод дурения, то размеры подставы существенного значения не имеют. В лучем случае в ТСПУ может сработать некий лимит на объём анализируемых данных, но, в таком случае, у вас всё равно передача будет тормозить.
  3. Варианты дурения всегда стоит пробовать поменять на другие (-s на -d, -q, -o), а не тупо добавлять новые. Несколько подряд идущих однотипных методов могут помочь, но не более двух (как тот же популярный -s1 -q1), далее уже сам byedpi рискует не собрать всё обратно.
  4. Пробуем добавлять модификаторы: -Y (--drop-sack), -S (--md5sig), -F (--tfo). Они помогают, но не часто.
  5. Нужно чутьё. Перебираем параметры, а в браузере перезагружаем страницу. Выдаётся уже другая ошибка? Значит копаем в правильном направлении и подобранные параметры лучше уже не менять, а двигаться от них: добавляем, для начала -At, и пробуем что-нибудь дальше, например -f (--fake) и/или -r (--tlsrec).
  6. Может помочь игра с размером буфера -b (--buf-size) и -R (--round). Есть ещё более зверский вариант: добавляем в параметры сплита повторы и пропуски: например -s1:3:1 (3 повтора, 1 пропуск).
  7. Можно (и лучше) отталкиваться от уже найденных другими людьми минималистичных строк, то есть таких строк, в которых нет нагромождений типа -s1 -s20 -q40 -o10 и в которых не более трёх -A (--auto). Каждое -A (кроме заключительного -An или -As) срабатывает, чтобы пробиться через один этап защиты, а ТСПУ это, судя по всему, всего один. Дополнительные препоны это могут быть старая система Ревизор и подобная же фиговина у магистральщика, и они, как правило, перенаправляют на страницу с надписью "А низзя!" (c) Слава Полунин). На подобные перенаправления реагирует -Ar (--auto r), либо тот же -At (--auto t) - смотря как это перенаправление организовано, и что срабатывает первым - ТСПУ или Ревизор.
EvgenKo423 commented 4 weeks ago

ТСПУ - это "чёрный ящик", поэтому сравнивая нормальный и покоцанный ClientHello не многое можно понять, по части того, какие настройки вставлять, ибо не ясно, на что именно реагирует эта самая вундервафля.

Ну да, тут надо думать как бы вы сами стали это блокировать, изобретать свой DPI. После применения параметров в Wireshark'е можно увидеть к каким модификациям пакета они приводят, что доходит до сервера, а что нет. Ещё можно увидеть если параметры работают не для всех соединений с одним сайтом.

С googlevideo.com дело обстоит именно так: ТСПУ коннект не разрывает, но гадит в него.

Из моих наблюдений, googlevideo.com уже давно блокируется сразу и полностью, просто там идёт параллельно несколько соединений и у него не всегда получается.

1. Не стоит тупо наворачивать кучу параметров не понимая, что делаешь.

Добавлю, что это замедляет работу сети, особенно если нет фильтра по доменам.

6. Может помочь игра с размером буфера -b (--buf-size)

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

... добавляем, для начала -At ... Каждое -A (кроме заключительного -An или -As) срабатывает, чтобы пробиться через один этап защиты, а ТСПУ это, судя по всему, всего один.

Вообще этот параметр предназначен для смены одного способа на другой: либо с общей строкой для всех сайтов, либо если по умолчанию не применяется ничего. Лично я собираю сайты с одинаковым способом обхода в один файл, а --auto использую на случай, если наткнусь на то, чего нет в списках. -A n указывается в конце блока, остальные в начале!

Несколько фильтров я на практике ни разу не видел, да и не понимаю я все эти упоминания про старые не выключенные системы: операторам тупо не выгодно держать включёнными несколько железок, особенно если они уже заменены на ТСПУ. Но, как говорится в описании параметров ByeDPI и zapret'а, в сети есть другие фильтры, для защита от DDoS и т.п. И чтобы пробиться через все "ящики", параметры должны удовлетворять их все одновременно, --auto тут не поможет (вроде).

... и они, как правило, перенаправляют на страницу с надписью "А низзя!"

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

vehametra commented 4 weeks ago
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?

sakontwist commented 4 weeks ago

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, только смысла в этом немного

radioxoma commented 3 weeks ago

@EvgenKo423 поправьте ссылки с issue на discussions https://github.com/hufrea/byedpi/discussions/218#discussioncomment-11062421, в issue старый текст, не могу править.

hufrea commented 3 weeks ago

Для начала стоит ответить на другой вопрос. Как, перехватив первый пакет, понять на какой домен идет обращение? Посмотрите как выглядит 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.

hufrea commented 3 weeks ago

Но, как многие уже говорили, у этого автора, к сожалению, с документированием проблемы.

Было бы здорово, если бы говорили что именно написать, а лучше присылали бы PR. Мне сложно понять чего конкретно от меня хотят. Параметры описаны, в репозитории Zapret-а куча подробностей, не вижу смысла пересказывать их.

Число mod_iter в норме должно быть около 400 или больше, маленькие числа говорят о том, что ТСПУ всё обнаружило и гадит в поток данных

Это число - номер итерации цикла событий, в который соединение было добавлено или изменено. Для первых соединений оно всегда маленькое.

Может помочь игра с размером буфера -b (--buf-size)

Я уже писал - этого делать не стоит. Это скажется на скорости соединения и потреблении ресурсов процессора (чем меньше размер буфера, тем больше циклов чтения будет совершенно). Если параметр -b с определенным числом влияет на обход, то стоит поиграться со сплитами на позициях кратными этому числу.

Пробуем добавлять модификаторы: -Y (--drop-sack), -S (--md5sig), -F (--tfo)

-Y вообще не стоит использовать. Он добавляет существенную задержку к соединению (около 200ms) и ломает disorder. Он имеет смысл только при особом сочетании параметров . На --tfo опираться не следует, т.к. большинство сайтов его не поддерживают. При подборе он только внесет неясность.

radioxoma commented 3 weeks ago

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

Оно даже моргать умеет, если rounds 0.

Снимок экрана_2024-10-19_22-18-51 Снимок экрана_2024-10-19_22-19-55

hufrea commented 3 weeks ago

сконвертируйте, пожалуйста, issue в discussion

Хорошо.

я добавлю туда листинг конфига для колорайзера grc.

А разве это имеет какое-то отношение к заданному вопросу?