ByeDPI

Программа, реализующая разные методы запутывания DPI из пользовательского пространства в Linux и Windows. Предоставляет локальный SOCKS прокси сервер, не требующий для работы повышенных привилегий.

97 posts were merged into an existing topic: ByeDPI: обсуждение

Добавлена поддержка UDP с аттакой fake, пока в dev ветке
https://github.com/hufrea/byedpi/tree/dev

Новая версия!
Добавлена поддержка –tlsrec, а с ней появился и смысл поддержки Windows, которая также была добавлена.
Также были добавлены и удалены многие опции.

Новый метод обхода - внеполосные данные.
TCP позволяет отправить один байт данных вне основной полосы, и это можно использовать для запутывания. Например: разбить запрос по середине имени хоста и затем отослать случайный байт с флагом MSG_OOB. TCP пакет с этим байтом будет отличаться от других лишь приоритетом (seq и ack также увеличатся на 1), DPI посчитает его частью запроса и получит неверный SNI.

Новая версия!
Добавлена поддержка oob.
Методы запутывания были перенесены в отдельные опции.
Теперь их можно комбинировать, указывая свой метод для определенной позиции.
Позиций указывать можно сколько угодно, при этом можно добавить флаг смещения, например:
./ciadpi --disorder 3 --oob 1+sni --split -1+host --tlsrec 1 --tlsrec +sni

Теперь можно подкорректировать поведение disorder в Windows:
./ciadpi -s 3+s -d 20+s
Первый пакет будет содержать часть с первыми 3-мя байтами SNI
Второй - часть после SNI
Третий - SNI без первых 3-х байт и всю вторую часть

В следующей версии планируется добавить параметры --auto и, возможно, --redirect. Работать это будет так:
./ciadpi --auto --disorder 3 --auto --tlsrec 1+s --auto --redirect 127.0.0.01:1090
Сначала будет произведена попытка соединиться без запутывания, если она не удалась, то будет применен --disorder, после неудачи --tlsrec, и если и она не сработала, то подключение перенаправится на другой socks прокси, например, на локальный shadowsocks.
Если одна из попыток удалась, то IP сайта будет сохранен, чтобы впредь вновь не перебирать параметры, но только на определенное время, по умолчанию на 6 часов.
Это поможет минимизировать поломки, т.к. одни параметры могут быть действенны для одних сайтов, но при этом ломать другие.
Кто нибудь пользуется cli версией? Нужен ли вам --redirect? Если в нем нет особой нужды, то я бы предпочел не добавлять его.

Новая версия!
Добавлена возможность автоматической смены/отмены/включения запутывания. Необходимо указать параметр --auto и за ним параметры десинхронизации. Примеры:
./ciadpi --auto --disorder 3 # включать disorder только при необходимости.
./ciadpi --disorder 3 --auto --split 1 # использовать disorder по умолчанию, при поломке использовать split.
По умолчанию --auto реагирует только на RST со стороны сервера после первого запроса. Но сайты могут просто перестать отвечать, для этого есть опция --timeout. Бывает, что провайдер/сервер перед сбросом соединения может отправить некие данные. Для таких случаев есть опция --tr. В ней можно указать какие данные, с какой и по какую позицию искать для включения auto. Например, если фейковый TLS пакет дойдет до сервера, то он пришлет ServerHello со значением session id равным соот. значению в фейк пакете. Обработать это можно так:
./ciadpi --fake -1 --auto --tr '32:64::\xf9\xdf\x0c\x2e\x8a\x55\x89\x82'
Указанная строка является кусочком session id из дефолтного фейкового пакета .
Точно также можно реагировать на TLS Alert или на HTTP Redirect:
./ciadpi --fake -1 --auto --tr '0:7::\x15\x03\x01\x00\x02\x02'
./ciadpi --auto --disoder 3+h --tr '0:500::\nLocation: http://blocked.com'
Теперь там, где в качестве аргумента принимался файл, можно указать строку, добавив перед ней символ :. Например:
./ciadpi --oob 3 --oob-data ':\x00'

Новая версия!
Добавлена поддержка --fake на Windows
В Linux добавлена поддержка TCP Fast Open. Может использоваться как для простой оптимизации, так и для десинхронизации на ограниченном количестве сайтов, поддерживающих TFO. Первый сплит будет отправлен вместе с SYN, что может запутать некоторые DPI. Пример: ./ciadpi --split 1 --tfo
Также в Linux теперь проверяется отправило ли ядро данные из буфера, что поможет предотвратить возможное объединение нескольких сплитов в один сегмент (а также восстановление TTL раньше времени в disorder и перезапись данных до отправки в fake).
Для fake добавлен дополнительный ограничитель - IP options. Т.к. опции в IP уже считаются устаревшими и используются/лись в основном для отладки, то такой пакет вряд-ли дойдет до сервера, однако он может не дойти и до DPI, поэтому следует использовать с осторожностью. Многие маршрутизаторы/сервера отбрасывают такие пакеты, не смотря на требование RFC обработать их.

Новая версия!
В Linux для fake добавлен ограничитель --md5sig (увы, не везде поддерживается, например, в Android)
Удален --tr. Обработка некоторых вариантов “плохого ответа” вынесена в --auto. У нее теперь 5 опциональных аргументов:
torst - вышло время ожидания или сервер сбросил подключение после первого запроса
redirect - HTTP Redirect с Location, домен которого не совпадает с исходящим
cl_err - HTTP ответ, код которого равен 40x, но не равен 429
sid_inv - session_id в TLS ServerHello и ClientHello не совпадают
alert - TLS Error Alert в ответе
По умолчанию обрабатывается только torst.
Пример:
./ciadpi --auto=torst,redirect --fake -1 -t 12 --auto=cl_err --mod-http h,d --auto=sid_inv,alert --fake -1 -t 9
Если сброшено подключение или произошло перенаправление, то отправляем fake с TTL=12. Если после этого пришла ошибка 40x (т.е., вероятно, фейк дошел до сервера), то пытаемся использовать --mod-http. Если же пришел TLS Alert или в ServerHello неверный session_id, то снова пытаемся использовать fake, но уже с TTL=9.

