Полный текст выпусков с анимированными SVG-схемами: «Что такое zapret2». Список видео в Zapret2/Zapret2.md обновлён. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
134 KiB
Executable file
| title | date | tags | aliases | description | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Видео 0. Что такое zapret2 | 2026-10-26 |
|
|
Видео 0 серии о Zapret 2: вводный обзор: какие бывают блокировки, чем zapret2 отличается от VPN, как устроена программа, что она умеет и как построен курс, с анимированными схемами. |
[!info] О чём заметка Это полный текст вводного видео из серии о том, как работает Zapret2/Zapret2, разбитый по сценам, с анимированными схемами. Каждую сцену можно читать отдельно.
[!tip] Как читать пометки «В нашем тесте» значит настоящий запуск в лаборатории проекта: клиент, роутер, сервер. «По коду» значит, что мы прочитали исходники, но не запускали. «По общим сведениям» значит, что это вне нашего кода и лаборатории. О настоящем оборудовании ТСПУ мы ничего не утверждаем: наш «инспектор» это модель.
Вводный выпуск: сайт не открывается, а интернет есть
Вы открываете сайт. Колёсико крутится, страница не грузится. А рядом соседняя вкладка работает, и видео играет. Интернет есть, не открывается только один сайт. Иногда сайт просто сломался. Тогда он не открывается ни из какой сети. Но бывает и так, что кто-то на пути вашего запроса намеренно мешает вам получить именно этот сайт, а из другой сети он открывается. Такую помеху мы будем называть блокировкой. Перед вами вводный выпуск серии о программе zapret2. Он устроен как карта: без исходного кода, только названия, команды, строки журнала и таблицы. Полную историю одного запроса мы рассказываем в выпуске «Письмо в сортировочном центре».
!wiki-anim-video00-s01-symptom-definition.svg
Что такое zapret2? Это автономное средство противодействия DPI. По общим сведениям, так называют оборудование, которое разбирает пакеты глубже обычного роутера. Автономное значит, что программа работает у вас, и ей не нужно подключение каких-либо сторонних серверов. Дальше формулировка осторожная. Программа может помочь с блокировками и замедлением сайтов по HTTP и HTTPS. И может помочь против сигнатурного анализа протоколов TCP и UDP, то есть против их распознавания по характерному виду, например при блокировке VPN. Ещё её можно использовать для частичной маскировки протоколов, по-научному обфускации. Заметьте слова «может помочь». Не «обходит» и не «снимает». По сути это пакетный манипулятор. По общим сведениям, любой запрос в сети уходит маленькими кусками, их называют пакетами. Программа меняет такие куски вашего соединения прямо на лету, а что именно с ними делать, решают стратегии: это программы на языке Lua.
!wiki-anim-video00-s01-author-purpose.svg
Теперь честная оговорка: это инструмент для энтузиастов, а не готовое решение для чайников. Так что это инструмент, а не кнопка. Нажать и получить обход не выйдет. Результат проверяют, а не обещают. Поведение блокирующих меняется: сегодня так, а завтра будет что-то другое. Ради этой проверки и существует весь курс: он учит проверять самому.
!wiki-anim-video00-s01-tool-not-button.svg
У нас в выпуске четыре вопроса. Первый: от каких блокировок zapret2 может помочь, а от каких нет. Второй: чем он отличается от VPN и от прокси. Третий: как он устроен и что умеет, где в нём часть на языке Си, а где на Lua, какие у него опции и аргументы. Четвёртый: какие бывают приёмы обхода, в программе их называют стратегиями, и как идти по остальным выпускам курса. На каждый вопрос уйдёт своя часть выпуска, и в конце каждой части мы коротко повторим главное. Это обзор, поэтому подробности мы оставляем следующим выпускам.
!wiki-anim-video00-s01-four-questions.svg
Теперь о том, как мы будем говорить. Есть три способа и одно предупреждение. Если мы говорим просто, без пометок, это прочитано в программе или в её документации. Например: это не готовое решение для чайников. Если мы говорим «в нашем тесте», это измерено в нашей лаборатории. Там наш клиент, наш роутер и наш сервер, а любая блокировка игрушечная: мы построили её сами. Например: в нашем тесте сервер получил все двести пятьдесят байт запроса. Если мы говорим «по общим сведениям», это общее знание о блокировках, а не факт о настоящей системе. Например: по общим сведениям, оборудование на пути может читать имя сайта. И предупреждение: как устроено настоящее оборудование у операторов, мы не знаем, и ничего о нём не утверждаем как о факте.
!wiki-anim-video00-s01-three-ways.svg
Итак, у нас четыре вопроса и три способа говорить: просто, «в нашем тесте» и «по общим сведениям». Начнём с первого вопроса: какие бывают блокировки.
Где по дороге можно помешать: четыре места, четыре симптома
Где по дороге запроса можно помешать? Представьте, что вы пишете письмо в магазин. Пример выдуманный. Сначала вы ищете адрес магазина в справочнике. Потом письмо едет по этому адресу и приходит к двери. На конверте открыто написано, кому оно. А внутри идёт переписка в привычном для магазина стиле. Каждый из этих четырёх шагов можно испортить: подменить запись в справочнике, закрыть дверь, придраться к надписи на конверте или оборвать переписку. У запроса в сети те же четыре шага, и у каждого свой симптом.
!wiki-anim-video00-s02-letter-four-steps.svg
Первое место: справочник адресов, по-научному DNS. Вы спрашиваете у него адрес сайта по имени, как номер телефона по фамилии. Если справочник соврёт, вы пойдёте не туда, куда нужно, а пользователю будет казаться, что сайта нет или что открылся чужой. Второе место: сам адрес и порт. Адрес это дом, порт это номер двери в этом доме. Обычные защищённые сайты стучатся в порт четыреста сорок три. Если путь к адресу или к двери закрыт, не доходит ничего. Документация zapret2 описывает полную блокировку адреса так: не доходит ничего, нет ни пингов, ни соединения на порт.
Третье место: имя сайта в первом открытом сообщении соединения. Это как надпись на конверте: читать её необязательно, но можно. По общим сведениям, оборудование на пути может прочитать имя и решить, что делать. Например, просто искать в первом сообщении определённое слово. Четвёртое место: протокол по его сигнатуре. Сигнатура это характерный вид первых пакетов, по которому узнают, о чём идёт разговор. Либо оборудование смотрит на поток целиком. Сколько пакетов читает настоящее оборудование, мы не знаем. Всё это по общим сведениям.
!wiki-anim-video00-s02-route-four-places.svg
Как это выглядит для пользователя? Симптомов четыре. Зависание: ответа нет, пока не выйдет время. Быстрая ошибка: соединение обрывают сразу. Страница-заглушка: вместо сайта открывается страница о блокировке. И замедление: сайт открывается, но очень медленно. В документации есть четыре примера вывода программы curl, простой утилиты, которая открывает адрес из командной строки и печатает, что получилось. Все четыре про случай, когда заблокировано только имя сайта. Читаем их по одному. В первом ответ не пришёл, время ожидания вышло, ни одного байта не принято. Во втором время ожидания тоже вышло. Это зависание. В третьем сервер ответил временным перенаправлением и указал адрес другой страницы. Это заглушка. В четвёртом написано, что соединение сброшено другой стороной. Это быстрая ошибка. Примера замедления среди них нет. Эти четыре картины мы подробно разбираем в выпуске «Письмо в сортировочном центре», здесь только напоминание. И помните: по симптому действие можно угадать лишь приблизительно, потому что обычные сбои выглядят так же.
!wiki-anim-video00-s02-four-curl-symptoms.svg
Итак, у запроса четыре места, где можно помешать: справочник, адрес и порт, имя в первом сообщении и сигнатура. И четыре симптома: зависание, быстрая ошибка, заглушка и замедление. По симптому действие угадывается лишь приблизительно.
Блокировка по имени сайта: самый наглядный случай
Что оборудование читает в первом сообщении и почему против этого можно что-то сделать? Сначала оговорка: блокировка по имени сайта это самый наглядный случай, но не единственный. Наша лаборатория показывает именно его. Защищённое соединение, его протокол называется TLS, начинается с приветствия клиента. В нём лежит имя сайта, открытым текстом. По общим сведениям, так сделано не случайно: на одном адресе живёт много сайтов, и серверу нужно узнать, какой из них вам нужен. В нашей лаборатории приветствие занимает двести пятьдесят байт. Имя, www.example.com, занимает из них пятнадцать байт и начинается на девяносто седьмом байте, если считать с нуля. Есть технология ECH, она прячет имя. В документации сказано, что технология отличная, но запоздавшая, а блокирующие могут банить даже по самому наличию ECH.
!wiki-anim-video00-s03-hello-tape.svg
Чтобы увидеть блокировку по имени на настоящих пакетах, мы построили игрушечный инспектор. Это одно правило в роутере нашей лаборатории. Оно смотрит в одно и то же место каждого пакета, ищет там пятнадцать байт имени и считает такие пакеты. Дальше выбрасывает их или отправляет сброс. Ничего не запоминает. По общим сведениям, настоящее оборудование операторов называют ТСПУ, и как оно устроено, мы не знаем. Наш инспектор это не оно, он очень простой.
!wiki-anim-video00-s03-toy-inspector.svg
Сначала без zapret2. В нашем тесте правило выбрасывает пакеты с именем. Клиент отправил запрос и ждёт подтверждения. Его нет. На двести двенадцатой миллисекунде клиент отправляет тот же запрос снова. Подтверждения опять нет. Потом повтор на четыреста двадцать восьмой. Потом на восемьсот сорок восьмой. Сервер не получил ни байта данных, а счётчик правила насчитал шесть выброшенных пакетов. Для пользователя это зависание. Теперь тот же запрос, но правило отправляет сброс: служебный сигнал «закрываю соединение немедленно». Клиент получает ошибку сразу, сброс приходит через одну сотую миллисекунды после данных. Этот сброс подделка: его породил роутер, и его выдаёт время жизни пакета. По общим сведениям, это число на пакете, и каждый роутер на пути уменьшает его на единицу. У подделки оно шестьдесят четыре. А у настоящих пакетов сервера шестьдесят три.
!wiki-anim-video00-s03-drop-vs-reset.svg
Теперь включаем zapret2 на клиенте и просим разрезать тот же запрос прямо внутри имени. Такой приём называется стратегией: это один способ изменить пакеты так, чтобы блокирующий не нашёл то, что ищет: имя сайта или признаки протокола. Эта стратегия называется разрезом: один пакет уходит в сеть как два. В первой части сто четыре байта. Во второй сто сорок шесть. Целых пятнадцати байт имени нет ни в одном из них: в одной части начало имени, в другой конец. Правило ничего не находит, счётчик остался на нуле. Сервер получил все двести пятьдесят байт и собрал запрос. С правилом, которое отправляет сброс, то же самое. Разрез обошёл игрушку.
!wiki-anim-video00-s03-cut-name.svg
Но наша игрушка простая: она читает пакеты по одному. Настоящий читатель мог бы быть устроен иначе. Поэтому в нашем тесте есть и другие игрушечные инспекторы, которые склеивают части запроса обратно. Всего пять игрушек разного устройства. Разрез обманул только ту, что смотрит пакеты по одному. Остальные четыре склеили запрос и заблокировали его на втором пакете: до сервера дошли только сто четыре байта. Значит, стратегия, которая побеждает одного читателя, проигрывает другому. Лекарства от всего нет. А какой из этих читателей похож на настоящее оборудование, мы не знаем.
!wiki-anim-video00-s03-honest-limit.svg
Итак, имя сайта самый наглядный случай: оно лежит открытым текстом в первом сообщении. Наш игрушечный инспектор читает пакеты по одному, и разрез его обошёл. Но читающему поток одного разреза мало. Никакая стратегия не лекарство от всего: каждую нужно проверять.
Чего zapret2 не может: подмена DNS и блок по адресу
Какие блокировки нельзя вылечить, изменив начало соединения? Представьте, что справочник вам соврал. Или что дверь магазина заварена. Пример выдуманный. Как бы вы ни переписывали записку у двери, это ничего не изменит: вы всё равно пришли не туда или не можете войти.
!wiki-anim-video00-s04-two-dead-ends.svg
Первый случай: DNS. Это справочник, который по имени сайта называет его числовой адрес. По общим сведениям, обычный DNS идёт открытым текстом, и ответ по дороге можно подменить: назвать неверный адрес или сказать, что такого имени нет. На нашей вики описаны и наблюдения пользователей: запросы к публичному справочнику уходят к другому, который на заблокированные имена отвечает «такого имени нет». Почему zapret2 тут бессилен? Он меняет начало вашего соединения, а его ещё нет: ложный ответ приходит из сети.
!wiki-anim-video00-s04-dns-kinds.svg
Вот что пишет документация. Если DNS отравлен провайдером, а ваш клиент не поддерживает шифрованный DNS, это сразу конец всем обходам: вы пойдёте на адрес заглушки, и никакой zapret не поможет. Выходы, которые она называет: другой DNS, если врёт только провайдер, или шифрованный DNS, например DoH. По общим сведениям, шифрованный DNS, DoH или DoT, это тот же вопрос в запечатанном конверте: провайдер видит, к какому справочнику вы обращаетесь, но не вопрос, и подсунуть свой ответ не может. Программа проверки blockcheck2 печатает ту же мысль заглавными английскими буквами: если DNS подменён, zapret не поможет.
!wiki-anim-video00-s04-dns-docs.svg
В нашем тесте мы подсунули проверке игрушечный справочник, не настоящий. Для одного имени из списка он отвечает ложным адресом. Проверка сравнивает ответ справочника системы с ответом другого справочника и пишет «MISMATCH»: ответы не совпали. Дальше она пробует найти рабочий сервер DoH, не находит и останавливается. В соседнем опыте такой шифрованный сервер в лаборатории был. Проверка перешла на него, и сайт открылся без всякого обхода. Настоящие справочники мы так не проверяли.
!wiki-anim-video00-s04-dns-lab.svg
А если заблокирован сам шифрованный DNS? Снаружи это обычное защищённое соединение с сервером справочника, и на вики описаны наблюдения, что его обрывали по имени сервера. Если блок по имени, zapret2 может помочь, как с любым сайтом: имя справочника добавляют в список имён и подбирают стратегию. Если блок по адресу сервера, соединение не устанавливается, менять в нём нечего, и zapret2 не поможет. Нужен другой справочник с другим адресом или туннель. Такую блокировку мы в лаборатории не воспроизводили. Подробно об этом отдельные статьи на нашей вики: про Zapret DNS, справочник проекта Zapret, и про то, поможет ли zapret, если блокируют защищённый DNS.
!wiki-anim-video00-s04-dns-cases.svg
[!tip] Подробнее о DNS
- Zapret/zapret-dns — свой DNS-сервер проекта: гео-блокировки и защита от подмены
- Zapret/doh-cherez-zapret
- DPI/tspu-dns-nsdi-dnat-august-2026 — наблюдения и проверка у себя
Второй случай: блок по адресу. Пакеты к определённому адресу не пускают, какое бы имя в них ни стояло. Документация говорит прямо: zapret не может обойти блок по IP. Видов три. Полный блок: не доходит ничего. Блок по порту или протоколу, например закрыт весь порт четыреста сорок три: соединение даже не устанавливается. Для этих двух документация пишет: без проксирования ничего сделать нельзя. Третий вид частичный: соединение устанавливается, а всё, что отправляешь дальше, зависает или обрывается. Это серая зона. Раз соединение проходит, возможно, есть сообщения, которые открывают доступ. Но пробить такой блок, пишет документация, можно, только если у вас есть готовая информация или хватит упорства проверять варианты вручную.
!wiki-anim-video00-s04-ip-block-kinds.svg
Сравним на одинаковом наборе: семь стратегий проверки и один веб-сервер. В нашем тесте игрушечное правило в роутере сначала выбрасывало только пакеты с именем сайта. Помогли три стратегии из семи. Они разрезают приветствие или переставляют его части. Потом то же правило выбрасывало все пакеты к адресу сервера, какое бы имя в них ни стояло. Не помогла ни одна из семи, и проверка не нашла ни одной рабочей стратегии. За опыт правило выбросило двадцать семь пакетов. Вывод простой: когда блокируют адрес, менять начало соединения бесполезно. Обе блокировки наши, игрушечные: опыт показывает логику, а не настоящую сеть.
!wiki-anim-video00-s04-ip-contrast.svg
Итак, подмену DNS и блок по адресу или порту изменением начала соединения не вылечить. От подмены помогает другой или шифрованный DNS, а для адресов нужен VPN или прокси. Исключение: шифрованный DNS, заблокированный по имени. Частичный блок по адресу остаётся серой зоной.
Серая зона: замедление, протоколы, белые списки
А в остальных случаях zapret2 помогает или нет? Программа «может помочь», и новичку важно услышать именно это слово. «Может» здесь и есть весь ответ: возможно, но без гарантий и всегда с проверкой. Ниже три случая, которые нельзя назвать ни «да», ни «нет»: замедление, протоколы и белые списки.
!wiki-anim-video00-s05-may-help.svg
Замедление. В описании сказано, что zapret2 может помочь против замедления сайтов. Больше документация ничего не уточняет, и замедление мы в лаборатории не воспроизводили. По общим сведениям, помочь можно лишь тогда, когда причина замедления видна в первых пакетах, например имя сайта или вид протокола. Если же линия просто перегружена или скорость режут по объёму или по адресу, начало соединения тут ни при чём, и программа этого не лечит. Поэтому и здесь ответ «может», а не «да».
!wiki-anim-video00-s05-throttle.svg
Блок по протоколу. Протокол можно узнать по сигнатуре, и сама программа умеет узнавать по ней много протоколов, не только веб: например WireGuard и QUIC. По общим сведениям, первый это протокол VPN, а второй нужен части современных сайтов. В описании назначения прямо названа блокировка VPN, а в примере из документации есть профиль для WireGuard, STUN и Discord без имени сайта. Если закрыт весь порт, это блок по адресу, мы его уже разобрали. Бывает и так: блокирующий опирается на статистику поведения или на отпечаток клиента, например на порядок расширений в приветствии. По общим сведениям, одной правкой первых пакетов тут не обойтись. Для таких случаев в проекте есть отдельные средства обфускации, то есть маскировки протокола. Полный запрет протокола мы в лаборатории не воспроизводили.
!wiki-anim-video00-s05-protocol-signature.svg
Белые списки. По общим сведениям, это когда закрыто всё, кроме разрешённого. Блокирующие ограничивают крупные хостинги, но оставляют доступ к нескольким важным сайтам, и получается белый список. Готового рецепта нет: сегодня так, а завтра будет что-то другое. Есть и другие причины, почему обход может не сработать. Вот часть списка. Проверка blockcheck2 смотрит один домен по одному протоколу, а браузер делает больше. Бывает подмена DNS. Бывают протокол IP шестой версии и QUIC. Остальные причины из списка, вроде ECH и другой версии TLS, смотрите на экране. Важно: результат проверки ещё не гарантия, что сайт откроется в браузере.
!wiki-anim-video00-s05-whitelist-limits.svg
Есть и случай, который вообще не про дорогу: сервис сам не пускает адреса из некоторых стран. Это называют гео-блокировкой. По общим сведениям, сервис смотрит, с какого адреса пришло соединение, и по нему определяет страну. Помех на пути здесь нет, а адрес остаётся вашим, поэтому zapret2 не помогает. Помогает другой адрес, например VPN, о нём дальше. Для таких сервисов есть справочник проекта Zapret, Zapret DNS. На вики описано, что для сервисов из его списка он подставляет свой адрес и передаёт соединение дальше, так что сервис видит адрес в Нидерландах. Блокировки на пути он не снимает.
Повторим как таблицу, строка за строкой. Подмена DNS: нет, нужен другой или шифрованный DNS. Шифрованный DNS, заблокированный по имени: да, как обычный сайт. Блок адреса, полный или по порту: нет, тут нужен VPN или прокси. Частичный блок адреса: серая зона. Блок по имени сайта: да, в принципе, и это проверяется. Блок по сигнатуре протокола: тоже «может помочь». Замедление и белые списки: «может», без готовых рецептов. Гео-блокировка: нет, нужен другой адрес. Каждая строка уже прозвучала выше, ничего нового таблица не добавляет. Запомните её: к ней мы будем возвращаться в следующих частях.
!wiki-anim-video00-s05-recap-table.svg
Проверьте себя. Вместо сайта открывается страница-заглушка, и ведёт на неё адрес, который выдал DNS. Поможет ли zapret2? Подумайте несколько секунд.
Нет. Адрес уже подменён, а документация говорит: вы пойдёте на адрес заглушки, и никакой zapret не поможет. Нужен другой или шифрованный DNS.
!wiki-anim-video00-s05-check-dns-stub.svg
Итак, zapret2 может помочь с блокировками и замедлением сайтов по HTTP и HTTPS и против сигнатурного анализа протоколов TCP и UDP, например при блокировке VPN. Ещё он годится для частичной маскировки протоколов. Общее у них: всё зависит от содержимого или вида пакетов. Имя сайта самый наглядный случай, его показывает наша лаборатория. Подмену DNS, блок по адресу или порту и гео-блокировку он не лечит, и тогда нужен другой путь: шифрованный DNS, VPN или прокси. Чем VPN и прокси отличаются от zapret2, разберём дальше.
VPN и прокси: что это и что они лечат
Коротко о прошлом. Подмену DNS, блок по адресу или по порту и гео-блокировку zapret2 не лечит: он меняет только то, как выглядит начало соединения. Для таких блокировок нужен другой путь, VPN или прокси. Сначала разберёмся, что это такое, а потом сравним их с zapret2.
Начнём с VPN. Пример выдуманный. Вам не открывают магазин на вашей улице, а в другом городе живёт знакомый. Вы отдаёте ему всю свою почту в запечатанном мешке, и он отправляет письма от своего имени. Магазин видит адрес знакомого, а не ваш. По общим сведениям, VPN устроен так же: это зашифрованный туннель от вашего устройства до чужого сервера. Трафик, обычно весь, идёт внутри туннеля и выходит в интернет с адреса этого сервера. Наблюдатель на пути видит адрес сервера, сам факт туннеля и нередко его протокол. Содержимого и конечных адресов он не видит.
Теперь прокси. По общим сведениям, это посредник, который сам открывает соединение с сайтом вместо вас. В нашем примере знакомый берёт не всю почту, а только те письма, которые вы ему отдали. По общим сведениям, прокси обычно настраивают для одной программы или для системы, и через него идёт только её трафик. Шифруется ли путь до прокси, зависит от его вида: обычный HTTP-прокси и SOCKS-прокси этот путь не шифруют. Сайт видит адрес прокси, а не ваш. Разница одной фразой: прокси обычно служит выбранным программам и не обязательно шифрует, а VPN обычно несёт весь трафик устройства через шифрованный туннель. Это зависит от продукта.
!wiki-anim-video00-s06-vpn-proxy-paths.svg
Что они лечат, по общим сведениям. Подмену DNS, если запросы к DNS идут через них. Блок по адресу и по порту: ваши пакеты теперь идут не на заблокированный адрес, а на адрес посредника. Гео-блокировку: сервис видит адрес посредника, а не ваш. Иногда ещё скрывают от местной сети, какие сайты вы посещаете. Платят за это так. Нужен сервер, который надо арендовать или которому надо довериться, потому что тот, кто его держит, видит, куда вы ходите. Путь становится длиннее, а скорость иногда ниже. И сам туннель или адрес сервера тоже могут заблокировать. В описании назначения zapret2 как раз названа блокировка VPN как пример сигнатурного анализа.
Теперь честная оговорка. В документации zapret2 нет раздела «чем это отличается от VPN». На главной странице документации слово VPN встречается один раз, в описании назначения, а слова «прокси» нет вовсе. Поэтому всё сказанное про VPN и прокси это общие сведения, а не слова документации. Мы не будем приписывать ей то, чего в ней нет. А сравнение с zapret2 проверим на пакетах нашей лаборатории.
!wiki-anim-video00-s06-cures-costs.svg
Итак, VPN и прокси ходят через чужой сервер: трафик идёт к нему, а сайт видит его адрес. Это общие сведения, документация zapret2 тут ничего не сравнивает. Они лечат DNS, блок по адресу, блок по порту и гео-блокировку, а платят сервером и длинным путём. Теперь посмотрим, что делает вместо туннеля zapret2.
Что делает zapret2 вместо туннеля: проверка на пакетах
Вопрос такой. Отправляет ли zapret2 трафик куда-то ещё, как это делает VPN? Меняет ли адрес получателя, прячет ли имя сайта? В выпуске «Письмо в сортировочном центре» мы говорили, что трафик идёт прямо к сайту. Теперь проверим это по пакетам.
Сначала опыт без программы. Правила ядра Linux, то есть настройки перехвата в операционной системе, стоят, но сама программа не запущена. В нашем тесте клиент отправляет запрос одним пакетом. В нём двести пятьдесят байт данных. С заголовками на проводе это триста шестнадцать байт: остальное это заголовки Ethernet, IP и TCP. По общим сведениям, это служебные поля в начале пакета: Ethernet для соседних устройств, IP для адресов, TCP для порядка и подтверждений. Сервер получил двести пятьдесят байт, ровно то, что отправил клиент. Запомним эту картинку: один пакет и один получатель.
Теперь тот же запрос, но программа запущена со стратегией multisplit. Режет она в середине имени сайта, в команде это место называется midsld. В нашем тесте клиент отправил два пакета вместо одного. Оба ушли на тот же адрес сервера и на тот же порт. В первом сто четыре байта, и кончается он на «www.exa». Во втором сто сорок шесть байт, и начинается он с «mple.com». Сервер собрал всё обратно и получил те же двести пятьдесят байт. Адрес и порт получателя не изменились, изменилась только нарезка.
!wiki-anim-video00-s07-two-runs.svg
Но имя сайта никуда не делось. Оно по-прежнему лежит открытым текстом, только разрезано между двумя пакетами. Сервер без труда собрал его обратно. Стратегии обхода режут пакеты, переставляют их и добавляют подделки. Они ничего не шифруют и не меняют получателя. Оговорка: в том же проекте есть средства обфускации, и некоторые шифруют часть сообщений. Им нужна программа на обоих концах, и это уже другой режим, не основной.
Ещё одно отличие: zapret2 работает с началом соединений, а не со всем трафиком. На Linux правило в ядре Linux передаёт программе только первые пакеты каждого соединения. Причина названа в документации: передавать пакеты из ядра Linux в программу дорого, поэтому лишнее отсекают как можно раньше. Остальные пакеты того же соединения идут мимо программы, прямо через ядро Linux. Сколько именно первых пакетов берётся, увидим чуть позже, когда дойдём до самого правила.
!wiki-anim-video00-s07-not-hidden-first-packets.svg
Соберём часть в таблицу: проблема и инструмент. Подмена DNS: другой DNS или шифрованный DNS. Адрес и порт: VPN или прокси. Имя сайта и сигнатура протокола: zapret2, и результат нужно проверять. Для адресов из списка блокировок документация готовит отдельный список для стороннего перенаправления и прямо пишет: «требуется VPN или прокси». Сам zapret2 с этим списком ничего не делает и трафик в VPN не направляет. Поэтому главный вопрос всегда один: на каком месте пути стоит помеха.
!wiki-anim-video00-s07-problem-tool.svg
Проверь себя. Почему нельзя просто сказать: «zapret2 не нужны чужие серверы»?
Потому что без оговорок это неверно. В основном режиме так и есть. Но двусторонней обфускации нужна программа на втором конце. А от полного блока по адресу без проксирования ничего сделать нельзя.
Итак, zapret2 не вместо VPN или прокси, а для другого случая: он остаётся на вашем устройстве, в основном режиме ничего не прячет и меняет только начало соединений. Теперь заглянем внутрь: из чего он состоит и что происходит с одним пакетом.
Из чего состоит zapret2: три слоя и папки
Мы выяснили, что zapret2 остаётся на вашем устройстве и меняет только начало соединений. Теперь заглянем внутрь. Сначала общая картина без подробностей: из каких частей состоит программа и где какая лежит?
Пример выдуманный: проходная на заводе. Охранник на входе отбирает, кого пускать внутрь. В цехе рабочий разбирает каждую деталь и записывает, откуда она. А что делать с деталью, написано в инструкции, которую можно переписать. В zapret2 те же три слоя. Слой перехвата отбирает пакеты и передаёт их программе. На Linux это правило в ядре Linux, то есть в главной части операционной системы. На других системах перехват устроен иначе, об этом чуть дальше. Слой движка: Си-часть программы. Она разбирает пакеты, помнит соединения и выбирает профиль, то есть набор настроек для такого трафика. Слой стратегий: файлы на языке Lua, компактном языке сценариев. Они решают, что сделать с пакетом. Минимальный рабочий набор это именно эти три части. Всё остальное по желанию. Запомним порядок: сначала отбор, потом разбор, потом решение.
!wiki-anim-video00-s08-three-layers.svg
У движка три имени. На Linux он называется nfqws2, на BSD dvtws2, на Windows winws2. BSD это семейство систем, родственных Unix. Основа одна, различается способ перехвата. На Linux это правила файервола ядра, iptables или nftables, на FreeBSD ipfw, на OpenBSD pf. В Windows встроенных средств перехвата нет, и winws2 перехватывает сам, через сторонний драйвер WinDivert. Документация нацеливает проект прежде всего на роутеры с OpenWrt, то есть со свободной прошивкой на основе Linux. Кроме них она называет Linux, FreeBSD, OpenBSD и Windows. macOS не поддерживается. BSD и Windows мы читали по документации и по коду, но не запускали.
Теперь папки настоящего проекта. Главных две. Папка nfq2: там Си-часть, девятнадцать файлов. Папка lua: шесть файлов с кодом на Lua, о них мы ещё поговорим подробно. Вместе со слоем перехвата это и есть минимальный рабочий набор, остальное можно заменить своими средствами.
Вокруг этого стоят помощники, и три из них важнее прочих. Скрипт blockcheck2 и его папка blockcheck2.d перебирают стратегии за вас и показывают, какие помогли. Файл config.default хранит настройки для скриптов запуска, сама программа о нём ничего не знает. Сами скрипты запуска лежат в папках init.d и common: они поднимают правила перехвата и запускают программу. Остальные папки смотрите на экране, вслух только коротко. Папка ipset загружает списки, а mdig и ip2net работают со списками. В папке files лежат заготовки поддельных пакетов, их несколько десятков. В папке binaries только записка: готовые файлы бывают в релизах, их скачивают или собирают из исходников. Папка docs это краткая страница readme и подробное руководство. Зачем нужна каждая папка, станет понятно по ходу выпуска.
!wiki-anim-video00-s08-names-folders.svg
Итак, у программы три слоя: перехват, Си-часть и Lua. Главные папки: nfq2 и lua. Всё остальное, от blockcheck2 до скриптов запуска, по желанию, но делает программу удобной. Дальше пройдём по пути одного пакета через эти слои.
Путь пакета, часть первая: перехват, разбор, запись о соединении
Как пакет попадает в программу и что она делает с ним сразу? Пример выдуманный. На столе приёма лежат стопки папок, и сотрудник читает только первые листы каждой папки. Остальные листы он не трогает, они идут дальше без чтения. Так и здесь: программа видит только начало каждого соединения, а остальное проходит мимо.
Как отбираются пакеты на Linux, видно по правилам ядра Linux. Вот пять правил из документации, на экране они в таблице, вслух читать их не будем. Четыре отдают пакеты программе, в очередь, то есть в место в ядре, откуда программа их забирает: исходящие и входящие, для TCP и для UDP. По общим сведениям, UDP отличается от TCP тем, что доставку не подтверждает. Порт восемьдесят это обычный HTTP. Порт четыреста сорок три это защищённое соединение. Каждое из этих четырёх правил берёт только первые пакеты соединения и обходит пакеты с пометкой программы: так она отмечает свои пакеты. Пятое правило снимает отслеживание с пакетов, которые отправила сама программа. А слово bypass в первых четырёх значит: если программы на другом конце очереди нет, ядро Linux пропускает пакеты само. В нашем тесте правила стояли, а программа не была запущена, и соединение работало как обычно.
Сколько первых пакетов? В примере из документации, как и в нашей лаборатории, берут первые двенадцать в каждом направлении. Это пример для опытов, а не значение по умолчанию. В настоящем файле настроек, который идёт с программой, числа другие. Для TCP от клиента к серверу двадцать. Обратно, от сервера, десять. Для UDP туда пять. Для UDP обратно три. В нашем тесте штатный скрипт запуска построил именно такие правила. В файле настроек есть и закомментированный режим без ограничения числа исходящих пакетов, и рядом с ним предупреждение: такой режим может сильно нагружать процессор.
!wiki-anim-video00-s09-rules-numbers.svg
А что на других системах? По документации, на FreeBSD, OpenBSD и в Windows ограничителя «первые пакеты» нет: перехватывается весь поток в выбранном направлении. В Windows встроенных средств перехвата нет, поэтому winws2 перехватывает сам, через сторонний драйвер WinDivert. Фильтр задают параметрами самой программы, это группа параметров wf. На BSD порты выбирают в правиле ipfw или pf. Чтобы не нагружать процессор, фильтры сужают, а лишнее программа отсекает сама, своими диапазонами по номеру пакета. Дальше всё одинаково: Си-часть, профили и стратегии на Lua. Всё это мы читали по документации и по коду, но не запускали.
!wiki-anim-video00-s09-systems.svg
Теперь один пакет в журнале программы. Это наш запрос из двухсот пятидесяти байт, журнал взят из нашего теста. Первая строка: пакет пришёл, его длина триста два. Это двести пятьдесят байт данных. Остальное, ещё пятьдесят два байта, заголовки. Следующие две строки: программа разобрала слои, это называется разбором пакета. В строке про IP видно, что пакет идёт от клиента к серверу по протоколу TCP. В строке про TCP: двести пятьдесят байт данных и их первые байты. Дальше строка о том, что программа нашла запись об этом соединении. Запись это её собственная карточка соединения, и в ней уже лежит выбранный набор правил, профиль. О нём чуть позже. Затем программа узнаёт содержимое по сигнатуре: это клиентское приветствие защищённого соединения, и оно целое. Заодно она отмечает версии протокола. Расширения ECH, которое прячет имя, в нём нет. И последняя строка: имя сайта www.example.com. Всё это сделала Си-часть, Lua ещё не звали.
!wiki-anim-video00-s09-log-dissect.svg
А если приветствие не помещается в один пакет? В нашем тесте мы отправили приветствие в тысячу четыреста восемьдесят четыре байта. Программа записала в журнал: приветствие неполное. Она задержала пакет, дождалась остальных частей и, когда всё собралось, проиграла задержанные пакеты заново, как будто они только что пришли. После этого сервер получил приветствие целиком. Наше обычное приветствие короткое и целое, ему всё это не нужно.
!wiki-anim-video00-s09-big-hello.svg
Итак, в начале пути пакета стоят перехват, на Linux это правило ядра Linux и очередь, затем разбор, запись о соединении, тип содержимого и имя сайта. Всё это делает Си-часть программы, пока без Lua. Дальше программа выберет профиль и решит, что делать с пакетом.
Путь пакета, часть вторая: профиль, стратегия, вердикт
Программа теперь знает тип содержимого и имя сайта. Остаётся главное: как она выбирает, что делать с пакетом, и чем всё кончается? Здесь три шага: выбрать профиль, вызвать стратегию и получить вердикт. Разберём их по очереди на том же запросе из нашего теста.
Сначала выбирается профиль. Пример выдуманный: список правил на проходной. Курьеру налево, бухгалтеру направо, остальным просто пройти. Читают сверху вниз и берут первое подходящее. Профили работают так же. Профиль состоит из условий профиля, например списка имён сайтов, и списка вызовов стратегий, то есть записей вида «применить такую-то стратегию с такими-то настройками». Программа читает профили по порядку, и первый подошедший выигрывает. В самом конце всегда стоит пустой профиль no_action: если ничего не подошло, пакет остаётся в покое. В нашем тесте одна и та же стратегия дала два результата. Когда имя сайта было в списке, сервер получил два куска. В первом сто четыре байта. Во втором сто сорок шесть. Когда имени в списке не было, сервер получил запрос целиком, двести пятьдесят байт. Отличался только список.
!wiki-anim-video00-s10-profile-pick.svg
Профиль выбран, и теперь вызов. Си-часть собирает одну таблицу о пакете: что в нём лежит, какое это соединение, какой профиль, в какую сторону он идёт. Эту же таблицу получают по очереди все вызовы профиля. Затем Си-часть вызывает функцию на Lua, имя которой записано в настройках профиля. Перед каждым вызовом она сама проверяет, подходит ли пакет по номеру в соединении и по виду данных: она работает быстрее Lua, и будить его зря незачем.
Вот вторая половина журнала из нашего теста. Строки с приставкой LUA написал уже Lua, остальные Си-часть. Сначала Lua пишет, что режет в середине имени сайта. Потом: место разреза найдено, это сто четвёртый байт. Дальше две части. Первая в сто четыре байта, от начала. Вторая в сто сорок шесть байт, до самого конца. Заметьте, Lua не отправляет пакеты сам, он просит об этом Си-часть. Поэтому после каждой части идёт строка про отправку, её пишет Си-часть, и пакет уходит в сеть со своей пометкой. И последняя строка: исходный пакет выброшен, слово drop.
!wiki-anim-video00-s10-call-and-log.svg
Это слово и есть вердикт. Вызов отвечает одним из трёх. Pass: пропустить как есть. В нашем тесте так отвечала стратегия, которая ничего не делает, и в журнале стоит «пропущен без изменений». Modify: пропустить с правкой. В нашем тесте так менялся регистр букв в имени сайта в запросе, длина осталась прежней. Drop: не пропускать. Ответы всех вызовов сводятся в один, и любой drop побеждает. Но drop не значит, что данные потеряны. Посчитаем. В нашем тесте в очередь попали шесть исходящих пакетов клиента. Один из них выброшен. Вместо него программа сама отправила два новых. На проводе от клиента вышло семь. Свои пакеты программа метит, и правила ядра Linux по этой пометке не пускают их обратно в очередь. А если в Lua случилась ошибка, пакет проходит без изменений, а уже отправленное остаётся отправленным.
!wiki-anim-video00-s10-verdicts.svg
Итак, профиль выбирается по порядку, и первый подошедший выигрывает. Вызов получает таблицу о пакете и отвечает вердиктом, а ответы всех вызовов сводятся в один. Слово drop значит не «потеряли», а часто «заменили»: пакет выбросили, зато отправили два новых. Ошибка в Lua пакет не ломает.
Где кончается Си и начинается Lua
Что делает Си-часть программы, что делает Lua и зачем такое разделение? Пример выдуманный: двигатель и рецепты. Двигатель быстрый, и устроен он один раз. Рецепты меняют часто, и каждый может написать свой. Хорошо, когда их можно менять отдельно от двигателя.
Что умеет Си-часть, в трёх группах. Первая: приём пакета. Перехватить его, разобрать, запомнить соединение и узнать тип содержимого. Вторая: сложные случаи. Держать составные сообщения и проигрывать их заново, выбирать профиль и сверять списки имён. Третья: служебное. Отправлять свои пакеты, хранить блобы, то есть готовые двоичные заготовки вроде поддельного пакета, держать мост к Lua, вести таймеры и следить за безопасностью.
Про безопасность одна фраза: права администратора программа сбрасывает до запуска Lua, и файл стратегии не может запускать программы. А вот воздействия на трафик в Си-части нет совсем. Там нет никаких возможностей собственно для воздействия на трафик. Всё, что умеет Си-часть, служебное: взять, разобрать, запомнить, отправить.
Lua-файлов шесть, и разберём их по три. Первые три скрипты запуска загружают всегда. Библиотека помощников: общие помощники вроде фильтров, разбора запросов и нарезки пакетов. Библиотека стратегий: в ней лежат сами способы воздействия, двадцать пять стратегий. Автоматика, которая решает, когда сменить стратегию.
Остальные три нужны не всегда. Обфускация, то есть маскировка протокола. Запись пакетов в файл для проверки. И самопроверка. Программа и Lua-файлы должны быть из одного релиза, иначе Lua выдаст ошибку, и в сообщении об ошибке так и сказано.
!wiki-anim-video00-s11-c-and-lua.svg
Зачем разделять? В предыдущей версии проекта, zapret, стратегии были зашиты прямо в Си-код, и написать новую было нелегко: нужны квалификация и время. Задумано так, чтобы стратегию мог написать любой, кто разбирается в сетях и немного умеет программировать. Это про гибкость, а не про то, что так эффективнее. Практический вывод: новая стратегия это правка Lua-файла и перезапуск. Пересобирать программу не нужно. А готовым решением можно потом поделиться с друзьями.
Проверим на опыте. В нашем тесте в список стратегий мы нарочно вписали multisplit с опечаткой: multisplt. Программа ответила: «функции multisplt не существует». Это значит, что имя стратегии ищется в момент вызова, как имя обычной функции, а не зашито в Си-код заранее. Поэтому новую стратегию достаточно добавить в Lua-файл.
Теперь весь путь целиком, станция за станцией. На Linux правило ядра Linux отбирает первые пакеты. Они попадают в очередь программы. Си-часть разбирает пакет на слои. Находит или создаёт запись о соединении. Узнаёт тип содержимого и имя сайта. Выбирает профиль. Вызывает функции на Lua. Получает вердикт и отправляет пакеты. Восемь станций, и Lua решает только на одной из них. Остальные работают без него: даже когда профиль ничего не делает, пакет всё равно проходит станции до самого профиля.
!wiki-anim-video00-s11-eight-stations.svg
Проверь себя. В журнале встретилась строка «hostname: www.example.com», приставки LUA в ней нет. Кто её написал, Си-часть или Lua?
Си-часть. Имя сайта она достала сама, ещё до первого вызова Lua. Приставку LUA несут только строки, которые пишет Lua, так что по приставке в журнале всегда видно, чья это работа.
Итак, Си-часть программы перехватывает, разбирает и отправляет пакеты, а Lua решает, что с ними делать; стратегия это функция, которую вызывают по имени. Дальше посмотрим, чем всем этим управляют: опциями, профилями и аргументами стратегий.
Опции: восемь групп и три класса
Мы узнали, что делает Си-часть и что делает Lua. Осталось понять, чем всем этим управляют. Какие настройки есть у программы и как они устроены?
Настройка в командной строке называется опцией: это слово, которое начинается с двух чёрточек. Опций много, но по смыслу их можно разложить на восемь групп. Первые четыре группы про то, что и как программа берёт. Как пакеты попадают в программу: например, номер очереди, в которую ядро Linux их кладёт. Что загрузить: файлы на Lua и блобы, то есть готовые куски байтов, вроде заготовки поддельного пакета. Профили: сколько их и как они разделены. Условия профиля: например, какой порт нужен.
Дальше четыре группы про работу с соединением и запуск. Какие пакеты соединения брать: например, только первые. Память о соединении и сборка сообщения из частей. Отладка: куда писать журнал. И наконец права и запуск: от какого пользователя работать и как стать фоновой службой. Сверх этого есть настройки для IPv6 и для автоматических списков имён.
Опции делятся ещё и на три класса. Пример выдуманный: пульт печи. Выключатель общий. Выбор блюда открывает новую страницу. Ручки температуры и времени действуют на выбранное блюдо. В программе так же. Глобальные опции действуют на всё. Профильные начинаются заново после слова new: оно открывает следующий профиль. А ручки это вид данных, то есть какие пакеты по содержимому брать, например только приветствие, и два диапазона, то есть какие по счёту пакеты брать, для входящих и для исходящих; они действуют на вызовы стратегий, записанные после них.
!wiki-anim-video00-s12-groups-classes.svg
Теперь настоящая команда. Сначала смысл, потом слова: строка читается слева направо, и каждая часть отвечает на свой вопрос. В нашем тесте лаборатория запускает программу самой простой из своих строк. Разрежем её на части. Номер очереди: двести. Файл журнала. Папка, куда Lua разрешено писать. Три файла на Lua: общая библиотека, готовые стратегии и запись пакетов. Условия профиля: только TCP и порт четыреста сорок три. Вызов, который записывает пакеты в файл. И в конце то, что меняется от опыта к опыту: вид данных и сама стратегия. При запуске программа печатает в журнал, как поняла строку: один профиль без имени и два вызова. Ручки у них выставлены по-разному: у записи пакетов открыты обе стороны, а у стратегии входящие закрыты.
!wiki-anim-video00-s12-command-cut.svg
Запомните разницу. Опции относятся к программе и к профилям. А аргументы относятся к одной стратегии: они пишутся сразу после её имени, через двоеточие. В нашей строке это стратегия multisplit с одним аргументом: pos, то есть позиция, и значение midsld. Это два разных списка: опции программы и аргументы стратегии. Глобальных настроек для обманок в программе нет: обманки, по-научному fooling, это аргументы самих стратегий, и о них чуть позже.
Опций много, но они укладываются в восемь групп и три класса. Опции программы и аргументы стратегии это два разных списка. Как читать такую строку слева направо, подробно показывает выпуск «Читаем командную строку zapret2».
Профили, условия профиля, диапазоны и списки
Как в одной команде задать разное поведение для разного трафика? Представьте тетрадь со страницами. Пример выдуманный. На каждой странице заголовок и инструкция. Вы идёте сверху вниз и берёте первую страницу, чей заголовок подходит, а остальные не читаете. Так программа выбирает профиль для соединения. Посмотрим, как это записывается в команде.
Профиль это страница. Слово new переворачивает страницу. Заголовок страницы это условия профиля. Какой транспорт и порт: TCP или UDP. Какой протокол программа узнала в потоке, например TLS или QUIC. Есть ли имя сайта в списке имён, или адрес в списке адресов. Страница может сказать, например, «только TLS на порту четыреста сорок три». Подходит первая страница сверху, даже если ниже есть ещё подходящие. Если не подошла ни одна, срабатывает пустой последний профиль, и трафик идёт как есть. В файле настроек из коробки три такие страницы: для HTTP, для TLS и для QUIC. Их мы разберём сразу после этого.
Мы уже видели это в лаборатории. Стратегия одна, различается только список имён. В первом списке одна строка: example.com. Во втором: example.org. Имя в приветствии www.example.com, поддомены в список входят сами. В первом случае сервер получил два куска. Сначала сто четыре байта, потом сто сорок шесть. Во втором все двести пятьдесят байт одним куском.
!wiki-anim-video00-s13-pages-pair.svg
Второй вопрос: на каких пакетах соединения звать вызов. Пример выдуманный: из каждой папки с письмами берут только первые листы. Так работают диапазоны. Пакеты можно считать по номеру, по номеру среди пакетов с данными или по числу байт; как записывать диапазон, объясняет другой выпуск. Нам важны два правила. Первое: входящие пакеты по умолчанию закрыты. Программа не знает, что нужно функции, и не хочет отправлять в Lua гигабайты скачанного. Исходящие по умолчанию открыты. Второе: когда все вызовы профиля вышли за свои диапазоны, программа больше не обращается к Lua в этом соединении, и тогда остальные пакеты проходят мимо Lua.
Есть ещё автоматические списки имён. Обычный список вы пишете сами. Автоматический пополняет программа. Пример выдуманный: вахтёр, который записывает в журнал тех, к кому трижды не смог дозвониться. Так и здесь. Если с каким-то именем несколько раз подряд случаются неудачи, программа записывает его в файл, и с этой минуты профиль применяется к нему. Неудача это повторные отправки пакетов, сброс соединения в самом начале, перенаправление на другой домен, а для UDP много исходящих пакетов и почти нет входящих. По умолчанию нужно три неудачи за шестьдесят секунд, а удача обнуляет счёт. Из файла программа ничего не удаляет. Это правило самой программы, а не сведения о том, как ведёт себя настоящая блокировка. Как оно работает вместе со сменой стратегий, разбирает выпуск про автоматическую смену стратегий.
!wiki-anim-video00-s13-ranges-auto.svg
Профиль это страница с условиями профиля. Диапазон решает, на каких пакетах соединения звать вызов. Список имён решает, к каким сайтам применяется страница, и его может пополнять сама программа. А что именно сделать на этой странице, записано в строке стратегии.
Настоящая строка из коробки и аргументы стратегий
Сейчас обойдёмся без выдуманных примеров: перед нами настоящая строка, которую программа собирает сама из файла настроек. Это не код, а набор настроек. Как выглядит строка стратегии и что значат её аргументы?
Файл настроек из коробки называется config.default. В нём одна длинная строка со стратегиями, и она состоит из трёх профилей. Первый для HTTP: сначала поддельный запрос, потом настоящий запрос, разрезанный после первых двух букв метода. Второй для TLS: поддельное приветствие с MD5 и сдвинутым номером, потом настоящее приветствие, разрезанное по двум позициям, причём куски уходят в обратном порядке. Третий для QUIC: поддельный пакет, который повторяется несколько раз. MD5 и сдвиг номера это обманки: что это такое, объясним через минуту. Очередь, пользователя, пометку и три файла на Lua скрипт запуска добавляет сам, поэтому в строке только профили и стратегии. Списки имён скрипт подставляет на место заглушек. И здесь стоит ограничитель: свежая установка ничего не делает, пока вы её не включите. Помогают ли эти настройки в настоящей сети, мы не проверяли.
!wiki-anim-video00-s14-default-line.svg
В нашем тесте скрипт из коробки собрал именно такую команду. Посмотрим, что сделал профиль для TLS. Первым ушёл поддельный пакет в шестьсот восемьдесят байт, с опцией MD5. Замысел в том, что получатель такой пакет выбросит. Потом настоящее приветствие тремя кусками, хвостом вперёд. Сначала кусок в сто сорок шесть байт. Потом в сто три. Последним кусок в один байт. Сервер всё равно получил двести пятьдесят байт, и подделка в его данные не попала.
!wiki-anim-video00-s14-on-wire.svg
Теперь аргументы. Вот общая шпаргалка, эти слова понимает большинство стратегий. Начнём с четырёх главных. Dir: в какую сторону пакеты трогать, от клиента или к клиенту. Обманки, по-научному fooling: изменения, после которых получатель пакет игнорирует, например короткое время жизни, опция MD5, испорченная контрольная сумма или сдвиг номеров. Repeats: отправить пакет несколько раз. И pos: список меток, где резать, о них дальше.
Ещё четыре аргумента есть на экране, назовём их коротко. Payload: второй фильтр по виду данных, страховка от ошибки в строке. Blob: чем заполнить поддельный пакет. Nodrop: не выбрасывать оригинал, когда стратегия посылает свои куски. Seqovl: перекрытие номеров, сейчас нам нужно только название. У отдельных стратегий есть и свои особые аргументы, но этого набора достаточно, чтобы читать строку.
!wiki-anim-video00-s14-args-cheatsheet.svg
Теперь ловушка. Одна и та же обманка, короткое время жизни, в двух местах. Пример выдуманный: открытка «довезти только до первого узла». На первом узле её увидят, а адресат уже нет. Первое место: поддельный пакет. В нашем тесте он умирает на роутере, роутер отвечает, что время вышло, и до сервера доходит только настоящий пакет. Это то, что нужно. Второе место: куски стратегии multisplit. Она накладывает обманку и на настоящие куски, они умирают, и сервер не получает ни байта. А поддельный пакет совсем без обманок дошёл до программы сервера: она приняла шестьсот восемьдесят байт за свои данные. Вывод простой: обманку ставят на подделку, а не на настоящие данные.
!wiki-anim-video00-s14-ttl-trap.svg
Строка настроек это профили, вызовы и аргументы. Обманка на настоящих кусках ломает соединение, а на подделке делает её безвредной для сервера. Из коробки без включения программа ничего не делает. Как работают сами подделки, разбирает выпуск «Фейк и его условия».
Метки позиций: основа для всего дальнейшего
Как сказать программе «режь здесь»? Можно числом. Но имя сайта в нашем приветствии начинается с байта девяносто семь. А в нашем запросе HTTP оно начинается с байта тридцать два. Число, которое подходит одному пакету, для другого уже мимо. Нужен способ сказать «в начале имени» словами.
Позицию можно задать тремя способами. Числом: сколько байт стоит перед разрезом, считая от нуля. Отрицательным числом: тогда счёт идёт с конца, и минус один это последний байт. И словом, то есть меткой позиции; это не пометка, которую программа ставит на свои пакеты. Меток девять, объясним четыре. Host: первый байт имени сайта. Midsld: середина домена второго уровня, у нас это слово example. Sniext: начало поля, в котором в приветствии лежит имя. Method: начало метода запроса HTTP. К метке можно прибавить число или вычесть его, например «midsld плюс один». Если меток несколько, программа сортирует их и убирает повторы, а метку, которой в пакете нет, молча отбрасывает. Слова работают только для запроса HTTP и приветствия TLS: программа сначала должна узнать, что внутри пакета. У нашего QUIC слова ничего не нашли, сработали только числа.
!wiki-anim-video00-s15-markers-ribbons.svg
Посмотрим на настоящий опыт. В нашем тесте стратегии multisplit дали четыре позиции: число два и три метки, host, midsld и endhost, то есть конец имени сайта. В журнале host стала числом девяносто семь. Метка midsld стала числом сто четыре. Приветствие ушло пятью кусками. Первый кусок два байта. Второй девяносто пять. Третий семь, и это «www.exa». Четвёртый восемь, и это «mple.com». Пятый сто тридцать восемь. Сервер всё равно получил двести пятьдесят байт. Заметьте: число два режет в самом начале пакета, далеко от имени, а метки встали точно на имя.
!wiki-anim-video00-s15-five-pieces.svg
Теперь проверка на игрушечном инспекторе из нашей лаборатории. Он не настоящее оборудование: он ищет имя целиком в каждом пакете отдельно. blockcheck2 пробует разрезы по очереди. Разрезы внутри имени, midsld и host плюс один, инспектор пропустил. Разрезы вне имени, число два и method плюс два, нет: имя осталось целым в одном из кусков. Это факт про нашу игрушку, а не про настоящие системы.
!wiki-anim-video00-s15-pos2-vs-midsld.svg
Метки встречаются часто. Девять из двадцати пяти стратегий работают с позициями. Из коробки стоят method плюс два для HTTP и «один и midsld» для TLS. И blockcheck2 сам перебирает несколько вариантов позиций для каждого сайта. Поэтому выпуски про резку, про перестановку и про резку с подделкой строятся на метках: везде первый вопрос «где резать».
Подведём итог части. Опции программы делятся на восемь групп и три класса. Чтобы собрать команду, нужно ответить на три вопроса. Что взять: для этого профиль, условия профиля и диапазоны. Что сделать: для этого вызов стратегии с аргументами. И где: для этого метки, а не числа. Так строка из коробки и устроена: профили, в них вызовы, у вызовов аргументы.
!wiki-anim-video00-s15-capability-map.svg
Проверьте себя. Где у нашего приветствия середина домена второго уровня? Назовите номер байта. Подумайте несколько секунд.
Сто четыре. Это метка midsld: разрез идёт перед байтом с этим номером, считая с нуля.
Итак, команда zapret2 собирается из профилей, вызовов стратегий и их аргументов, а место для воздействия задают метками, а не числами. Теперь о самих приёмах: какие они бывают и зачем их несколько.
Три основные семьи: резать, перемешать, подделывать
Мы научились собирать команду. Теперь о самих приёмах. Какие они бывают и зачем их несколько? Три основные семьи: резать, перемешать и подделывать. Каждую покажем на одном и том же приветствии.
Начнём с резки. Пример выдуманный: фраза «встретимся у фонтана» пришла на двух открытках, на одной «встретимся у», на другой «фонтана». Теперь наше приветствие. В нашем тесте оно занимает двести пятьдесят байт. Резка делит его на два пакета: в первом сто четыре байта, во втором сто сорок шесть. Сервер получил все двести пятьдесят, ровно столько, сколько ушло. Это мы уже видели, поэтому запомним лишь картинку: два ящика, меньший впереди.
!wiki-anim-video00-s16-cut.svg
Перемешивание. Те же открытки, но вторая лежит сверху. В обычном TCP каждый кусок несёт номер своего первого байта, поэтому получатель сам сложит их по номерам. Теперь живой пример из нашего теста. Сначала клиент отправил конец приветствия, сто сорок шесть байт. Сервер сразу ответил: начала ещё нет, а вторую часть я уже держу. В записи пакетов этот ответ виден по пометке SACK: в ней получатель сообщает, какие куски уже держит. Потом пришёл кусок в сто четыре байта. И сервер подтвердил все двести пятьдесят. Программа сервера прочла их одним куском, как будто ничего не случилось. По общим сведениям, читателя, который ждёт кусков по порядку, такая перестановка может сбить.
!wiki-anim-video00-s16-reorder-sack.svg
Подделка. Тот же пример: в пачку подложили открытку с ложным текстом, которую получатель выбросит, а чужой читатель примет за настоящую. Документация говорит так: фейки это отдельные пакеты с ложной информацией, которую DPI должен принять, а сервер нет. Помните подделку с коротким сроком жизни? Она умирала на роутере. Теперь новое. Возьмём игрушечный инспектор из нашей лаборатории, не настоящее оборудование. Он решает по первому пакету с данными и смотрит только на него. Без программы он видит имя, блокирует соединение, и сервер не получает ничего. А с подделкой впереди его первый пакет это приветствие с другим именем. Инспектор разрешает соединение, и сервер получает настоящие двести пятьдесят байт. Это только игрушка. Игрушечные инспекторы нашей лаборатории, которые проверяют то же, что и получатель, подделку замечают и блокируют.
!wiki-anim-video00-s16-fake-toy.svg
Зачем столько семей? Документация отвечает прямо: обход требует всё более тонких воздействий, которые меняются со временем, а старые перестают работать. Идея каждой семьи это догадка о слабости читателя. По общим сведениям, такие слабости встречаются. Кого-то удивляет резка, потому что он читает каждый пакет отдельно. Кого-то удивляет подделка, потому что он не проверяет то, что проверяет получатель. Это гипотеза. В наших игрушках видно похожее. Из пяти игрушечных читателей один читает каждый пакет отдельно. Остальные собирают поток по-разному. Одна резка обошла только одного. А при резке вместе с подделкой имя не нашёл никто из пяти. Приём, который побеждает одного читателя, может проиграть другому.
!wiki-anim-video00-s16-why-several.svg
Три основные семьи. Резать: разделить приветствие на куски. Перемешать: отправить куски в другом порядке. Подделывать: добавить ложный пакет, который получатель выбросит. Семей несколько, потому что читатели бывают разные. Это гипотеза, и в наших игрушках она видна. Лекарства на все случаи нет.
!wiki-anim-video00-s16-three-families.svg
Остальные семьи и где они стоят
Три семьи это начало. Что ещё есть и где всё это лежит в программе и в курсе? Дальше идут парные приёмы, фокусы рукопожатия и другие слои. Есть ещё ротация, то есть автоматическая смена стратегии, и обфускация, то есть маскировка протокола: о них чуть позже. По каждой группе приёмов покажу одно-два наблюдения из нашей лаборатории.
Парные приёмы: резка и подделка вместе. Пример выдуманный: рядом с каждой настоящей открыткой кладут по ложной, до и после. Так один разрез превращается в шесть пакетов: подделка первого куска, настоящий первый кусок, ещё одна подделка, и то же самое для второго куска. Другой приём делает то же в обратном порядке. Третий кладёт настоящее имя сайта отдельным пакетом между двумя поддельными именами той же длины. Называются они fakedsplit, fakeddisorder и hostfakesplit. В нашем тесте у подделок стоит опция MD5, это обманка, из-за которой получатель пакет игнорирует. Сервер каждый раз получал все двести пятьдесят байт.
!wiki-anim-video00-s17-paired.svg
Фокусы рукопожатия. Рукопожатие это первые служебные пакеты соединения, ещё без данных. Фокусы работают именно там. Один из них: SYN с данными. По общим сведениям, SYN это самый первый пакет соединения, и обычно данных в нём нет. Другие фокусы, сброс, срочный байт и подмена окна, перечислены на экране. Покажу одну пару с игрушечным инспектором из нашей лаборатории, который решает по первому пакету с данными. Без приёма он видит имя и блокирует: сервер получает ноль байт. Если клиент прислал SYN с шестнадцатью байтами данных, инспектор решает по ним, имени не находит, объявляет соединение чистым и больше не проверяет. Сервер получает все двести пятьдесят байт. Игрушка поумнее, которая данные в SYN игнорирует, всё равно блокирует.
!wiki-anim-video00-s17-handshake.svg
Другие слои. Заголовки IPv6, фрагменты IP-пакетов, правки самого HTTP-запроса, UDP и QUIC. Фрагментация это разрезание уже не сообщения, а самого IP-пакета: в нашем тесте каждый кусок уходил двумя фрагментами, а ядро Linux на сервере собирало их обратно. Правка запроса в нашем тесте сделала буквы имени то большими, то маленькими. А ловушка вот какая. Поддельный пакет в соединении по IPv6, но с параметром для IPv4: параметр молча игнорируется, подделка доходит до сервера, и ответа нет. С правильным параметром для IPv6 всё работает. А QUIC функции для TCP не режут. Для UDP есть приёмы без имени сайта: они меняют длину пакета и начало сообщения DHT.
!wiki-anim-video00-s17-layers.svg
Где всё это лежит. По документации и по коду, двадцать пять стратегий это функции на Lua в одной библиотеке стратегий. Любую из них в командной строке вызывают по имени. Среди них и служебные drop и send, отдельного выпуска у которых нет. Автоматика лежит в своём файле, обфускация в своём. Три семьи из выпуска «Письмо в сортировочном центре» это упрощённое начало. У каждой семьи из этой сцены есть свой выпуск, полная карта на экране, а по порядку мы пройдём их в части о курсе. Назовём пока три главных: резать это «multisplit: резать на части», перемешать это «Перемешать: disorder», подделывать это «Фейк и его условия».
!wiki-anim-video00-s17-where-table.svg
Основные семьи: резать, перемешать, подделывать. Дальше идут пары, рукопожатие, другие слои, ротация и обфускация. Все приёмы это функции на Lua, которые вызывают по имени. У каждой семьи свой выпуск, а у служебных drop и send отдельного выпуска нет.
Инструменты вокруг программы: blockcheck2, ротация, установка, отладка
Что стоит вокруг программы, чтобы ею пользоваться? Сама программа это движок. Остальное необязательно, но именно оно делает её пригодной для жизни. Пройдём по четырём вещам: проверка, ротация, установка и журнал.
!wiki-anim-video00-s18-engine-four-cards.svg
Начнём с blockcheck2. Пример выдуманный: механик по очереди пробует ключи к замку и записывает, какой подошёл. Скрипт делает то же со стратегиями. Сначала он один раз проверяет DNS. Потом для каждого сайта смотрит, открыт ли порт, пробует сайт без всякого обхода и проверяет, не закрыт ли адрес. Затем запускает программу с одной стратегией, повторяет запрос, останавливает её и берёт следующую. В конце печатает сводку, SUMMARY, со стратегиями, которые сработали. Запускать его нужно при выключенных средствах обхода и VPN. Сам скрипт честно пишет: сводка не гарантирует готового рецепта, это не создатель волшебных таблеток, а проверка обхода DPI. В нашем тесте, на игрушечном инспекторе из нашей лаборатории, он сделал четырнадцать попыток. Сработали четыре.
!wiki-anim-video00-s18-blockcheck-run.svg
Ротация стратегий. Это два разных механизма, и путать их нельзя. Один на Lua: после нескольких неудач он переключается на следующую стратегию. Другой в Си-части: после повторных неудач он записывает имя сайта в файл. Вот журнал из нашего теста: повторные отправки: три из трёх. Потом «обнаружен сбой». Счётчик сбоев тоже три из трёх. И последняя строка: переключаемся на вторую стратегию. Насколько это помогает против настоящей блокировки, мы не утверждаем. Подробно автоматику разбирает выпуск про автоматическую смену стратегий.
!wiki-anim-video00-s18-two-rotations.svg
Установка. Установщик в диалоге спрашивает про файервол, про IPv6 и про режим списков и подключается к вашей системе запуска. Настройки лежат в файле config.default, и из коробки программа выключена, пока вы сами её не включите. Рядом лежат загрузчики списков имён и два малых инструмента. Один, mdig, в много потоков превращает очень длинные списки доменов в адреса. Другой, ip2net, собирает длинный список адресов в короткий список подсетей. Источники списков это сторонние сайты, и мы за них не ручаемся.
!wiki-anim-video00-s18-install-lists.svg
Журнал. Опция debug пишет, что программа делала с каждым пакетом, и в документации сказано, что умение читать этот журнал совершенно необходимо. Режим dry-run проверяет опции и выходит, не запуская Lua. Вызов pcap записывает пакеты в файл. Это тот самый журнал, строки которого мы разбирали раньше. А повторить опыт самому можно в лаборатории, которой не нужны права администратора. Отдельно стоит обфускация, то есть маскировка протокола. Некоторым её инструментам нужна программа на обоих концах.
!wiki-anim-video00-s18-debug-obfs.svg
Повторим часть. Семьи приёмов мы назвали, и у каждой есть свой выпуск. Вокруг программы стоят четыре помощника: blockcheck2 перебирает стратегии, ротация пробует следующую сама, установка включается руками, а журнал решает споры. Всё это уместилось в одну таблицу: семья, файл на Lua и выпуск курса.
!wiki-anim-video00-s18-families-tools-table.svg
Проверьте себя. blockcheck2 показал, что стратегия работает, а в браузере сайт не открылся. Почему такое возможно?
Тест проверяет один домен по одному протоколу, а браузер делает больше. Он ходит на другие домены сайта, пробует IPv6 и QUIC, использует другую версию TLS.
!wiki-anim-video00-s18-browser-vs-check.svg
Итак, помощников вокруг программы четыре, но ни один не заменит проверку: результат придётся проверять самому. Осталось понять, в каком порядке идти по курсу.
Курс: основы, язык и приёмы
Коротко обо всём выпуске. Блокировки бывают разные, и zapret2 может помочь против блокировок по имени сайта или по сигнатуре протокола, но не против подмены DNS и блока по адресу. Внутри перехват, Си-часть и Lua со стратегиями. Какие выпуски есть и о чём каждый?
!wiki-anim-video00-s19-recap-three.svg
Курс устроен в четыре блока: основы, приёмы вместе с языком командной строки, инструменты и устройство программы изнутри. Основы объясняют, что вообще происходит. Приёмы учат менять начало соединения. Инструменты помогают подобрать и включить стратегию. А «под капотом» показывает, как всё устроено в программе. По нашему подсчёту, всё вместе больше тридцати часов. Не пугайтесь: смотреть всё подряд необязательно, дальше мы покажем, как выбрать путь. В среднем это около полутора-двух часов на выпуск. Каждый длинный выпуск состоит из трёх частей, и любую часть можно смотреть отдельно. Этот вводный выпуск стоит перед ними как вход и ничего заранее не требует.
!wiki-anim-video00-s19-course-board.svg
Основы это два выпуска. «Письмо в сортировочном центре» объясняет, что происходит с запросом по дороге и как устроена наша игрушечная лаборатория. После него вы различаете четыре симптома блокировки и понимаете, почему разрезанный пакет может пройти мимо игрушечного инспектора, который читает пакеты по одному. «Что видит наблюдатель» учит читать пакет руками. После него вы найдёте имя сайта в приветствии на двести пятьдесят байт. Дальше пара про язык. «Читаем командную строку zapret2» учит читать настоящую команду слева направо. После него вы скажете, какие пакеты она трогает и какие функции запускает. «Где резать: метки» учит говорить программе, где резать, и объясняет, почему это нужно до всего остального.
!wiki-anim-video00-s19-foundation-cards.svg
Теперь приёмы. «multisplit: резать на части» отвечает на вопрос, как одно приветствие становится несколькими пакетами и что лежит в каждом. После него вы скажете, что в каком пакете. «Перемешать: disorder» спрашивает, что будет, если конец отправить раньше начала. После него вы прочтёте в записи пакетов ответ сервера с пометкой SACK и поймёте, почему получатель всё равно соберёт сообщение. «Фейк и его условия» объясняет, чем подделка должна отличаться от настоящего пакета, чтобы один читатель её принял, а другой отбросил. После него вы поймёте, какие обманки, по-научному fooling, за что отвечают.
!wiki-anim-video00-s19-techniques-a.svg
«Резать и подделывать вместе» собирает оба приёма в одну серию: разрез и подделки идут одним потоком пакетов. «Фокусы рукопожатия» о том, что можно сделать до первого байта данных. «Другие слои» о том, что есть кроме резки, перестановки и подделки внутри TCP: заголовки IPv6, фрагменты, правки HTTP и QUIC. А «Читаем и отлаживаем стратегии» учит повторять любой опыт самому, чтобы ничего не принимать на веру, и разбирает типичные ловушки.
!wiki-anim-video00-s19-techniques-b.svg
Сначала основы, затем язык командной строки, затем приёмы, затем проверка своими руками. Всё это про то, как менять начало соединения. Инструменты и устройство изнутри идут после них. Названия звучат без номеров, а порядок и зависимости мы разберём в конце.
!wiki-anim-video00-s19-order-chain.svg
Курс: инструменты и «под капотом»
Что в остальной части курса и обязательна ли она? Мы разобрали первые два блока: основы, а также приёмы вместе с языком командной строки. Остаются два блока: инструменты и устройство программы изнутри. Начнём с инструментов, они нужнее на практике.
Блок инструментов состоит из четырёх выпусков. Выпуск про blockcheck2 показывает, как скрипт находит стратегию, которая открывает сайт: цикл «запустить, проверить, остановить», проверки запросами curl, сводка, уровни проверки и свои списки. После него вы поймёте, как читать его отчёт и почему не стоит принимать его за гарантию. Его удобно смотреть сразу после приёмов, а при желании и раньше: он показывает, как стратегию подбирают на практике. Выпуск про автоматическую смену стратегий отвечает на вопрос, может ли программа переключаться сама: признаки неудачи, пороги и автоматические списки имён, и чем они отличаются от смены стратегий. Выпуск про установку и запуск рассказывает, что должно стоять вокруг программы, чтобы стратегия работала каждый день и после перезагрузки: файл настроек, правила перехвата, скрипты запуска, установщик. Выпуск про обфускацию о том, что делать, если подозрительным выглядит сам протокол: инструменты маскировки и случаи, когда программа нужна на обоих концах.
!wiki-anim-video00-s20-tools-four.svg
Остальное это блок «под капотом»: семь выпусков цепочкой, и каждый начинается с повтора предыдущего. Он необязателен: выпуски про приёмы его не предполагают. Если хотите понять, как всё устроено внутри, смотрите его в конце, когда приёмы уже знакомы. В этом вводном выпуске мы прошли путь пакета лишь бегло, а там его разбирают по шагам. Это блок для тех, кому интересно, откуда берутся числа и строки журнала, которые мы показывали.
!wiki-anim-video00-s20-underhood-chain.svg
Вот эти семь выпусков, сначала первые четыре. Они идут по пути пакета от перехвата до таблицы и памяти. «Внутри программы» про перехват на Linux: правило ядра Linux, очередь, главный цикл, три ответа программы, отправку собственных пакетов с меткой и защиту от петли. «От байтов к таблице» про то, как пакет разбирается на поля, превращается в таблицу для Lua и собирается обратно. «Память о соединении» про запись о соединении, роли сторон и счётчики. «Тип нагрузки и имя сайта» про то, как программа узнаёт приветствие, строку Host в HTTP и QUIC и достаёт имя.
!wiki-anim-video00-s20-underhood-first-four.svg
Последние три выпуска про решения и сборку. «Профили: как программа выбирает» про поиск профиля, диапазоны и списки. «Lua внутри программы» про то, как Си-часть и Lua разговаривают и как сливаются их ответы. «Сборка и повторный проигрыш» про то, как собирается большое приветствие и проигрывается заново.
!wiki-anim-video00-s20-underhood-last-three.svg
Каждый длинный выпуск начинается с короткого повтора. Жёсткие зависимости между выпусками есть, и мы назовём их в конце. Поэтому порядок всё-таки важен.
!wiki-anim-video00-s20-parts-abc.svg
Инструменты нужны для практики и не требуют выпусков про приёмы. Блок «под капотом» необязателен, его лучше смотреть в конце. Порядок и зависимости разберём дальше.
!wiki-anim-video00-s20-two-groups.svg
Как смотреть курс и как читать наши утверждения
Остался последний вопрос выпуска. В каком порядке всё это смотреть и как понимать то, что мы говорим? Ответим на оба.
Есть два пути. Путь для тех, кто хочет пользоваться: основы, пара про язык, то есть командная строка и метки, потом «multisplit: резать на части» и «Фейк и его условия», а затем выпуск про blockcheck2 и выпуск про установку и запуск. Остальное по мере нужды. Если сомневаетесь, с чего начать, начните с основ: они нужны на обоих путях. Путь для тех, кто хочет понять: все выпуски по порядку, потом «Читаем и отлаживаем стратегии», а блок «под капотом» в самом конце. Если вы хорошо знаете TCP и TLS, выпуск «Что видит наблюдатель» можно смотреть выборочно. Это наше предложение, на зрителях мы его не проверяли. Риск в том, что дальше звучит словарь именно этого выпуска.
!wiki-anim-video00-s21-two-paths.svg
Теперь жёсткие зависимости: без них порядок выбирать нельзя, иначе вы встретите слова, которых ещё не объясняли. «Где резать: метки» нужны перед «multisplit: резать на части». «multisplit: резать на части» нужен перед «Перемешать: disorder» и перед «Резать и подделывать вместе». «Фейк и его условия» нужен перед «Резать и подделывать вместе» и перед «Фокусы рукопожатия». «Другие слои» опираются на multisplit и фейк. А инструментам и выпуску «Читаем и отлаживаем стратегии» выпуски про приёмы не нужны.
!wiki-anim-video00-s21-hard-edges.svg
И как читать наши утверждения. Сказанное просто прочитано в программе или документации: в документации сказано, что zapret2 может помочь. «В нашем тесте» значит измерено в нашей лаборатории, на игрушечном инспекторе. «По общим сведениям» значит общее знание о VPN и DPI, а не факт о настоящей системе. Готовых рецептов программа не даёт: блокировки меняются, и старые рецепты перестают работать. О настоящем ТСПУ мы как о факте не говорим ничего. И одно слово: способ обхода мы всегда называем стратегией.
!wiki-anim-video00-s21-honesty-recap.svg
Повторим весь выпуск. Сначала мы выяснили, что блокируют: DNS, адрес и порт, имя сайта, сигнатуру. Потом поняли, что zapret2 может помочь против имени и сигнатуры, но не против подмены DNS и блока по адресу, и что он не заменяет VPN или прокси. Потом разобрали устройство: перехват, Си-часть и Lua. Потом возможности: опции, профили, вызовы стратегий и метки. Потом приёмы: три основные семьи и ещё пары, рукопожатие, слои, ротацию и обфускацию, и инструменты вокруг. И наконец порядок курса и жёсткие зависимости.
!wiki-anim-video00-s21-map-six-layers.svg
Помните три способа говорить: просто, «в нашем тесте» и «по общим сведениям». И правило, ради которого существует весь курс: результат нужно проверять самому. Это был вводный выпуск, а сам курс начинается с выпуска «Письмо в сортировочном центре». Там мы рассказываем полную историю одного запроса и показываем нашу лабораторию. Вот с него и начинайте: каждый следующий выпуск опирается на слова предыдущего.
!wiki-anim-video00-s21-closing-next.svg
См. также
- 01-pismo-v-sortirovochnom-centre — следующее видео серии, с него начинается курс
- структура проекта — из каких частей состоит zapret2
- схема обработки трафика — путь пакета через программу
- основные флаги — главные опции командной строки
- roadmap обучения — порядок изучения материалов вики
- Zapret/zapret-dns — свой DNS-сервер проекта: гео-блокировки и защита от подмены DNS
- Zapret/doh-cherez-zapret — когда zapret помогает защищённому DNS, а когда нет
- DPI/tspu-dns-nsdi-dnat-august-2026 — как подменяют обычный DNS и как это проверить
[!quote] 🤖 Эти статьи открыты — можно обучать на них ИИ При желании вы можете натренировать ИИ на наших статьях. Исходное форматирование доступно в Forgejo: исходник этой заметки · скачать весь репозиторий одним zip-архивом.