Представь, что на пути твоего интернет-трафика стоит пограничный контроль — система DPI (Deep Packet Inspection)
Эта система проверяет каждый пакет данных, который ты отправляешь и получаешь
Принципально существуют 2 типа DPIОчень условно (мы не знаем алгоритмов наверняка) это работает так - сервер получает данные с пакетом от вашего роутера и видит определённые закономерности, которые по определённым фильтрам отбрасываются коробочкой ТСПУ
Задача Zapret — обмануть DPI, чтобы он не понял, куда ты идешь
Представь, что ты хочешь пронести через границу запрещенный предмет. Если ты попытаешься пронести его целиком, тебя поймают. Но что, если разобрать его на части и пронести по отдельности?
Zapret делает то же самое с запросами к заблокированным сайтам. Он разбивает запрос на мелкие кусочки (TCP-сегменты) так, чтобы DPI не смог распознать, что это запрос к запрещенному сайту.
Например, вместо GET / HTTP/1.1\r\nHost: blocked.com он отправит сначала GET, а потом / HTTP/1.1\r\nHost: blocked.com.Zapret может добавлять к запросу лишние данные, которые не нужны для работы сайта, но сбивают DPI с толку. Это как положить в сумку с запрещенным предметом много ненужных вещей, чтобы запутать досмотр. Эти "мусорные" данные могут быть оформлены как отдельный пакет (режим fake в nfqws), который DPI примет за настоящий запрос. В режиме fakedsplit (nfqws) "мусор" добавляется к оригинальным сегментам запроса, чтобы запутать DPI еще сильнее.
Чтобы "мусорный" пакет не дошел до сервера (иначе он может сломать соединение), используются разные уловки
Обычно все части пакета отправляются по порядку: 1, 2, 3, 4. Но что, если отправить их в другом порядке, например, 2, 4, 1, 3? Этот пакет всё равно можно прочитать, но тот, кто попытается подсмотреть содержимое по пути, запутается.
TCP disorder — это как раз отправка частей "письма" (TCP-сегментов) в измененном порядке
Как это делает tpwstpws — это как почтовое отделение, которое умеет хитрые трюки. Когда запрос отправляется на заблокированный сайт, tpws разбивает его на части (сегменты)
Обычно эти части отправляются по порядку. Но tpws делает вот что: он отправляет каждый второй сегмент с пометкой "Срочно, но не доставлять!" (на самом деле, он выставляет TTL=1, из-за чего пакет "умрет" по пути).
Сервер, получив четные сегменты, не понимает, где остальные, и просит прислать их еще раз.
В итоге, к серверу сегменты приходят в измененном порядке, например: 2, 4, 6, 1, 3, 5. Сервер собирает их воедино и отдает нужную страницу. А DPI, который видит только отдельные куски, не может понять, что это был запрос на заблокированный сайт.
Как это делает nfqwsnfqws — это как специально обученный почтальон, который перехватывает твои письма, разрезает их на части и может отправить их в любом порядке, указанным тобой.
В режиме multidisorder nfqws отправляет сегменты в обратном порядке, например: 4, 3, 2, 1.
В режиме fakedsplit, он отправляет запрос в порядке: фейк 2-й части, 2 часть, фейк 2-й части, фейк 1-й части, 1 часть, фейк 1-й части.
В режиме fakeddisorder, он отправляет запрос в порядке: фейк 2-й части, 2 часть, фейк 2-й части, фейк 1-й части, 1 часть, фейк 1-й части.
Таким образом, DPI видит только набор фрагментов, возможно, вперемешку с поддельными (fake), и не может понять, что происходит.
Манипуляции с заголовками HTTPZapret может менять регистр букв в заголовке Host:, добавлять пробелы или точку в конце имени хоста. Это как изменить надпись на посылке, чтобы ее не узнали.
Например, Host: blocked.com превращается в host: blocked.com.
Разделение TLS ClientHello на два TLS records (tlsrec)Когда ты заходишь на сайт, защищенный HTTPS, твой браузер и сервер сайта должны договориться о том, как они будут шифровать данные. Этот процесс называется "TLS handshake" (рукопожатие TLS).
Первый шаг в этом процессе — ClientHello. Это сообщение, которое твой браузер отправляет серверу. В нем он говорит: "Привет, я хочу установить защищенное соединение. Я поддерживаю такие-то версии TLS и такие-то алгоритмы шифрования". Также в этом сообщении есть информация о домене, к которому ты подключаешься - SNI (Server Name Indication).
Системы DPI (которые блокируют сайты) тоже "слушают" этот разговор. Они видят ClientHello и, если сайт в списке заблокированных, могут разорвать соединение.
Метод tlsrec в tpws пытается обмануть DPI, разделив ClientHello на две части, которые называются "TLS records" (записи TLS).
Он делит его на две записи TLS. Важно, что в каждой записи есть заголовок, по которому можно понять, что это часть одного сообщения. DPI видит только первую запись, которая сама по себе не похожа на полноценное ClientHello. Он не понимает, что это запрос к заблокированному сайту, и пропускает его.
В России tlsrec обычно не работает с TLS 1.2, потому что DPI анализирует сертификат сервера, который передается в ServerHello (следующее сообщение после ClientHello). Но работает с TLS 1.3, потому что там эта информация шифруется.
Автоматическое определение блокировок (autohostlist)Zapret может анализировать ответы от сервера и определять, был ли запрос заблокирован. Если сайт ведет себя подозрительно (например, не отвечает или возвращает ошибку), Zapret может добавить его в список для обхода. Это как вести черный список сайтов, которые не пускают, и автоматически применять к ним обходные маневры.
Итогnfqws (Network Filter Queue) работает на уровне отдельных пакетов. Он перехватывает пакеты, идущие к заблокированным сайтам, изменяет их и отправляет дальше. Для его работы нужно настроить правила iptables или nftables, чтобы перенаправлять трафик в nfqws.
tpws (Transparent Proxy) работает на уровне TCP-соединений. Он выступает в роли посредника между роутером и сайтом. Для его работы нужно настроить редирект трафика на tpws с помощью iptables или nftables.
Когда это работать не будетВажно понимать, что Zapret — это не волшебная палочка, и у него есть свои ограничения. Вот случаи, когда Zapret может не сработать:
Если провайдер блокирует доступ к сайту не по доменному имени, а по IP-адресу, то Zapret не поможет. Он заточен на обман DPI, который анализирует именно доменные имена.
Пример: Если сайт youtube.com имеет IP-адрес 1.2.3.4, и провайдер заблокировал доступ ко всем сайтам на этом IP, то Zapret не сможет помочь, потому что он не изменяет IP-адрес назначения.
Если провайдер подменяет DNS-запросы, то возможно даже не дойти до стадии, когда сработает Zapret.
Пример: Ты вводишь youtube.com в браузере, но провайдер подменяет DNS-ответ и вместо реального IP-адреса сайта выдает тебе IP-адрес своей заглушки или вообще неверный адрес. В этом случае твой запрос даже не дойдет до настоящего сайта, и Zapret не сможет вмешаться.
Решение: Использовать DNS over HTTPS (DoH) или DNS over TLS (DoT), чтобы защитить свои DNS-запросы от подмены. Также можно попробовать использовать DNS-сервер, который не контролируется провайдером, например, публичные DNS от Google (8.8.8.8, 8.8.4.4) или Cloudflare (1.1.1.1, 1.0.0.1).
Если провайдер использует очень продвинутую систему фильтрации, которая умеет анализировать не только заголовки, но и содержимое трафика, то Zapret может не справиться.
Пример: Провайдер использует DPI, который умеет собирать TCP-соединение целиком и анализировать его, несмотря на разбиение на сегменты или добавление "мусорных" данных.
Такие системы встречаются нечасто, но они существуют и постоянно совершенствуются.
Если провайдер блокирует не конкретные сайты, а целые протоколы (например, весь трафик, похожий на VPN), то Zapret не поможет. В Китае блокируют многие VPN-протоколы, и обойти такую блокировку очень сложно.
Иногда сайты могут быть недоступны не из-за блокировок, а из-за проблем на своей стороне, или они изначально блокируют подключение из РФ. В этом случае Zapret, естественно, не поможет.
Некоторые DPI хитрые. Они могут пропускать запрос, если он их обманул, но анализировать ответ от сервера. Если в ответе находится информация о заблокированном ресурсе (например, домен в сертификате), то соединение может быть сброшено.
Решение: Использовать сайты, поддерживающие TLS 1.3. В этой версии протокола сертификат сервера передается в зашифрованном виде.