Вы находитесь на странице: 1из 7

19.08.

2017 Автономный способ обхода DPI и эффективный способ обхода блокировок сайтов по IP-адресу / Хабрахабр

Автономный способ обхода DPI и


эффективный способ обхода блокировок
сайтов по IP-адресу
Сетевые технологии

Провайдеры Российской Федерации, в большинстве своем, применяют системы глубокого


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

Существует два распространенных типа подключения DPI: пассивный и активный.

Пассивный DPI
Пассивный DPI — DPI, подключенный в провайдерскую сеть параллельно (не в разрез) либо
через пассивный оптический сплиттер, либо с использованием зеркалирования исходящего
от пользователей трафика. Такое подключение не замедляет скорость работы сети
провайдера в случае недостаточной производительности DPI, из-за чего применяется у
крупных провайдеров. DPI с таким типом подключения технически может только выявлять
попытку запроса запрещенного контента, но не пресекать ее. Чтобы обойти это ограничение
и заблокировать доступ на запрещенный сайт, DPI отправляет пользователю,
запрашивающему заблокированный URL, специально сформированный HTTP-пакет с
перенаправлением на страницу-заглушку провайдера, словно такой ответ прислал сам
запрашиваемый ресурс (подделывается IP-адрес отправителя и TCP sequence). Из-за того,
что DPI физически расположен ближе к пользователю, чем запрашиваемый сайт,
подделанный ответ доходит до устройства пользователя быстрее, чем настоящий ответ от
сайта.

Выявляем и блокируем пакеты пассивного DPI


Поддельные пакеты, формируемые DPI, легко обнаружить анализатором трафика,
например, Wireshark.
Пробуем зайти на заблокированный сайт:

https://habrahabr.ru/post/335436/ 1/7
19.08.2017 Автономный способ обхода DPI и эффективный способ обхода блокировок сайтов по IP-адресу / Хабрахабр

Мы видим, что сначала приходит пакет от DPI, с HTTP-перенаправлением кодом 302, а


затем настоящий ответ от сайта. Ответ от сайта расценивается как ретрансмиссия и
отбрасывается операционной системой. Браузер переходит по ссылке, указанной в ответе
DPI, и мы видим страницу блокировки.

Рассмотрим пакет от DPI подробнее:

HTTP/1.1 302 Found


Connection: close
Location: http://warning.rt.ru/?id=17&st=0&dt=195.82.146.214&rs=http%3A%2F%2Fr
utracker.org%2F

В ответе DPI не устанавливается флаг «Don't Fragment», и в поле Identification указано 1.


Серверы в интернете обычно устанавливают бит «Don't Fragment», и пакеты без этого бита
встречаются нечасто. Мы можем использовать это в качестве отличительной особенности
пакетов от DPI, вместе с тем фактом, что такие пакеты всегда содержат HTTP-
перенаправление кодом 302, и написать правило iptables, блокирующее их:

# iptables -A FORWARD -p tcp --sport 80 -m u32 --u32 "0x4=0x10000 && 0x60=0x77


61726e && 0x64=0x696e672e && 0x68=0x72742e72" -m comment --comment "Rostelecom
HTTP" -j DROP

https://habrahabr.ru/post/335436/ 2/7
19.08.2017 Автономный способ обхода DPI и эффективный способ обхода блокировок сайтов по IP-адресу / Хабрахабр

Что это такое? Модуль u32 iptables позволяет выполнять битовые операции и операции
сравнения над 4-байтовыми данными в пакете. По смещению 0x4 хранится 2-байтное поле
Indentification, сразу за ним идут 1-байтные поля Flags и Fragment Offset.
Начиная со смещения 0x60 расположен домен перенаправления (HTTP-заголовок Location).
Если Identification = 1, Flags = 0, Fragment Offset = 0, 0x60 = «warn», 0x64 = «ing.», 0x68 =
«rt.ru», то отбрасываем пакет, и получаем настоящий ответ от сайта.

В случае с HTTPS-сайтами, DPI присылает TCP Reset-пакет, тоже с Identification = 1 и Flags =


0.

Активный DPI
Активный DPI — DPI, подключенный в сеть провайдера привычным образом, как и любое
другое сетевое устройство. Провайдер настраивает маршрутизацию так, чтобы DPI получал
трафик от пользователей к заблокированным IP-адресам или доменам, а DPI уже принимает
решение о пропуске или блокировке трафика. Активный DPI может проверять как
исходящий, так и входящий трафик, однако, если провайдер применяет DPI только для
блокирования сайтов из реестра, чаще всего его настраивают на проверку только
исходящего трафика.

