Провайдеры Российской Федерации, в большинстве своем, применяют системы глубокого анализа трафика (DPI, Deep Packet Inspection) для блокировки сайтов, внесенных в реестр запрещенных.
Не существует единого стандарта на DPI, есть большое количество реализации от разных поставщиков DPI-решений, отличающихся по типу подключения и типу работы.
Существует два распространенных типа подключения DPI: пассивный и активный.
Пассивный DPI — DPI, подключенный в провайдерскую сеть параллельно (не в разрез) либо через пассивный оптический сплиттер, либо с использованием зеркалирования исходящего от пользователей трафика. Такое подключение не замедляет скорость работы сети провайдера в случае недостаточной производительности DPI, из-за чего применяется у крупных провайдеров. DPI с таким типом подключения технически может только выявлять попытку запроса запрещенного контента, но не пресекать ее. Чтобы обойти это ограничение и заблокировать доступ на запрещенный сайт, DPI отправляет пользователю, запрашивающему заблокированный URL, специально сформированный HTTP-пакет с перенаправлением на страницу-заглушку провайдера, словно такой ответ прислал сам запрашиваемый ресурс (подделывается IP-адрес отправителя и TCP sequence). Из-за того, что DPI физически расположен ближе к пользователю, чем запрашиваемый сайт, подделанный ответ доходит до устройства пользователя быстрее, чем настоящий ответ от сайта.
Выявляем и блокируем пакеты пассивного DPI Поддельные пакеты, формируемые DPI, легко обнаружить анализатором трафика, например, Wireshark. Пробуем зайти на заблокированный сайт:
Мы видим, что сначала приходит пакет от DPI, с HTTP-перенаправлением кодом 302, а затем настоящий ответ от сайта. Ответ от сайта расценивается как ретрансмиссия и отбрасывается операционной системой. Браузер переходит по ссылке, указанной в ответе DPI, и мы видим страницу блокировки.
В ответе DPI не устанавливается флаг «Don't Fragment», и в поле Identification указано 1. Серверы в интернете обычно устанавливают бит «Don't Fragment», и пакеты без этого бита встречаются нечасто. Мы можем использовать это в качестве отличительной особенности пакетов от DPI, вместе с тем фактом, что такие пакеты всегда содержат HTTP-перенаправление кодом 302, и написать правило iptables, блокирующее их:
Что это такое? Модуль 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 получал трафик от пользователей к заблокированным 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 Firefox/50.0 Accept-Encoding: gzip, deflate, br Connection: keep-alive
Запрос начинается с HTTP-метода, затем следует один пробел, после него указывается путь, затем еще один пробел, и заканчивается строка протоколом и переносом строки CRLF. Заголовки начинаются с большой буквы, после двоеточия ставится символ пробела.
Давайте заглянем в последнюю версию стандарта HTTP/1.1 от 2014 года. Согласно RFC 7230, HTTP-заголовки не зависят от регистра символов, а после двоеточия может стоять произвольное количество пробелов (или не быть их вовсе).
Each header field consists of a case-insensitive field name followed by a colon (":"), optional leading whitespace, the field value, and optional trailing whitespace.
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 Firefox/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. Этой рекомендации придерживаются далеко не все веб-серверы. Из-за двух пробелов между методом и путем ломаются некоторые сайты.
Спускаемся на уровень TCP Соединение TCP начинается с SYN-запроса и SYN/ACK-ответа. В запросе клиент, среди прочей информации, указывает размер TCP-окна (TCP Window Size) — количество байт, которые он готов принимать без подтверждения передачи. Сервер тоже указывает это значение. В интернете используется значение MTU 1500, что позволяет отправить до 1460 байтов данных в одном TCP-пакете. Если сервер указывает размер TCP-окна менее 1460, клиент отправит в первом пакете данных столько, сколько указано в этом параметре.
Если сервер пришлет TCP Window Size = 2 в SYN/ACK-пакете (или мы его изменим на это значение на стороне клиента), то браузер отправит HTTP-запрос двумя пакетами:
T / HTTP/1.1 Host: habrahabr.ru User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:49.0) Gecko/20100101 Firefox/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 вашего провайдера, но вы видите заглушку транзитного провайдера. В таких случаях нужно комбинировать все доступные способы.
Программа для обхода DPI Я написал программу для обхода DPI под Windows: GoodbyeDPI (скачать), см. описание, параметры запуска. Она умеет блокировать пакеты с перенаправлением от пассивного DPI, заменять Host на hoSt, удалять пробел между двоеточием и значением хоста в заголовке Host, «фрагментировать» HTTP и HTTPS-пакеты (устанавливать TCP Window Size), и добавлять дополнительный пробел между HTTP-методом и путем. Преимущество этого метода обхода в том, что он полностью автономный: нет внешних серверов, которые могут заблокировать.
По умолчанию активированы опции, нацеленные на максимальную совместимость с провайдерами, но не на скорость работы. Запустите программу следующим образом:
Если заблокированные сайты стали открываться, DPI вашего провайдера можно обойти. Попробуйте запустить программу с параметром -2 и зайти на заблокированный HTTPS-сайт. Если все продолжает работать, попробуйте режим -3 и -4 (наиболее быстрый). Некоторые провайдеры, например, Мегафон и Yota, не пропускают фрагментированные пакеты по HTTP, и сайты перестают открываться вообще. С такими провайдерами используйте опцию -3 -a
!
Актуальную версию GoodbyeDPI можно скачать также и здесь:
текст из окна Blockcheck почему-то не копируется. Как его скопировать чтобы Вам прислать?
Нажмите Ctrl+C.
ValdikSS писал(а):
Цитата:
Не хочет функционировать. Ругается на отсутствие цифровой подписи у драйвера WinDivert64.sys Пробовал отключить проверку подписи. Но у меня это не срабатывает. Как быть?
Новая возможность: изменение регистра для значения заголовка Host (test.com -> tEsT.cOm); Новая возможность: находить и обрабатывать HTTP-трафик на порту, отличном от 80; Новая возможность: добавление собственных портов TCP для обработки программой; Новая экспериментальная возможность: перенаправление DNS-запросов на заданный IP-адрес и порт.
Добавление собственных портов TCP должно помочь в разблокировке торрент-анонсеров на нестандартом порту, а перенаправление DNS пригодится пользователям с провайдерами, которые подменяют DNS-ответы и перенаправляют сторонние DNS-серверы на свой, при использовании DNS-серверов на нестандартом порту (77.88.8.8:1253)
В общем, у кого блокируются анонсеры некоторых торрент-трекеров, попробуйте запустить программу следующей командой:
* Добавлена функция модификации заголовков HTTP только для доменов из списка (blacklist) Теперь программа не будет добавлять проблем незаблокированным сайтам. Blacklist-файл работает как файл зоны, т.е. модификация HTTP-заголовков применяется ко всем поддоменам внесенного в список домена.
* Скрипты для удобного запуска программы Добавлены скрипты для обновления blacklist и запуска программы с самыми популярными параметрами. 1_russia_blacklist_dnsredir.cmd — запускает программу с опцией "-1" и включенными перенаправлением трафика DNS на нестандартный порт Яндекс.DNS, а также обрабатывает только домены из списка blacklist.txt. Удобный способ для провайдеров, модифицирующих ответы DNS и/или перенаправляющих DNS на свой. 1_russia_blacklist.cmd — то же самое, только без перенаправления трафика DNS. Для провайдеров, не вмешивающихся в DNS-ответы.
ValdikSS 20 Дек 2017 писал(а):
GoodbyeDPI v0.1.3. * Новый способ фрагментации длительных (persistent, keep-alive) HTTP-соединений. Опции -1 и -2 теперь используют его по умолчанию.
ValdikSS 20 Дек 2017 писал(а):
В GoodbyeDPI v0.1.4 добавлена возможность запуска службой Windows. Используйте скрипты service_install*.cmd и service_remove.cmd.
Bugfix: skip loopback and impostor packets injected by other WFP software. Fixes Malwarebytes Web Protection and GoodbyeDPI DNS redirection incompatibility (#53).
ValdikSS 31 Окт 2019 писал(а):
GoodbyeDPI v0.1.6 Новая функция: отправка фейковых HTTP/HTTPS-запросов (опции --set-ttl и --wrong-chksum). На удивление эффективный метод, работает с теми DPI, на которых GoodbyeDPI раньше не работал: ТТК, мобильный Теле2, новый суверенный DPI Ростелекома-Урал, Turk Telekom. https://github.com/ValdikSS/GoodbyeDPI/releases
ValdikSS 25 Дек 2021 писал(а):
GoodbyeDPI v0.1.7 New feature: --native-frag non-Window-Size TCP segmentation and it's companion --reverse-frag, which sends segments in the reverse order to workaround TLS terminators issues with fragmented packets. This is faster and more compatible than using Window Size shrinking.
Bugfix: Fix fake packet handling without other modifying parameters
Fake Packet with wrong SEQ/ACK numbers (--wrong-seq)
New features:
--blacklist option now also applies to TLS (HTTPS websites)
Automatic TTL value picker for set-ttl Fake Packet mode (--auto-ttl) ← very convenient
New modern mode sets (more stable, more compatible, faster): -5 (now default) with native reversed fragmentation and fake packet auto-ttl, and -6 with wrong-seq instead of auto-ttl.
Other changes:
Fake Packet mode (--set-ttl, --wrong-chksum, --wrong-seq) now applies each method to each packet separately, and doesn't combine all methods for a single packet.
У кого перестали открываться HTTPS-сайты за последнюю неделю, пожалуйста, предоставьте мне доступ к вашему интернет-каналу. Можно сделать это через VPN, можно через SSH на виртуальную машину — не принципиально.
ValdikSS 26 декабря 2018 писал(а):
Если ваш провайдер использует DPI, но GoodbyeDPI не разблокирует сайты или разблокирует только частично, либо если сайты перестают открываться вовсе, предлагаю предоставить мне свой интернет-канал, для тестирования разных новых способов обхода DPI и улучшения программы.
Необходимо будет запустить и держать запущенной легковесную (256 MB диска и 256 MB оперативной памяти) виртуальную машину, желательно на отдельном компьютере или сервере, который доступен хотя бы 20 часов в сутки. Потребление трафика ожидается небольшое — до 1 ГБ в месяц. Нагрузка на процессор незначительная. Оставляйте заявки на вступление в группу по ссылке: https://bit.ly/2AfVxlY - необходима учетная запись Google.
В комментарии к заявке укажите ваш регион, название провайдера (и предыдущее название, если провайдера купил более крупный), есть ли возможность запуска виртуальной машины на выделенном компьютере круглосуточно.
Даже если у вас GoodbyeDPI работает нормально, или вы пользуетесь Linux/macOS и готовы предоставить канал — подавайте заявку. Чем больше провайдеров удастся протестировать, тем лучше. В конце января ожидается версия программы для Linux/macOS.
ValdikSS 22 Сен 2019 писал(а):
Сделал специальную версию Blockcheck, для проведения эксперимента с обходом DPI для HTTPS-запросов. Просьба скачать и запустить эту версию, прежде всего тем, у кого GoodbyeDPI не работает с HTTPS-сайтами (особенно на проводном МТС и подобных провайдерах, где включение GoodbyeDPI приводит к недоступности ВСЕХ HTTPS-сайтов).
Эффективное проксирование для обхода блокировок по IP В случае блокировок по IP-адресу, провайдеры фильтруют только исходящие запросы на IP-адреса из реестра, но не входящие пакеты с этих адресов. Программа ReQrypt работает как эффективный прокси-сервер: исходящие от клиента пакеты отправляются на сервер ReQrypt в зашифрованном виде, сервер ReQrypt пересылает их серверу назначения с подменой исходящего IP-адреса на клиентский, сервер назначения отвечает клиенту напрямую, минуя ReQrypt.
Если наш компьютер находится за NAT, мы не можем просто отправить запрос на сервер ReQrypt и ожидать ответа от сайта. Ответ не дойдет, т.к. в таблице NAT не создана запись для этого IP-адреса. Для «пробива» NAT, ReQrypt отправляет первый пакет в TCP-соединении напрямую сайту, но с TTL = 3. Он добавляет запись в NAT-таблицу роутера, но не доходит до сайта назначения.
Долгое время разработка была заморожена из-за того, что автор не мог найти сервер с возможностью спуфинга. Спуфинг IP-адресов часто используется для амплификации атак через DNS, NNTP и другие протоколы, из-за чего он запрещен у подавляющего большинства провайдеров. Но сервер все-таки был найден, хоть и не самый удачный. Разработка продолжается.
Заключение и TL;DR GoodbyeDPI — программа под Windows, позволяющая обходить пассивные и активные DPI. Просто скачайте и запустите ее, и заблокированные сайты станут снова доступны.
Для Linux и роутеровесть аналогичное — zapret от bol-van, а также DPITunnel-cli
Цитата:
Грубо говоря, использует vpnservice или рут и перенаправляет трафик на свой локальный прокси. А там уже так же, как и goodbyedpi. Только тут была одна маленькая проблема: без рут прав была доступна только опция фрагментации пакетов. Это ограничение андроида и линукса. К сожалению, такой метод мало что поможет обойти. Поэтому я решил переписать это все дело, только теперь с использованием рут прав. Получилось это https://github.com/zhenyolka/DPITunnel-clihttps://github.com/nomoresat/DPITunnel-cli Это консольная прога, которая копирует работу goodbyedpi, но предназначена для линукса. Она ещё в стадии развития, но уже хорошо работает на ПК на линуксе, на рутованых андроидах, приставках с андрюшей, некоторый роутерах на arm и т.д. Эта штука также запускает прокси сервер и потом может фрагментировать запросы, отправлять фейковые и т.д. через raw сокеты. Короче, много всего. Но главное, что теперь, в отличие от dpitunnel она может обойти очень многие DPI, очень мало подключений, где она не работает. Может обойти ТСПУ.
Там же в блоке Similar projects смотрите все альтернативы для всех операционных систем, включаяmacOS.
Определить тип блокировки сайтов можно программой Blockcheck. Если в тестах DPI вы видите, что сайты открываются, или видите строку «обнаружен пассивный DPI», то GoodbyeDPI вам поможет. Если нет, используйте кроссплатформенную программу ReQrypt, если ваш провайдер блокирует сайты по IP-адресу.
Пожалуйста, не пишите в этом топике о надстройках к браузерам и прочих методах обхода блокировок, не связанных с вопросами по GoodbyeDPI и ReQrypt. Пожалуйста, не пишите в этом топике багрепорты и просьбы по изменению функционала ReQrypt, обращайтесь к его разработчику basil00 на GitHub'е. Пожалуйста, не захлямляйте топик, не добавляйте работы модераторам, и тем самым не мешайте людям найти полезную информацию по теме.
У меня ютуб после нового способа с хешем заработал, но twitch отвалился и не работает, пока я сервисы не удалю. Внёс домены и всё равно не грузит. Есть решение?
ozr1
Uploader 100+
Стаж: 3 года 7 мес.
Сообщений: 133
Ratio: 6355.89
Раздал: 122.8 TB
100%
galova писал(а):
есть мнение что циферку после --fake-from-hex нужно генерировать свою рандомайзером. полагаю, чтобы не давать закономерность для настройки анализа
Всё-таки лучше генерировать не белый шум, а осмысленное (и валидное при этом) значение конкретных полей этой части пакета. Для этого следует установить снифер WireShark, в котором перехватывать пакеты на 443-й (HTTPS) порт и отображать только те из них, которые содержат SNI-хендшейк. Последовательность действий для отображения пакетов (фильтрация пакетов на 443-й порт TCP настраивается до показанных действий -- собственно, это фильтр "tcp port 443" без кавычек) и сброса в буфер обмена 16-ричного кода для подстановки в "--fake-from-hex" указана здесь (развернуть спойлер для отображения скриншота). При каждом новом запуске curl'а генерируется пакет с валидным псевдорандомным содержимым. Обращаться при этом из curl'а следует к любым незабаненным гугловским (это важно, т.к. аппаратура ТСПУ РКН настроена на пропуск именно таких пакетов) сайтам. Лучше -- на www, drive, docs, translate и т.п. широкоиспользуемые в домене google.com, для генерации кода брать пакеты TLSv1.3 (а не, скажем, TLSv1). Можно curl запустить несколько раз подряд -- пока в WireShark'е не отобразится пакет именно TLSv1.3, из которого и получать код по изложенной на скриншоте методике.
Сгенерированный таким образом код лучше не разглашать: в этом случае вероятность его бана со стороны РКН будет стремиться к нулю до тех пор, пока не забанят сам сайт.
Вышло изменение от пользователя, добавляющее опцию "--fake-with-sni домен" на замену опции "--fake-from-hex код". Отличается тем, что "--fake-with-sni" генерирует псевдорандомное заполнение полей в коде вместо статики в "--fake-from-hex" и позволяет обойтись без предварительной генерации кода (т.е. не требует его генерации с помощью перехвата пакетов снифером). Попробовал в Билайне -- пашет (в качестве домена указывал www.google.com). Качать отсюда: 64-битная версия, 32-битная версия (из архива нужен только exe-файл, прочие файлы не менялись). Обсуждается здесь.
Duhmen96
Стаж: 12 лет 4 мес.
Сообщений: 28
Ratio: 12.182
16.31%
Может кому пригодится, РТ Екб, GoodCheck_v1.3.02_by Ori помог.
Admin ByeDPI Перестал работать на Ростелеком.. Раньше было все отлично
st_levi
Стаж: 16 лет 6 мес.
Сообщений: 180
Ratio: 16.659
Поблагодарили: 170
7.16%
стримы тупят (подгружаются через 20-30 секунд)- это нормально? билайн
ozr1
Uploader 100+
Стаж: 3 года 7 мес.
Сообщений: 133
Ratio: 6355.89
Раздал: 122.8 TB
100%
st_levi Попробуйте вот это. У меня в Билайне сейчас с ним всё летает. Единственное, что изменил относительно предлагаемого в первом сообщении той темы, -- это удалил из параметров запуска всё, что относится к Дискорду -- за неимением.
st_levi
Стаж: 16 лет 6 мес.
Сообщений: 180
Ratio: 16.659
Поблагодарили: 170
7.16%
на 5 пункте ничего не запускается - окно закрывается сразу. должно появиться окно zapret: ?
ozr1
Uploader 100+
Стаж: 3 года 7 мес.
Сообщений: 133
Ratio: 6355.89
Раздал: 122.8 TB
100%
st_levi Должно появиться стандартное DOS-окно -- как при запуске cmd.exe (собственно, здесь cmd.exe и запускается, из которого затем стартует этот .cmd-файл). Можно попробовать запустить из-под админа cmd.exe, в открывшемся окне командами "диск:' и "cd \полный_путь" перейти в папку с батником и уже из этой папки запустить .cmd-файл (в батнике при этом убрать "start "zapret: http,https,quic" /min", чтобы ещё одно окно не открывалось). Или просто "pause" в конце батника поставить. Тогда хотя бы можно будет прочитать диагностику (если таковая есть).
Возможно, запуску мешает антивирус: там неподписанный драйвер запускается, а антивирус или непатченная винда могут это блокировать. Можно вместо двух имеющихся файлов windivert*.* положить в папку запуска одноимённые файлы из папки с 64-битным GoodbyeDPI: на них винда не ругается насчёт отсутствия подписи.
И на 32-битной винде это работать не будет: требуется 64-битная.
Duhmen96
Стаж: 12 лет 4 мес.
Сообщений: 28
Ratio: 12.182
16.31%
wicos писал(а):
Admin ByeDPI Перестал работать на Ростелеком.. Раньше было все отлично
GoodCheck_v1.3.02_by Ori - без этой утилиты похоже сейчас стандартные настройки не подобрать так просто.
1qwerty1
Стаж: 15 лет 2 мес.
Сообщений: 89
Ratio: 4.812
Поблагодарили: 4
4.43%
Товарищи, а что известный трекер и ннм нынче работают без всего? Разблокировали?
переставил тут винду, без всяких гудбайдпй, и все работает в эдже дефолтном, я как-то сначала скачал торрент, а потом подумал, а как я скачал, как я вообще зашел сюда!
Сегодня с утра были некоторые проблемы, но сейчас опять всё работает, и Launcher for Zapret, и GoodbyeDPI. Ростелеком Поволжье.
Hibor
Стаж: 13 лет 9 мес.
Сообщений: 359
Ratio: 738.375
100%
Как-то странно, со второй половины дня GoodbyeDPI пропускает сюда на ННМ только если включен "для всех сайтов", хотя nnnclub.to etc прописан в листе и ранее ходил с "только для..." Связываю это с сегодняшней блокировкой РКН ECH, но куда копать и что править пока не представляю (днс гугловские и клаудфларе пробовал ставить, переключать DoT для них). Может кто подскажет вариант остаться "на листе", а не "для всех"?
"белого списка" ведь в GoodbyeDPI нет :(
p.s. все, решено, работает и с ч.списком, без "для всех":
xXaoCc писал(а):
для обхода нужно добавить cloudflare-ech.com в myblacklist