Как обмануть провайдера и обойти 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, порт тот, что указан в настройках программы.
Известные баги
Из багов можно выделить то, что иногда, если фоновый сервис убила система и он не смог нормально завершиться, то при повторном старте сервиса он падает через несколько секунд. Решается тем, что выбирается другой порт в настройках программы.