Системы DPI разработаны таким образом, чтобы обрабатывать трафик с максимально


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

Изучаем стандарт HTTP


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

GET / HTTP/1.1
Host: habrahabr.ru
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:49.0) Gecko/20100101 Firef
ox/50.0
Accept-Encoding: gzip, deflate, br
Connection: keep-alive

Запрос начинается с HTTP-метода, затем следует один пробел, после него указывается путь,
затем еще один пробел, и заканчивается строка протоколом и переносом строки CRLF.
Заголовки начинаются с большой буквы, после двоеточия ставится символ пробела.

Давайте заглянем в последнюю версию стандарта HTTP/1.1 от 2014 года. Согласно RFC
7230, HTTP-заголовки не зависят от регистра символов, а после двоеточия может стоять
произвольное количество пробелов (или не быть их вовсе).

https://habrahabr.ru/post/335436/ 3/7
19.08.2017 Автономный способ обхода DPI и эффективный способ обхода блокировок сайтов по IP-адресу / Хабрахабр

Each header field consists of a case-insensitive field name followed


by a colon (":"), optional leading whitespace, the field value, and
optional trailing whitespace.

header-field = field-name ":" OWS field-value OWS

field-name = token
field-value = *( field-content / obs-fold )
field-content = field-vchar [ 1*( SP / HTAB ) field-vchar ]
field-vchar = VCHAR / obs-text

obs-fold = CRLF 1*( SP / HTAB )


; obsolete line folding

OWS — опциональный один или несколько символов пробела или табуляции, SP —


одинарный символ пробела, HTAB — табуляция, CRLF — перенос строки и возврат каретки
(\r\n).

Это значит, что запрос ниже полностью соответствует стандарту, его должны принять многие
веб-серверы, придерживающиеся стандарта:

GET / HTTP/1.1
hoSt:habrahabr.ru
user-agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:49.0) Gecko/20100101 Firef
ox/50.0
Accept-Encoding: gzip, deflate, br
coNNecTion: keep-alive ← здесь символ табуляции между двоеточием и зн
ачением

На деле же, многие веб-серверы не любят символ табуляции в качестве разделителя, хотя
подавляющее большинство серверов нормально обрабатывает и отсутствие пробелов
между двоеточием в заголовках, и множество пробелов.

Старый стандарт, RFC 2616, рекомендует снисходительно парсить запросы и ответы


сломанных веб-северов и клиентов, и корректно обрабатывать произвольное количество
пробелов в самой первой строке HTTP-запросов и ответов в тех местах, где требуется
только один:

Clients SHOULD be tolerant in parsing the Status-Line and servers tolerant when parsing the
Request-Line. In particular, they SHOULD accept any amount of SP or HT characters
between fields, even though only a single SP is required.

https://habrahabr.ru/post/335436/ 4/7
19.08.2017 Автономный способ обхода DPI и эффективный способ обхода блокировок сайтов по IP-адресу / Хабрахабр

Этой рекомендации придерживаются далеко не все веб-серверы. Из-за двух пробелов


между методом и путем ломаются некоторые сайты.

Спускаемся на уровень TCP


Соединение TCP начинается с SYN-запроса и SYN/ACK-ответа. В запросе клиент, среди
прочей информации, указывает размер TCP-окна (TCP Window Size) — количество байт,
которые он готов принимать без подтверждения передачи. Сервер тоже указывает это
значение. В интернете используется значение MTU 1500, что позволяет отправить до 1460
байтов данных в одном TCP-пакете.
Если сервер указывает размер TCP-окна менее 1460, клиент отправит в первом пакете
данных столько, сколько указано в этом параметре.

Если сервер пришлет TCP Window Size = 2 в SYN/ACK-пакете (или мы его изменим на это
значение на стороне клиента), то браузер отправит HTTP-запрос двумя пакетами:

Пакет 1:

GE

Пакет 2:

T / HTTP/1.1
Host: habrahabr.ru
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:49.0) Gecko/20100101 Firef
ox/50.0
Accept-Encoding: gzip, deflate, br
Connection: keep-alive

Используем особенности HTTP и TCP для обхода активного DPI


