Реализация некоторых способов запутывания DPI. Программа представляет собой локальный SOCKS прокси сервер. -------------- Использование: $ ./ciadpi --disorder 3 -A --tlsrec 1+s Описание аргументов: -i, --ip Прослушиваемый IP, по умолчанию 0.0.0.0 -p, --port Прослушиваемый порт, по умолчанию 1080 -c, --max-conn Максимальное количество клиентских подключений, по умолчанию 512 -I --conn-ip Адрес, к которому будут привязаны исходящие соединения, по умолчанию :: При указании IPv4 адреса запросы на IPv6 будут отклоняться -b, --buf-size Максимальный размер данных, получаемых и отправляемых за один вызов recv/send Размер указывается в байтах, по умолчанию равен 16384 -g, --def-ttl Значение TTL для всех исходящий соединений Может быть полезен для обхода обнаружения нестандартного/уменьшенного TTL -N, --no-domain Отбрасывать запросы, если в качестве адреса указан домен Т.к. резолвинг выполняется синхронно, то он может замедлить или даже заморозить работу -K, --desync-known Отключить запутывание для нераспознанных протоколов Распознаваемые протоколы: HTTP и TLS с SNI -F, --tfo Включает TCP Fast Open Если сервер его поддерживает, то первый пакет будет отправлен сразу вместе с SYN Поддерживается только в Linux (4.11+) -A, --auto[=t,r,c,s,a] Автоматический режим Если произошло событие, похожее на блокировку или поломку, то будут применены параметры обхода, следующие за данной опцией Возможные события: torst : Вышло время ожидания или сервер сбросил подключение после первого запроса redirect: HTTP Redirect с Location, домен которого не совпадает с исходящим cl_err : HTTP ответ, код которого равен 40x, но не 429 sid_inv : session_id в TLS ServerHello и ClientHello не совпадают alert : TLS Error Alert в ответе По умолчанию обрабатывается только torst Можно указывать несколько групп опций, раделяя их данным параметром Если соединение успешно прошло, то параметры для данного IP будут закешированны Параметры, которые можно вынести в отдельную группу: split, disorder, oob, fake, ttl, ip-opt, md5sig, mod-http, tlsrec Пример: --auto=redirect --split=1+h --auto=torst --fake -1 --auto=sid_inv,alert --tlsrec 1+s -u, --cache-ttl Время жизни значения в кеше, по умолчанию 100800 (28 часов) -T, --timeout Таймаут ожидания первого ответа от сервера в секундах В Linux переводится в миллисекунды, поэтому можно указать дробное число Истечение таймаута будет обработано --auto -s, --split Разбить запрос по указанному смещению После числа можно добавить флаг: +s: добавить смещение SNI +h: добавить смещение Host Можно указывать несколько раз, чтобы разбить запрос по нескольким позициям При указании отрицательного значения к нему прибавляется размер пакета -d, --disorder Подобен --split, но части отправляются в обратном порядке ! Поведение в Windows отлично: сначала отправляется лишь часть, но затем целый запрос -o, --oob Подобен --split, но после части отсылается один или несколько байт OOB данных -f, --fake Подобен --disorder, только перед отправкой первого куска отправляется часть поддельного Количество байт отправляемого из фейка равно рамеру разбиваемой части -t, --ttl TTL для поддельного пакета, по умолчанию 8 Необходимо подобрать такое значение, чтобы пакет не дошел до сервера, но был обработан DPI -k, --ip-opt[=file|:str] Установить опции для фейкового IP пакета Существенно снизит вероятность, что пакет дойдет до сервера Стоит учесть, что до DPI он также может не дойти В Windows поддержка может быть отключена -S, --md5sig Установить опцию TCP MD5 Signature для фейкового пакета Большинство серверов (в основном на Linux) отбрасывают пакеты с данной опцией Поддерживается только в Linux, может быть выключен в некоторых сборках ядра (< 3.9, Android) -l, --fake-tls -j, --fake-http Указать свои поддельные пакеты, вместо дефолтных -e, --oob-data Данные, отсылаемые вне основного потока, по умолчанию один байт 'a' ! При размере более одного байта может работать нестабильно -n, --tls-sni Изменить SNI в fake пакете на указанный -M, --mod-http Всякие манипуляции с HTTP пакетом, можно комбинировать hcsmix: "Host: name" -> "hOsT: name" dcsmix: "Host: name" -> "Host: NaMe" rmspace: "Host: name" -> "Host:name\t" -r, --tlsrec Разделить ClientHello на отдельные записи по указанному смещению Можно указывать несколько раз ------- Сборка: Для сборки понадобится: make, gcc/clang для Linux, mingw для Windows # Linux $ make # Windows $ make windows CC=x86_64-w64-mingw32-gcc ----------------- Как это работает? Подробно описано тут: https://github.com/bol-van/zapret/blob/master/docs/readme.txt https://geneva.cs.umd.edu/papers/geneva_ccs19.pdf https://habr.com/ru/post/335436