Реализация некоторых способов запутывания 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 Автоматический режим Если сервер сбросил подключение, превышено время ожидания, сработал --tr, то будут применены параметры обхода, следующие за данной опцией Можно указывать несколько групп параметров, раделяя их данным флагом Если соединение успешно прошло, то параметры для данного IP будут закешированны Параметры, которые можно вынести в отдельную группу: split, disorder, oob, fake, ttl, ip-opt, md5sig, mod-http, tlsrec -u, --cache-ttl Время жизни значения в кеше, по умолчанию 100800 (28 часов) -T, --timeout Таймаут ожидания первого ответа от сервера в секундах В Linux переводится в миллисекунды, поэтому можно указать дробное число Истечение таймаута будет обработано --auto -P, --tr Поиск строки в первом ответе от сервера, начиная с s и заканчивая e Является триггером для --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 на отдельные записи по указанному смещению Можно указывать несколько раз -m, --mss Установить опцию MSS для TCP соединения Можно использовать для того, чтобы вынудить сервер разбить свой ответ При низких значениях сильно сказывается на скорости ------- Сборка: Для сборки понадобится: 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