Многие решения DPI ожидают заголовки только в стандартном виде.
Для блокировки сайтов по домену или URI, они ищут строку "Host: " в теле запроса. Стоит
заменить заголовок «Host» на «hoSt» или убрать пробел после двоеточия, и перед вами
открывается запрошенный сайт.
Не все DPI можно обмануть таким простым трюком. DPI некоторых провайдеров корректно
анализируют HTTP-заголовки в соответствии со стандартом, но не умеют собирать TCP-
поток из нескольких пакетов. Для таких DPI подойдет «фрагментирование» пакета, путем
искусственного уменьшения TCP Window Size.

В настоящий момент, в РФ DPI устанавливают и у конечных провайдеров, и на каналах


транзитного трафика. Бывают случаи, когда одним способом можно обойти DPI вашего
провайдера, но вы видите заглушку транзитного провайдера. В таких случаях нужно
https://habrahabr.ru/post/335436/ 5/7
19.08.2017 Автономный способ обхода DPI и эффективный способ обхода блокировок сайтов по IP-адресу / Хабрахабр

комбинировать все доступные способы.

Программа для обхода DPI


Я написал программу для обхода DPI под Windows: GoodbyeDPI.
Она умеет блокировать пакеты с перенаправлением от пассивного DPI, заменять Host на
hoSt, удалять пробел между двоеточием и значением хоста в заголовке Host,
«фрагментировать» HTTP и HTTPS-пакеты (устанавливать TCP Window Size), и добавлять
дополнительный пробел между HTTP-методом и путем.
Преимущество этого метода обхода в том, что он полностью автономный: нет внешних
серверов, которые могут заблокировать.

По умолчанию активированы опции, нацеленные на максимальную совместимость с


провайдерами, но не на скорость работы. Запустите программу следующим образом:

goodbyedpi.exe -1 -a

Если заблокированные сайты стали открываться, DPI вашего провайдера можно обойти.
Попробуйте запустить программу с параметром -2 и зайти на заблокированный HTTPS-сайт.
Если все продолжает работать, попробуйте режим -3 и -4 (наиболее быстрый).
Некоторые провайдеры, например, Мегафон и Yota, не пропускают фрагментированные
пакеты по HTTP, и сайты перестают открываться вообще. С такими провайдерами
используйте опцию -3 -a

Эффективное проксирование для обхода блокировок по IP


В случае блокировок по IP-адресу, провайдеры фильтруют только исходящие запросы на IP-
адреса из реестра, но не входящие пакеты с этих адресов.
Программа ReQrypt работает как эффективный прокси-сервер: исходящие от клиента пакеты
отправляются на сервер ReQrypt в зашифрованном виде, сервер ReQrypt пересылает их
серверу назначения с подменой исходящего IP-адреса на клиентский, сервер назначения
отвечает клиенту напрямую, минуя ReQrypt.

Если наш компьютер находится за NAT, мы не можем просто отправить запрос на сервер
ReQrypt и ожидать ответа от сайта. Ответ не дойдет, т.к. в таблице NAT не создана запись
для этого IP-адреса.
Для «пробива» NAT, ReQrypt отправляет первый пакет в TCP-соединении напрямую сайту,

https://habrahabr.ru/post/335436/ 6/7
19.08.2017 Автономный способ обхода DPI и эффективный способ обхода блокировок сайтов по IP-адресу / Хабрахабр

но с TTL = 3. Он добавляет запись в NAT-таблицу роутера, но не доходит до сайта


назначения.

Долгое время разработка была заморожена из-за того, что автор не мог найти сервер с
возможностью спуфинга. Спуфинг IP-адресов часто используется для амплификации атак
через DNS, NNTP и другие протоколы, из-за чего он запрещен у подавляющего большинства
провайдеров. Но сервер все-таки был найден, хоть и не самый удачный. Разработка
продолжается.

Заключение и TL;DR
GoodbyeDPI — программа под Windows, позволяющая обходить пассивные и активные DPI.
Просто скачайте и запустите ее, и заблокированные сайты станут снова доступны.
Для Linux есть аналогичная программа — zapret.

Используйте кроссплатформенную программу ReQrypt, если ваш провайдер блокирует


сайты по IP-адресу.

Определить тип блокировки сайтов можно программой Blockcheck. Если в тестах DPI вы
видите, что сайты открываются, или видите строку «обнаружен пассивный DPI», то
GoodbyeDPI вам поможет. Если нет, используйте ReQrypt.

Дополнительная полезная информация есть здесь и здесь.

https://habrahabr.ru/post/335436/ 7/7