Новая версия!
Добавлен параметр --hosts, ограничивающий группу параметров списком доменов. Пример:
./ciadpi --hosts whitelist.txt --disorder 3 --auto=none
./ciadpi --hosts blacklist.txt --auto=none --disorder 3

Добавлен ограничитель по протоколам --proto :
./ciadpi --proto=http --split 1 --auto=none --disorder 3 (split для HTTP, для остальных disorder)
Параметры --fake-http/tls заменены на один --fake-data, --desync-known удален за ненадобность.

Параметр --late-conn заставляет выполнять фактическое подключение уже после получения запроса от клиента. Нужно применять, если необходимо вынести решение о запутывании еще до подключения, на основе домена или протокола.

Добавлен параметр --dst, который принудительно перенаправляет запрос на другой IP, сочетая с hosts можно обойтись без редактирования /etc/hosts:
./ciadpi --late-conn --hosts ':one.one.one.one' --dst 1.1.1.1 --auto=none

Добавлена поддержка UDP Associate, без нее программы, подобные tun2socks, могли работать некорректно.
В Windows добавлена возможность запуска в режиме сервиса.

Новая версия!
Удалены не особо нужные опции, такие как --dst и --late-conn.
Изменено поведение auto, параметры из этого поста должны работать так, как и ожидается.

Новая версия!
Добавлена возможность отправки UDP фейков - параметр --udp-fake, где аргументом является количество отправляемых пакетов.
Добавлен фильтр по портами --pf, к параметру --proto добавлен udp.

Два новых параметра, которые, возможно, будут:

--fake-offset
Задает смещение начала фейковых данных. Полезен против DPI, который собирает запрос.
--split 5 --fake -1 --fake-offset 5
Будет отправлено 5 байт из оригинала, затем фейк без первых 5-ти байт. В итоге DPI получит корректный запрос. По сравнению с обычным fake плюс в том, что при ретрансмисии не будет пакетов, содержащих заголовок TLS (160301).

--oob2
Как и обычный oob, отправляет пакет с URG флагом. Отличие в том, что TTL выставляется равный 1-му.
--oob2 0 --fake -1
Отправляется один oob байт (0x10), который никуда не доходит. После отправляется фейк (0x1603…), тоже не доходит, но проходит через DPI. Выполняется ретрансмиссия - oob байт и запрос объединяются, в итоге выходит пакет с URG флагом, где Urgent pointer равняется 1-му, т.е. oob байт стоит перед заголовком (0x101603…). Таким образом можно помещать oob байт не только в конец, но и середину или начало пакета.

https://github.com/hufrea/byedpi/tree/experimental

Новая версия!
Добавлены опции --fake-offset и --disoob (о них выши).
Добавлена опция --drop-sack. Она заставляет сокет игнорировать TCP пакеты с SACK расширением (частичное подтверждение). Это вынуждает ядро переотправлять уже доставленные данные, делая поведения --disorder в Linux схожим с поведением в Windows. Если перед фейком стоит --disorder или --disoob, то можно перезаписать фейк, а значит можно указывать высокий TTL не боясь, что сайт сломается (при условии, что он не на Windows).
--auto опять претерпел изменения. Теперь аргумент к опции обязателен (а то многие путались). sid_inv, alert, cl_err удалены, добавлен ssl_err. У ssl_err логика проще - если отправлен ClientHello, а в ответ пришло что-то помимо ServerHello c корректным session_id, то это ошибка.
Из неявных новшеств - пофикшен код для компиляции на BSD системах (благодаря новым контрибьюторам).

Новая версия!
Добавлена возможность запуска в режиме прозрачного прокси.
Возможности auto были расширены, появилась опция --auto-mode с двумя возможными аргументами - 0 и 1. С 0 все работает по-прежнему, а вот с 1 поведение меняется. Если в первом случае для обнаружения блокировки/поломки анализировался первый пакет от сервера, то во втором учитываются косвенные признаки.
В случае torst сайт будет кешироваться и в том случае, если RST придет уже после ответа сервера, т.е. даже если TLS рукопожатие успешно завершилось.
В случае ssl_err считается количество циклов “запрос-ответ”. Если соединение закрыто, первым пакетом является ClientHello, а количество таких циклов не превышает 1-ого, то это принимается за поломку.

Новая версия!
Добавлена опция --round. Эта опция позволяет применять запутывание к произвольным запросам: -R 1-2 - к первым двум запросам; -R 2 ко второму. Под запросом тут подразумевается не запрос протокола прикладного уровня (например HTTP запрос), а любые исходящие данные в ответ на входящие.

Добавлены модификаторы для флагов m и e, добавлен флаг n - начало запроса. Примеры:
+sm - середина SNI, +se - конец, +hm - середина HTTP хоста, +nm - середина запроса.

Добавлена возможность указывать какое количество раз следует разбить запрос. Примеры:
--split 1:3:2 - разобьет запрос по позициям 1, 3, 5.
--tlsrec 1:500:1 --fake 500:5:500 - создаст TLS record на каждый байт из первых 500, увеличив размер запроса на 2500 байт, затем отправит 5 фейков, размером в 500 байт.