May 6, 2020

Как обмануть провайдера и обойти DPI на Android

DPI (Deep Packet Inspection) - технология, позволяющая собирать статистическую информацию из пакетов, проверять их и фильтровать информацию, в зависимости от содержимого пакета. Иногда операторы фильтруют с помощью этой технологии целые протоколы, такие как BitTorrent.

Различают два типа DPI: пассивный и активный. Разница лишь в том, что активный может заблокировать пакет и не дать ему дойти до адресата, а пассивный только лишь отправить фейковый пакет с редиректом или сбросом соединения. Способы обхода обоих схожи.


Методы обхода DPI

Системы анализа пакетов сконструированы так, чтобы обрабатывать трафик с максимально возможной скоростью, исследуя только часто встречающиеся запросы и пропуская нетипичные, даже если они полностью соответствуют стандарту.

HTTP

Типичный HTTP запрос (такой отправляют все известные браузеры) выглядит следующим образом:

GET /index.php HTTP/1.1
Host: ru.wikipedia.org
User-Agent: Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9b5) Gecko/2008050509 Firefox/3.0b5
Accept: text/html
Connection: keep-alive

Все заголовки начинаются с большой буквы, далее двоеточие, затем один пробел, значение заголовка и конец строки в виде CRLF (\r\n).

Заглянем в RFC 7230:

Each header field consists of a case-insensitive field name followed
by a colon (":"), optional leading whitespace, the field value, and
optional trailing whitespace.

Согласно нему, заголовки не чувствительны к регистру, а после двоеточия может быть любое число пробелов. Это значит, что сломать DPI можно с помощью изменения «Host:» на «hOsT:». Большинство серверов примет пакет и если заменить символ конца строки с CRLF (\r\n) на LF (\n).

HTTPS

В случае с HTTPS, DPI ищут незашифрованное поле SNI, в котором содержится адрес сайта. Можно было бы изменить поле SNI, но для этого придётся модифицировать системные библиотеки, поэтому для обхода блокировок по HTTPS используется фрагментация пакетов, которая, кстати, может использоваться и для HTTP. Суть в том, что почти все DPI умеют работать только с отдельно взятыми пакетами, а читать всё соединение они не умеют, поэтому достаточно отправить запрос к сайту в виде нескольких TCP пакетов.

DNS

Все предыдущие методы бесполезны, если адрес сайта неверно определился на уровне DNS сервера. Дело в том, что многие операторы перенаправляют все DNS запросы на свой сервер и если сайт заблокирован, отправляют некорректный ответ. Решается использованием протокола DNS over HTTPS.


Как обмануть и обойти DPI

Для Windows и Linux уже существуют решения вроде GoodbyeDPI и GreenTunnel, но для android до недавнего времени ничего такого не было, лишь недавно появился DPITunnel.

Работает эта штука как локальный HTTP прокси, на который направляется весь трафик системы и модифицируется с использованием вышеперечисленных способов. Если и они не сработают, то есть поддержка socks5 прокси, который используется только для заблокированных сайтов и не замедляет работу остальных.

Как использовать DPITunnel

Если есть root, то в настройках программы выбрать «Установить DPITunnel прокси глобально» и нажать кнопку на главном экране, если root нет, то нажать кнопку на главном экране и выставить прокси в ручную в настройках WiFi или APN. Адрес прокси: 127.0.0.1, порт тот, что указан в настройках программы.

Известные баги

Из багов можно выделить то, что иногда, если фоновый сервис убила система и он не смог нормально завершиться, то при повторном старте сервиса он падает через несколько секунд. Решается тем, что выбирается другой порт в настройках программы.


https://t.me/h4ckers_zone