Что такое DPI?
DPI (Deep Packet Inspection) — технология, позволяющая собирать статистическую информацию из пакетов, проверять их и, конечно же, фильтровать информацию, в зависимости от содержимого пакета. Иногда операторы фильтруют с помощью этой технологии целые протоколы, такие как BitTorrent.
Различают два типа DPI: пассивный и активный. Разница лишь в том, что активный может заблокировать пакет и не дать ему дойти до адресата, а пассивный только лишь отправить фейковый пакет с редиректом или сбросом соединения. Способы обхода обоих схожи.
Как обмануть DPI?
Системы анализа пакетов сконструированы так, чтобы обрабатывать трафик с максимально возможной скоростью, исследуя только часто встречающиеся запросы и пропуская нетипичные, даже если они полностью соответствуют стандарту.
HTTP
Типичный HTTP запрос (такой отправляют все известные браузеры) выглядит следующим образом:
Все заголовки начинаются с большой буквы, далее двоеточие, затем один пробел, значение заголовка и конец строки в виде CRLF (\r\n).
Заглянем в RFC 7230:
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 запросы на свой сервер и если сайт заблокирован, отправляют некорректный ответ. Решается использованием протокола DoH.
Методы обхода DPI на android
Для Windows и Linux уже существуют решения вроде GoodbyeDPI и GreenTunnel, но для android до недавнего времени ничего такого не было, поэтому я решил сделать свою программу, и получился DPI Tunnel.
Работает эта штука как локальный HTTP прокси, на который направляет весь трафик системы и модифицирует его с использованием вышеперечисленных способов. Если и они не сработают, то есть поддержка socks5 прокси, который используется только для заблокированных сайтов и не замедляет работу остальных.
Как использовать
Если есть root, то в настройках программы выбрать «Установить DPITunnel прокси глобально» и нажать кнопку на главном экране, если root нет, то нажать кнопку на главном экране и выставить прокси в ручную в настройках Wi-Fi или APN. Адрес прокси: 127.0.0.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