О чём заметка

Это полный текст вводного видео из серии о том, как работает Zapret 2, разбитый по сценам, с анимированными схемами. Каждую сцену можно читать отдельно.

Как читать пометки

«В нашем тесте» значит настоящий запуск в лаборатории проекта: клиент, роутер, сервер. «По коду» значит, что мы прочитали исходники, но не запускали. «По общим сведениям» значит, что это вне нашего кода и лаборатории. О настоящем оборудовании ТСПУ мы ничего не утверждаем: наш «инспектор» это модель.

Вводный выпуск: сайт не открывается, а интернет есть

Вы открываете сайт. Колёсико крутится, страница не грузится. А рядом соседняя вкладка работает, и видео играет. Интернет есть, не открывается только один сайт. Иногда сайт просто сломался. Тогда он не открывается ни из какой сети. Но бывает и так, что кто-то на пути вашего запроса намеренно мешает вам получить именно этот сайт, а из другой сети он открывается. Такую помеху мы будем называть блокировкой. Перед вами вводный выпуск серии о программе zapret2. Он устроен как карта: без исходного кода, только названия, команды, строки журнала и таблицы. Полную историю одного запроса мы рассказываем в выпуске «Письмо в сортировочном центре».

Сайт не открывается, а интернет есть Выдуманный пример: в одной вкладке браузера колёсико крутится и страница не грузится, в соседней идёт видео, значит интернет есть, а не открывается один сайт; сломанный сайт не открывается ни из какой сети, а при блокировке сайт не открывается из вашей сети, хотя из другой открывается, и рабочее определение блокировки такое: кто-то на пути запроса намеренно мешает получить один конкретный сайт. ПРИМЕР ВЫДУМАННЫЙ один сайт: страница не грузится соседняя вкладка: видео колёсико крутится, ответа нет видео играет, интернет работает Интернет есть, не открывается только один сайт. сайт сломалсяваша сетьдругая сетьне открывается ни из какой сети блокировкаваша сетьдругая сетьу вас не открывается,хотя из другой сети открывается рабочее определение блокировки: три признака 1кто-то на пути запроса + 2намеренно мешает + 3одному конкретному сайту вводный выпуск: карта, без исходного кода

Что такое zapret2? Это автономное средство противодействия DPI. По общим сведениям, так называют оборудование, которое разбирает пакеты глубже обычного роутера. Автономное значит, что программа работает у вас, и ей не нужно подключение каких-либо сторонних серверов. Дальше формулировка осторожная. Программа может помочь с блокировками и замедлением сайтов по HTTP и HTTPS. И может помочь против сигнатурного анализа протоколов TCP и UDP, то есть против их распознавания по характерному виду, например при блокировке VPN. Ещё её можно использовать для частичной маскировки протоколов, по-научному обфускации. Заметьте слова «может помочь». Не «обходит» и не «снимает». По сути это пакетный манипулятор. По общим сведениям, любой запрос в сети уходит маленькими кусками, их называют пакетами. Программа меняет такие куски вашего соединения прямо на лету, а что именно с ними делать, решают стратегии: это программы на языке Lua.

Что такое zapret2: может помочь Описание программы: средство работает у вас и не требует подключения сторонних серверов, может помочь с блокировками и замедлением сайтов HTTP и HTTPS и против сигнатурного анализа протоколов TCP и UDP, например при блокировке VPN, может использоваться для частичной обфускации протоколов, а по сути это пакетный манипулятор, который меняет маленькие куски запроса, пакеты, на лету между вашим браузером и сетью. описание программы, раздел «Зачем это нужно» ДОКУМЕНТАЦИЯ Автономное средство противодействия DPI, которое не требует подключения каких-либо сторонних серверов. Может помочь обойти блокировки или замедление сайтов HTTP(S), сигнатурный анализ TCP и UDP протоколов, например, с целью блокировки VPN. Может использоваться для частичной прозрачной обфускации протоколов. 1работает у васчужой сервер не нужен 2«может помочь»не «обходит», не «снимает» 3сигнатура протоколаузнаётся по виду по сути это пакетный манипулятор ДОКУМЕНТАЦИЯ ваше устройство или роутер браузерпросит сайт 1 2 3 4 zapret2меняет кускипрямо на лету 1 2 3 4 из браузераизменены 2 и 4 сеть и сайтпринимают куски ПО ОБЩИМ СВЕДЕНИЯМлюбой запрос уходит маленькими кусками, их называют пакетами Так описана программа, а помогает ли она в конкретной сети, проверяют на месте.

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

Инструмент, а не кнопка Оговорка: zapret2 это инструмент для энтузиастов, а не готовое решение для чайников, поэтому вместо одной кнопки обхода нужен набор инструментов и цикл из трёх шагов, выбрать приём, проверить у себя и смотреть результат, потому что блокирующие меняют поведение и результат проверяют, а не обещают. из документации ДОКУМЕНТАЦИЯ zapret2 - инструмент для таких энтузиастов. Но это не готовое решение для чайников. ОБХОД не кнопка проверкаприёмыспискижурналы набор инструментов как работать с таким инструментом 1выбрать приёмстратегию из набора 2проверить у себяв своей сети 3смотреть результатне верить на слово результат проверяют, а не обещают из документации:ДОКУМЕНТАЦИЯ«Сейчас это так, а завтрабудет еще что-то другое» ради этой проверки существует курс:он учит проверять самому

У нас в выпуске четыре вопроса. Первый: от каких блокировок zapret2 может помочь, а от каких нет. Второй: чем он отличается от VPN и от прокси. Третий: как он устроен и что умеет, где в нём часть на языке Си, а где на Lua, какие у него опции и аргументы. Четвёртый: какие бывают приёмы обхода, в программе их называют стратегиями, и как идти по остальным выпускам курса. На каждый вопрос уйдёт своя часть выпуска, и в конце каждой части мы коротко повторим главное. Это обзор, поэтому подробности мы оставляем следующим выпускам.

Четыре вопроса и карта выпуска В выпуске четыре вопроса, по одному на часть: от каких блокировок zapret2 может помочь и от каких нет, чем он отличается от VPN и от прокси, как он устроен и что умеет, какие бывают приёмы и как идёт курс; справа пустая карта выпуска из четырёх частей, и начинаем с первой. четыре вопроса выпуска карта выпуска 1От каких блокировок zapret2может помочь, а от каких нет часть 1пока пусто 2Чем он отличаетсяот VPN и от прокси часть 2пока пусто 3Как он устроен и что умеет:Си и Lua, опции и аргументы часть 3пока пусто 4Какие бывают приёмы, стратегии,и как идти по остальному курсу часть 4пока пусто начнём с неё в конце каждой части коротко повторим главное; подробности оставляем следующим выпускам

Теперь о том, как мы будем говорить. Есть три способа и одно предупреждение. Если мы говорим просто, без пометок, это прочитано в программе или в её документации. Например: это не готовое решение для чайников. Если мы говорим «в нашем тесте», это измерено в нашей лаборатории. Там наш клиент, наш роутер и наш сервер, а любая блокировка игрушечная: мы построили её сами. Например: в нашем тесте сервер получил все двести пятьдесят байт запроса. Если мы говорим «по общим сведениям», это общее знание о блокировках, а не факт о настоящей системе. Например: по общим сведениям, оборудование на пути может читать имя сайта. И предупреждение: как устроено настоящее оборудование у операторов, мы не знаем, и ничего о нём не утверждаем как о факте.

Три способа говорить Три способа говорить в курсе: без пометки значит прочитано в программе или документации, в нашем тесте значит измерено в нашей лаборатории с клиентом, роутером и сервером и игрушечной блокировкой, по общим сведениям значит общее знание о блокировках, а о настоящем оборудовании операторов как о факте ничего не утверждается. ДОКУМЕНТАЦИЯбез пометки: прочитанов программе или документациипример:«это не готовоерешение для чайников» В НАШЕМ ТЕСТЕнаш клиент, роутер, сервер;блокировка игрушечнаяпример:«сервер получил все250 байт запроса» ПО ОБЩИМ СВЕДЕНИЯМне факт о настоящейсистемепример:«блокирующее оборудованиеможет читать имя сайта» наша лаборатория: откуда берутся слова «в нашем тесте» игрушечный инспектор из нашей лаборатории,не настоящее оборудование Клиент10.1.0.1РоутерпересылаетСервер10.2.0.2 c0из клиента r0в роутер r1из роутера s0до сервера точки записи пакетов о настоящем ТСПУ как о факте ничего не утверждаем

Итак, у нас четыре вопроса и три способа говорить: просто, «в нашем тесте» и «по общим сведениям». Начнём с первого вопроса: какие бывают блокировки.

Где по дороге можно помешать: четыре места, четыре симптома

Где по дороге запроса можно помешать? Представьте, что вы пишете письмо в магазин. Пример выдуманный. Сначала вы ищете адрес магазина в справочнике. Потом письмо едет по этому адресу и приходит к двери. На конверте открыто написано, кому оно. А внутри идёт переписка в привычном для магазина стиле. Каждый из этих четырёх шагов можно испортить: подменить запись в справочнике, закрыть дверь, придраться к надписи на конверте или оборвать переписку. У запроса в сети те же четыре шага, и у каждого свой симптом.

Письмо в магазин: четыре шага Выдуманный пример письма в магазин показывает четыре места, где можно помешать: справочник адресов, адрес и дверь, надпись на конверте и стиль переписки; у запроса в сети те же четыре шага, это DNS, адрес и порт, имя сайта в первом сообщении и сигнатура протокола, и каждый шаг можно испортить по-своему. письмо в магазинПРИМЕР ВЫДУМАННЫЙ справочникищем адрес магазина адресдом и номер двери надпись на конвертееё можно прочитать переписка внутрив привычном стиле как это можно испортить подменитьзапись закрытьдверь придратьсяк надписи оборватьпереписку то же самое у запроса в сети DNSсправочник адресов адрес и портдом и номер двери имя сайтав первом сообщении сигнатуравид протокола У запроса те же четыре шага, и у каждого свой симптом.

Первое место: справочник адресов, по-научному DNS. Вы спрашиваете у него адрес сайта по имени, как номер телефона по фамилии. Если справочник соврёт, вы пойдёте не туда, куда нужно, а пользователю будет казаться, что сайта нет или что открылся чужой. Второе место: сам адрес и порт. Адрес это дом, порт это номер двери в этом доме. Обычные защищённые сайты стучатся в порт четыреста сорок три. Если путь к адресу или к двери закрыт, не доходит ничего. Документация zapret2 описывает полную блокировку адреса так: не доходит ничего, нет ни пингов, ни соединения на порт.

Третье место: имя сайта в первом открытом сообщении соединения. Это как надпись на конверте: читать её необязательно, но можно. По общим сведениям, оборудование на пути может прочитать имя и решить, что делать. Например, просто искать в первом сообщении определённое слово. Четвёртое место: протокол по его сигнатуре. Сигнатура это характерный вид первых пакетов, по которому узнают, о чём идёт разговор. Либо оборудование смотрит на поток целиком. Сколько пакетов читает настоящее оборудование, мы не знаем. Всё это по общим сведениям.

Маршрут запроса и четыре места Маршрут запроса от браузера через четыре места: справочник DNS, адрес и порт, имя сайта в первом сообщении и вид протокола или поток целиком; документация описывает полный блок адреса так, что не доходит ничего, нет ни пингов, ни соединения на порт, а про имя и сигнатуру известно лишь по общим сведениям, и сколько пакетов читает настоящее оборудование, неизвестно. браузерпроситсайт 1местосправочникDNS: имя сайтастановится адресом 2местоадрес и портдом и номер двери;порт 443 у HTTPS 3местопервое сообщениеимя сайтаоткрытым текстом 4местосигнатуравид протоколаили поток целиком «Полный блок IP. Не доходит ничего.Нет ни пингов, ни коннекта на порт.»ДОКУМЕНТАЦИЯ ПО ОБЩИМ СВЕДЕНИЯМоборудование на пути может прочитатьимя или протокол и решить, что делать сколько пакетов читает настоящееоборудование, неизвестно четыре места, в каждом из них можно помешать

Как это выглядит для пользователя? Симптомов четыре. Зависание: ответа нет, пока не выйдет время. Быстрая ошибка: соединение обрывают сразу. Страница-заглушка: вместо сайта открывается страница о блокировке. И замедление: сайт открывается, но очень медленно. В документации есть четыре примера вывода программы curl, простой утилиты, которая открывает адрес из командной строки и печатает, что получилось. Все четыре про случай, когда заблокировано только имя сайта. Читаем их по одному. В первом ответ не пришёл, время ожидания вышло, ни одного байта не принято. Во втором время ожидания тоже вышло. Это зависание. В третьем сервер ответил временным перенаправлением и указал адрес другой страницы. Это заглушка. В четвёртом написано, что соединение сброшено другой стороной. Это быстрая ошибка. Примера замедления среди них нет. Эти четыре картины мы подробно разбираем в выпуске «Письмо в сортировочном центре», здесь только напоминание. И помните: по симптому действие можно угадать лишь приблизительно, потому что обычные сбои выглядят так же.

Четыре примера curl и симптомы Четыре примера вывода программы curl из документации при блокировке только по имени сайта: два тайм-аута это зависание, ответ 307 с адресом другой страницы это заглушка, сброс соединения другой стороной это быстрая ошибка, а примера замедления среди них нет, причём заглушку и замедление в лаборатории не воспроизводили. примеры вывода curl из документацииДОКУМЕНТАЦИЯ что видит человек 1curl: (28) Operation timed out after 1002 milliseconds with 0 bytes received 2curl: (28) Connection timed out after 1001 milliseconds 3HTTP/1.1 307 Temporary RedirectLocation: https://www.gblnet.net/blocked.php 4curl: (35) Recv failure: Connection reset by peer зависание заглушка быстрая ошибка замедлениев примерах нет заглушку и замедление в лаборатории не воспроизводили:о них говорим только по документации и общим сведениям ПО ОБЩИМ СВЕДЕНИЯМпо симптому действие угадывается лишь приблизительно:обычные сбои выглядят так же

Итак, у запроса четыре места, где можно помешать: справочник, адрес и порт, имя в первом сообщении и сигнатура. И четыре симптома: зависание, быстрая ошибка, заглушка и замедление. По симптому действие угадывается лишь приблизительно.

Блокировка по имени сайта: самый наглядный случай

Что оборудование читает в первом сообщении и почему против этого можно что-то сделать? Сначала оговорка: блокировка по имени сайта это самый наглядный случай, но не единственный. Наша лаборатория показывает именно его. Защищённое соединение, его протокол называется TLS, начинается с приветствия клиента. В нём лежит имя сайта, открытым текстом. По общим сведениям, так сделано не случайно: на одном адресе живёт много сайтов, и серверу нужно узнать, какой из них вам нужен. В нашей лаборатории приветствие занимает двести пятьдесят байт. Имя, www.example.com, занимает из них пятнадцать байт и начинается на девяносто седьмом байте, если считать с нуля. Есть технология ECH, она прячет имя. В документации сказано, что технология отличная, но запоздавшая, а блокирующие могут банить даже по самому наличию ECH.

Приветствие клиента: 250 байт Приветствие клиента в нашей лаборатории занимает 250 байт, имя сайта лежит в нём открытым текстом, занимает 15 байт и начинается с байта 97 при счёте с нуля; по общим сведениям имя нужно, потому что на одном адресе живёт много сайтов, а технология ECH прячет имя, но в документации сказано, что она запоздала и блокирующие могут банить даже по самому её наличию. В НАШЕМ ТЕСТЕприветствие клиента в защищённом соединении (TLS) до имени: 97 байтимя: 15 байтпосле имени: 138 байт 097111249 w97w98w99.100e101x102a103m104p105l106e107.108c109o110m111 байты с 97 по 111: имя лежит открытым текстом, каждый символ это один байт ПО ОБЩИМ СВЕДЕНИЯМна одном адресе живёт много сайтов,и серверу нужно узнать, какой из них нужен,поэтому имя открыто в первом сообщении ДОКУМЕНТАЦИЯпро ECH, технологию, которая прячет имя:«ECH ... Технология отличная,но, к сожалению, запоздавшая ...могут банить как по самому наличию ECH»

Чтобы увидеть блокировку по имени на настоящих пакетах, мы построили игрушечный инспектор. Это одно правило в роутере нашей лаборатории. Оно смотрит в одно и то же место каждого пакета, ищет там пятнадцать байт имени и считает такие пакеты. Дальше выбрасывает их или отправляет сброс. Ничего не запоминает. По общим сведениям, настоящее оборудование операторов называют ТСПУ, и как оно устроено, мы не знаем. Наш инспектор это не оно, он очень простой.

Игрушечный инспектор: одно правило Игрушечный инспектор из нашей лаборатории это одно правило в роутере: оно смотрит в одно и то же место каждого пакета, ищет там 15 байт имени сайта, считает такие пакеты, выбрасывает их или отправляет сброс и ничего не запоминает; это не настоящее оборудование, а о настоящем по общим сведениям известно лишь название, устройство нам неизвестно. пакет 1: рукопожатиене совпалонет данных пакет 2: приветствиесовпало: счёт +1 пакет 3: повтор приветствиясовпало: счёт +1 везде одно место: байты с 97 по 111 роутер нашей лабораторииищет 15 байт на фиксированном местесчитает такие пакетывыбрасывает или шлёт сбросничего не запоминает игрушечный инспектор из нашей лаборатории, не настоящее оборудование ПО ОБЩИМ СВЕДЕНИЯМнастоящее оборудование называют ТСПУ; как оно устроено, мы не знаем;наш инспектор это не оно: он простой и читает каждый пакет отдельно правило нужно, чтобы увидеть блокировку по имени на настоящих пакетах

Сначала без zapret2. В нашем тесте правило выбрасывает пакеты с именем. Клиент отправил запрос и ждёт подтверждения. Его нет. На двести двенадцатой миллисекунде клиент отправляет тот же запрос снова. Подтверждения опять нет. Потом повтор на четыреста двадцать восьмой. Потом на восемьсот сорок восьмой. Сервер не получил ни байта данных, а счётчик правила насчитал шесть выброшенных пакетов. Для пользователя это зависание. Теперь тот же запрос, но правило отправляет сброс: служебный сигнал «закрываю соединение немедленно». Клиент получает ошибку сразу, сброс приходит через одну сотую миллисекунды после данных. Этот сброс подделка: его породил роутер, и его выдаёт время жизни пакета. По общим сведениям, это число на пакете, и каждый роутер на пути уменьшает его на единицу. У подделки оно шестьдесят четыре. А у настоящих пакетов сервера шестьдесят три.

Выброс и сброс на игрушечном инспекторе В нашем тесте на игрушечном инспекторе правило выбрасывает пакеты с именем, и клиент повторяет отправку через 1,61; 212; 428; 848; 1678 и 3345 мс с растущими паузами, сервер получает 0 байт, а правило насчитывает 6 пакетов и 1812 байт; если же правило шлёт сброс, ошибка приходит сразу, через 0,01 мс после данных, и у подделки время жизни 64, а у настоящих пакетов сервера 63. В НАШЕМ ТЕСТЕправило выбрасывает клиент повторяет отправку, шкала не в масштабе 1,611 212,182≈210 428,223≈216 848,374≈420 1678,035≈830 3344,986≈1667 роутер молча выбрасывает каждую отправку сервер получил 0 байт данных правило насчитало 6 пакетов, 1812 байт для человека это зависание В НАШЕМ ТЕСТЕправило шлёт сброс ошибка приходит сразу клиентроутер данные, 250 байт: 1198,37 мс сброс R: 1198,38 мсчерез 0,01 мс сбросвремя жизни 64пакеты серверавремя жизни 63 числа разные: сброс сделал роутер ПО ОБЩИМ СВЕДЕНИЯМвремя жизни: число на пакете,каждый роутер уменьшает его на единицу у клиента ошибка: Connection reset by peer

Теперь включаем zapret2 на клиенте и просим разрезать тот же запрос прямо внутри имени. Такой приём называется стратегией: это один способ изменить пакеты так, чтобы блокирующий не нашёл то, что ищет: имя сайта или признаки протокола. Эта стратегия называется разрезом: один пакет уходит в сеть как два. В первой части сто четыре байта. Во второй сто сорок шесть. Целых пятнадцати байт имени нет ни в одном из них: в одной части начало имени, в другой конец. Правило ничего не находит, счётчик остался на нуле. Сервер получил все двести пятьдесят байт и собрал запрос. С правилом, которое отправляет сброс, то же самое. Разрез обошёл игрушку.

Разрез: имя перерезано пополам Стратегия разрез: zapret2 на клиенте режет приветствие из 250 байт на две части по 104 и 146 байт так, что имя сайта оказывается перерезано между первыми семью и последними восемью байтами, и ни в одной части нет всех 15 байт имени; в нашем тесте правило игрушечного инспектора с выбросом и с сбросом насчитало 0 пакетов, а сервер получил все 250 байт и собрал запрос. В НАШЕМ ТЕСТЕстратегия «разрез»: один пакет уходит в сеть как два первая часть: 104 байта вторая часть: 146 байт www.example.com 7 байт имени8 байт имени пятнадцати байт имени целиком нет ни в одной части В НАШЕМ ТЕСТЕправило выбрасываетсчётчик правила: 0 пакетов, 0 байтсервер получил 104 + 146 = 250 байтпоток совпал с исходным запросом В НАШЕМ ТЕСТЕправило шлёт сброссчётчик правила: 0 пакетов, 0 байтсервер получил 104 + 146 = 250 байтпоток совпал с исходным запросом

Но наша игрушка простая: она читает пакеты по одному. Настоящий читатель мог бы быть устроен иначе. Поэтому в нашем тесте есть и другие игрушечные инспекторы, которые склеивают части запроса обратно. Всего пять игрушек разного устройства. Разрез обманул только ту, что смотрит пакеты по одному. Остальные четыре склеили запрос и заблокировали его на втором пакете: до сервера дошли только сто четыре байта. Значит, стратегия, которая побеждает одного читателя, проигрывает другому. Лекарства от всего нет. А какой из этих читателей похож на настоящее оборудование, мы не знаем.

Пять игрушечных читателей Пять игрушечных читателей из нашей лаборатории по-разному собирают запрос: разрез скрыл имя только от того, кто смотрит пакеты по одному, и сервер получил 250 байт, а четыре читателя, которые склеивают части, нашли имя и заблокировали запрос на втором пакете, так что до сервера дошло 104 байта; значит стратегия, побеждающая одного читателя, проигрывает другому, и лекарства от всего нет. ИГРУШКИ НАШЕЙ ЛАБОРАТОРИИне настоящее оборудование как читательсобирает запроспо одномупакетув порядкеприходапо номерам:первый пишетпо номерам:последний пишеттолькопо порядку на записи пакетов: находит ли читатель имя без разрезанаходитнаходитнаходитнаходитнаходит разрез104 + 146не находитнаходитнаходитнаходитнаходит перестановка146, затем 104не находитне находитнаходитнаходитне находит онлайн, в роутере: игрушка блокирует по-настоящему, разрез что получилсерверне нашла имя250 байт дошлоблок: 2-й пакет104 байта дошлоблок: 2-й пакет104 байта дошлоблок: 2-й пакет104 байта дошлоблок: 2-й пакет104 байта дошло Разрез обманул только игрушку, которая смотрит пакеты по одному. Стратегия, которая побеждает одного читателя, проигрывает другому: лекарства от всего нет.Какой из читателей похож на настоящее оборудование, мы не знаем.

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

Чего zapret2 не может: подмена DNS и блок по адресу

Какие блокировки нельзя вылечить, изменив начало соединения? Представьте, что справочник вам соврал. Или что дверь магазина заварена. Пример выдуманный. Как бы вы ни переписывали записку у двери, это ничего не изменит: вы всё равно пришли не туда или не можете войти.

Ложный справочник и заваренная дверь Выдуманный пример: справочник дал ложный адрес магазина и вы пришли в чужой дом, а у другого магазина дверь заварена, и как бы вы ни переписывали записку у двери, это ничего не изменит; записка здесь соответствует началу соединения, которое умеет менять zapret2, а подмена справочника и закрытый адрес лежат вне его возможностей. ПРИМЕР ВЫДУМАННЫЙ первый случай: справочник соврал справочникмагазин→ ул. Ложная, 5аптека→ ул. Мира, 2 чужой дом вы пришли не туда второй случай: дверь заварена магазин записка не войти: записка ничего не меняет как бы вы ни переписывали записку у двери, вы всё равно не там или не можете войтизаписка это начало соединения, а его и умеет менять zapret2 в обоих случаях нужна другая помощь, а не другое начало соединения

Первый случай: DNS. Это справочник, который по имени сайта называет его числовой адрес. По общим сведениям, обычный DNS идёт открытым текстом, и ответ по дороге можно подменить: назвать неверный адрес или сказать, что такого имени нет. На нашей вики описаны и наблюдения пользователей: запросы к публичному справочнику уходят к другому, который на заблокированные имена отвечает «такого имени нет». Почему zapret2 тут бессилен? Он меняет начало вашего соединения, а его ещё нет: ложный ответ приходит из сети.

Что бывает с обычным DNS Обычный DNS идёт открытым текстом, и по дороге ответ могут подменить: назвать неверный адрес, сказать, что такого имени нет, или, по описанным на вики наблюдениям, отправить запрос другому справочнику, а zapret2 меняет только начало вашего соединения, которого здесь ещё нет, поэтому ложный ответ он не исправит. первый случай: DNSПО ОБЩИМ СВЕДЕНИЯМ браузерспрашивает адрес справочник DNSпо имени называет адрес вопрос и ответ идут открытым текстом:по дороге ответ можно подменить что может прийти вместо честного ответа неверный адресведёт на страницу-заглушкувы пришли не туда «такого имени нет»сайт будто не существуетимя есть, но ответ ложный запрос ушёл к другомусправочникуон отвечает «такого имени нет» на вики описаны наблюденияэто не официальные сведения zapret2 меняет начало вашего соединения с сайтома здесь соединения ещё нет: ложный ответ приходит из сети схема: настоящие адреса и имена не показаны

Вот что пишет документация. Если DNS отравлен провайдером, а ваш клиент не поддерживает шифрованный DNS, это сразу конец всем обходам: вы пойдёте на адрес заглушки, и никакой zapret не поможет. Выходы, которые она называет: другой DNS, если врёт только провайдер, или шифрованный DNS, например DoH. По общим сведениям, шифрованный DNS, DoH или DoT, это тот же вопрос в запечатанном конверте: провайдер видит, к какому справочнику вы обращаетесь, но не вопрос, и подсунуть свой ответ не может. Программа проверки blockcheck2 печатает ту же мысль заглавными английскими буквами: если DNS подменён, zapret не поможет.

Подмена DNS: слова документации Что пишет документация о подмене DNS: если DNS отравлен провайдером, а клиент не поддерживает шифрованный DNS, это конец всем обходам и никакой zapret не поможет, выходы называются такие, другой DNS, если врёт только провайдер, или шифрованный DNS, например DoH, а программа проверки из комплекта печатает ту же мысль заглавными английскими буквами. первый случай: подмена DNSДОКУМЕНТАЦИЯ «Если же у вас DNS отравлен провайдером, а ваш клиент не поддерживает шифрованный DNS, то это сразу конец всем обходам. Вы пойдете на IP адрес заглушки, и, естественно, никакой zapret не поможет.» вы идёте на адрес заглушки: записка у двери уже ничего не решает выходы, которые называет документация другой DNSесли врёт толькоDNS провайдера шифрованный DNSесли другие DNS блокируютили подменяют DoHодин из шифрованныхканалов для DNS программа проверки из комплекта, blockcheck2, печатает то же заглавными буквами POSSIBLE DNS HIJACK DETECTED. ZAPRET WILL NOT HELP YOU IN CASE DNS IS SPOOFED !!!DNS CHANGE OR DNSCRYPT MAY BE REQUIRED по-русски: если DNS подменён, zapret не поможет;может потребоваться сменить DNS или зашифровать запросы

В нашем тесте мы подсунули проверке игрушечный справочник, не настоящий. Для одного имени из списка он отвечает ложным адресом. Проверка сравнивает ответ справочника системы с ответом другого справочника и пишет «MISMATCH»: ответы не совпали. Дальше она пробует найти рабочий сервер DoH, не находит и останавливается. В соседнем опыте такой шифрованный сервер в лаборатории был. Проверка перешла на него, и сайт открылся без всякого обхода. Настоящие справочники мы так не проверяли.

Игрушечный справочник и проверка В нашем тесте игрушечный справочник отвечает ложным адресом на одно имя из списка, проверка сравнивает его ответ с ответом другого справочника, пишет, что ответы не совпали, и предупреждает, что zapret не поможет; если рабочего шифрованного сервера нет, она останавливается с кодом 7, а в соседнем опыте нашла его в лаборатории, перешла на него и сайт открылся без всякого обхода; настоящие справочники мы так не проверяли. В НАШЕМ ТЕСТЕИГРУШЕЧНЫЙ СПРАВОЧНИК, НЕ НАСТОЯЩИЙ справочник системы192.0.2.99другой справочник192.0.2.13≠ проверка сравнивает два ответадля одного имени из спискаи пишет, что они не совпали rutracker.org : MISMATCH-- POSSIBLE DNS HIJACK DETECTED. ZAPRET WILL NOT HELP YOU IN CASE DNS IS SPOOFED !!!-- DNS CHANGE OR DNSCRYPT MAY BE REQUIRED дальше проверка ищет шифрованный сервер DoH опыт 1: рабочего сервера нетпять публичных серверов DoH: все FAILcould not find working DoH server. exiting.проверка останавливается, код выхода 7:DNS подменён: zapret здесь не поможет опыт 2: в лаборатории есть такой серверпроверка переходит на него:https://doh.test:8443/dns-query : OKсайт открылся без всякого обхода:working without bypass настоящие справочники мы так не проверяли

А если заблокирован сам шифрованный DNS? Снаружи это обычное защищённое соединение с сервером справочника, и на вики описаны наблюдения, что его обрывали по имени сервера. Если блок по имени, zapret2 может помочь, как с любым сайтом: имя справочника добавляют в список имён и подбирают стратегию. Если блок по адресу сервера, соединение не устанавливается, менять в нём нечего, и zapret2 не поможет. Нужен другой справочник с другим адресом или туннель. Такую блокировку мы в лаборатории не воспроизводили. Подробно об этом отдельные статьи на нашей вики: про Zapret DNS, справочник проекта Zapret, и про то, поможет ли zapret, если блокируют защищённый DNS.

Пять случаев с DNS Пять случаев с DNS: подмену обычного DNS и перенаправление запросов zapret2 не лечит и помогает шифрованный DNS, шифрованный DNS, заблокированный по имени сервера, zapret2 может лечить как обычный сайт, при блоке по адресу сервера нужен другой справочник или туннель, а гео-блокировку лечит другой адрес, VPN или справочник проекта Zapret; блокировку шифрованного DNS мы в лаборатории не воспроизводили. ДОКУМЕНТАЦИЯПО ОБЩИМ СВЕДЕНИЯМ случайпоможет ли zapret2что помогает подмена обычного DNSневерный адрес или «такого имени нет»нет:ответ приходит из сетишифрованный DNS:DoH или DoT запросы уходят к другому DNSна вики описаны наблюдениянет:соединения ещё нетшифрованный DNSна вики он не затронут шифрованный DNS: блок по именисоединение обрывают по имени серверада,как обычный сайтимя справочника в списокимён и подбор стратегии шифрованный DNS: блок по адресусоединение не начинаетсянет:менять нечегодругой справочник с другимадресом или туннель гео-блокировкасервис сам не пускает адрес из странынет:адрес остаётся вашимдругой адрес: VPN илисправочник проекта Zapret кружки: на чём держится строка (цвета как у плашек сверху)блокировку шифрованного DNS по имени и по адресу в нашей лаборатории не воспроизводили

Подробнее о DNS

Второй случай: блок по адресу. Пакеты к определённому адресу не пускают, какое бы имя в них ни стояло. Документация говорит прямо: zapret не может обойти блок по IP. Видов три. Полный блок: не доходит ничего. Блок по порту или протоколу, например закрыт весь порт четыреста сорок три: соединение даже не устанавливается. Для этих двух документация пишет: без проксирования ничего сделать нельзя. Третий вид частичный: соединение устанавливается, а всё, что отправляешь дальше, зависает или обрывается. Это серая зона. Раз соединение проходит, возможно, есть сообщения, которые открывают доступ. Но пробить такой блок, пишет документация, можно, только если у вас есть готовая информация или хватит упорства проверять варианты вручную.

Три вида блока по адресу Документация говорит, что zapret не может обойти блок по адресу, и описывает три вида: полный, когда не доходит ничего, ни пингов, ни соединения на порт; по порту или протоколу, когда соединение даже не устанавливается; и частичный, когда соединение устанавливается, а дальше всё зависает или обрывается; для первых двух без проксирования ничего не сделать, а третий остаётся серой зоной. «zapret не может обойти блок по IP»ДОКУМЕНТАЦИЯ 1полный блокне доходит ничегопингпорт 443без проксированияничего сделать нельзя 2по порту или протоколупинги ходят, порт закрытпингпорт 443без проксированияничего сделать нельзя 3частичный блокрукопожатие проходитрукопожатиеданныесерая зона: пробить можно,только с готовой информациейили ручной проверкой

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

Семь стратегий против двух блокировок Сравнение на одинаковом наборе из семи стратегий проверки и одном веб-сервере в нашем тесте: когда игрушечное правило роутера выбрасывало только пакеты с именем сайта, помогли три стратегии из семи, а когда оно выбрасывало все пакеты к адресу сервера, не помогла ни одна, правило выбросило 27 пакетов и проверка не нашла рабочей стратегии; обе блокировки наши, игрушечные. В НАШЕМ ТЕСТЕигрушечное правило роутера выбрасывает пакеты с именем сайтаблок по имени multisplit:pos=midsldAVAILABLE multisplit:pos=2UNAVAILABLE code=28 multidisorder:pos=midsldAVAILABLE fake ip_ttl=1UNAVAILABLE code=28 fake badsumUNAVAILABLE code=28 fake ip_ttl=1 + pktmodUNAVAILABLE code=28 multisplit:pos=host+1AVAILABLE помогли три стратегии из семиони разрезают приветствие илипереставляют его части В НАШЕМ ТЕСТЕигрушечное правило роутера выбрасывает все пакеты к адресублок по адресу сервера multisplit:pos=midsldUNAVAILABLE code=28 multisplit:pos=2UNAVAILABLE code=28 multidisorder:pos=midsldUNAVAILABLE code=28 fake ip_ttl=1UNAVAILABLE code=28 fake badsumUNAVAILABLE code=28 fake ip_ttl=1 + pktmodUNAVAILABLE code=28 multisplit:pos=host+1UNAVAILABLE code=28 не помогла ни одна из семиправило выбросило 27 пакетов, 1620 байтитог проверки: nfqws2 not working те же семь стратегий blockcheck2 и один веб-сервер, названия сокращены; обе блокировки игрушечные

Итак, подмену DNS и блок по адресу или порту изменением начала соединения не вылечить. От подмены помогает другой или шифрованный DNS, а для адресов нужен VPN или прокси. Исключение: шифрованный DNS, заблокированный по имени. Частичный блок по адресу остаётся серой зоной.

Серая зона: замедление, протоколы, белые списки

А в остальных случаях zapret2 помогает или нет? Программа «может помочь», и новичку важно услышать именно это слово. «Может» здесь и есть весь ответ: возможно, но без гарантий и всегда с проверкой. Ниже три случая, которые нельзя назвать ни «да», ни «нет»: замедление, протоколы и белые списки.

Может помочь, но не гарантирует Программа zapret2 может помочь, а не обходит и не снимает блокировки, и слово может означает возможно, но без гарантий и всегда с проверкой; три случая нельзя назвать ни да, ни нет, это замедление, протоколы и белые списки. описание программыДОКУМЕНТАЦИЯ Может помочь «Может помочь обойти блокировки или замедление сайтов HTTP(S)» не «обходит» не «снимает» «может помочь» возможно, но без гарантий и всегда с проверкой три случая, которые нельзя назвать ни «да», ни «нет» замедление протоколы белые списки

Замедление. В описании сказано, что zapret2 может помочь против замедления сайтов. Больше документация ничего не уточняет, и замедление мы в лаборатории не воспроизводили. По общим сведениям, помочь можно лишь тогда, когда причина замедления видна в первых пакетах, например имя сайта или вид протокола. Если же линия просто перегружена или скорость режут по объёму или по адресу, начало соединения тут ни при чём, и программа этого не лечит. Поэтому и здесь ответ «может», а не «да».

Замедление: когда может помочь Про замедление в описании сказано только, что zapret2 может помочь против замедления сайтов, и в лаборатории его не воспроизводили; по общим сведениям помочь можно, когда причина видна в первых пакетах, например имя сайта или сигнатура протокола, а перегруженную линию или ограничение скорости по объёму или по адресу программа не лечит. описание программыДОКУМЕНТАЦИЯ «Может помочь обойти блокировки или замедление сайтов HTTP(S)» в лаборатории замедление не воспроизводили ПО ОБЩИМ СВЕДЕНИЯМпоможет ли, зависит от причины замедления причина видна в первых пакетахнапример, имя сайта или сигнатурапервые пакеты: тут и видна причинапрограмма может помочь линия перегружена или скорость режутпо объёму или по адресуначало соединения здесь ни при чёмпрограмма этого не лечит

Блок по протоколу. Протокол можно узнать по сигнатуре, и сама программа умеет узнавать по ней много протоколов, не только веб: например WireGuard и QUIC. По общим сведениям, первый это протокол VPN, а второй нужен части современных сайтов. В описании назначения прямо названа блокировка VPN, а в примере из документации есть профиль для WireGuard, STUN и Discord без имени сайта. Если закрыт весь порт, это блок по адресу, мы его уже разобрали. Бывает и так: блокирующий опирается на статистику поведения или на отпечаток клиента, например на порядок расширений в приветствии. По общим сведениям, одной правкой первых пакетов тут не обойтись. Для таких случаев в проекте есть отдельные средства обфускации, то есть маскировки протокола. Полный запрет протокола мы в лаборатории не воспроизводили.

Блок по сигнатуре протокола Блок по протоколу: описание программы называет сигнатурный анализ протоколов и блокировку VPN, сама программа узнаёт по сигнатуре много протоколов, не только веб, среди них WireGuard и QUIC, а в примере из документации есть профиль для WireGuard, STUN и Discord без имени сайта, блокирующие бывают привязаны к отпечатку клиента, по общим сведениям одной правкой первых пакетов тут не обойтись и в проекте есть отдельные средства обфускации, а полный запрет протокола в лаборатории не воспроизводили. описание программыДОКУМЕНТАЦИЯ «... сигнатурный анализ TCP и UDP протоколов, например, с целью блокировки VPN.» программа сама узнаёт сигнатуры протоколов, не только вебДОКУМЕНТАЦИЯ wireguard quic dtls stun dht mtproto xmpp bt dns discord ПО ОБЩИМ СВЕДЕНИЯМwireguard: протокол VPN; quic: нужен части современных сайтов ДОКУМЕНТАЦИЯпро отпечаток клиента«... привязываются к фингерпринту клиента»ABCDпорядок расширений ПО ОБЩИМ СВЕДЕНИЯМодной правкой первых пакетов не обойтись;для таких случаев в проекте есть отдельныесредства обфускации, то есть маскировки полный запрет протокола не воспроизводили закрыт весь порт: это блок по адресу ДОКУМЕНТАЦИЯв примере: профиль для wireguard, stun и discord без имени сайта

Белые списки. По общим сведениям, это когда закрыто всё, кроме разрешённого. Блокирующие ограничивают крупные хостинги, но оставляют доступ к нескольким важным сайтам, и получается белый список. Готового рецепта нет: сегодня так, а завтра будет что-то другое. Есть и другие причины, почему обход может не сработать. Вот часть списка. Проверка blockcheck2 смотрит один домен по одному протоколу, а браузер делает больше. Бывает подмена DNS. Бывают протокол IP шестой версии и QUIC. Остальные причины из списка, вроде ECH и другой версии TLS, смотрите на экране. Важно: результат проверки ещё не гарантия, что сайт откроется в браузере.

Белые списки и пределы проверки Белый список по общим сведениям это когда закрыто всё, кроме разрешённого, готовых рецептов нет и завтра будет что-то другое, а список причин объясняет, почему сайт может не открыться, хотя проверка показала успех: проверка смотрит один домен по одному протоколу, бывает подмена DNS, IPv6 и QUIC, ECH, другая версия TLS, диапазоны адресов и нестабильность; результат проверки не гарантия. ПО ОБЩИМ СВЕДЕНИЯМбелый список: закрыто всё,кроме разрешённого ДОКУМЕНТАЦИЯ«Он не включает в себя готовыхрецептов ... завтра будет ещечто-то другое»про blockcheck2 и про сам zapret список из документации, цифры это номера пунктов: почему сайт не открылсяДОКУМЕНТАЦИЯ проверка узкаяодин домен, один протокол DNSподмена адреса1 IPv6 и QUICбраузер скачет между ними3 ECHимя спрятано шифрованием6 версия TLSпроверка 1.2, браузер чаще 1.37 диапазоны адресовособые правила на диапазонах9 нестабильностьстратегия работает через раз12 бывает, что проверка показала OK, а сайт не открылся:результат проверки ещё не гарантия

Есть и случай, который вообще не про дорогу: сервис сам не пускает адреса из некоторых стран. Это называют гео-блокировкой. По общим сведениям, сервис смотрит, с какого адреса пришло соединение, и по нему определяет страну. Помех на пути здесь нет, а адрес остаётся вашим, поэтому zapret2 не помогает. Помогает другой адрес, например VPN, о нём дальше. Для таких сервисов есть справочник проекта Zapret, Zapret DNS. На вики описано, что для сервисов из его списка он подставляет свой адрес и передаёт соединение дальше, так что сервис видит адрес в Нидерландах. Блокировки на пути он не снимает.

Повторим как таблицу, строка за строкой. Подмена DNS: нет, нужен другой или шифрованный DNS. Шифрованный DNS, заблокированный по имени: да, как обычный сайт. Блок адреса, полный или по порту: нет, тут нужен VPN или прокси. Частичный блок адреса: серая зона. Блок по имени сайта: да, в принципе, и это проверяется. Блок по сигнатуре протокола: тоже «может помочь». Замедление и белые списки: «может», без готовых рецептов. Гео-блокировка: нет, нужен другой адрес. Каждая строка уже прозвучала выше, ничего нового таблица не добавляет. Запомните её: к ней мы будем возвращаться в следующих частях.

Итоговая таблица блокировок Итоговая таблица: подмена DNS и блок адреса полный или по порту zapret2 не лечит и нужен другой или шифрованный DNS либо VPN и прокси, шифрованный DNS, заблокированный по имени сервера, лечится как обычный сайт, частичный блок адреса остаётся серой зоной, блок по имени сайта лечится в принципе и это проверяется, для блока по сигнатуре протокола ответ тоже «может помочь», в лаборатории его не воспроизводили, на замедление и белые списки ответ может помочь без готовых рецептов, а гео-блокировку лечит только другой адрес; у каждой строки отмечено, на чём она держится. ДОКУМЕНТАЦИЯВ НАШЕМ ТЕСТЕПО ОБЩИМ СВЕДЕНИЯМ что блокируютчто видит человекпоможет ли zapret2 подмена DNSчужая страницаили сайта нетнет:другой или шифрованный DNS шифрованный DNS:блок по имени серверасоединение с DNSобрываютда, как обычный сайт:список имён и стратегия блок адреса:полный или по портуничего не доходит,зависаниенет:нужен VPN или прокси частичный блок адресасоединение есть,дальше зависаниесерая зона блок по имени сайтазависание, быстраяошибка, заглушкада, в принципе:и это проверяется блок по сигнатурепротоколане работаетотдельный сервис«может помочь»:лабораторного опыта нет замедлениеоткрывается, ноочень медленно«может»,без гарантий белые спискиоткрываются толькоразрешённые сайты«может», безготовых рецептов гео-блокировкасервис сам не пускаетадрес из странынет:нужен другой адрес цветные кружки справа: на чём держится строка (цвета как у плашек сверху)каждая строка уже прозвучала выше: таблица ничего нового не добавляет

Проверьте себя. Вместо сайта открывается страница-заглушка, и ведёт на неё адрес, который выдал DNS. Поможет ли zapret2? Подумайте несколько секунд.

Нет. Адрес уже подменён, а документация говорит: вы пойдёте на адрес заглушки, и никакой zapret не поможет. Нужен другой или шифрованный DNS.

Проверьте себя: заглушка от DNS Проверьте себя: если вместо сайта открывается страница-заглушка и ведёт на неё адрес, который выдал DNS, то zapret2 не поможет, потому что адрес уже подменён и вы идёте на адрес заглушки, как говорит документация, а нужен другой или шифрованный DNS. проверьте себя Вместо сайта открывается страница-заглушка,и ведёт на неё адрес, который выдал DNS.Поможет ли zapret2? подумайте браузерспрашивает адресDNS отвечает ложным адресомадрес заглушкистраница-заглушкавы пришли не туда Нет.ДОКУМЕНТАЦИЯ«Вы пойдете на IP адрес заглушки, и, естественно,никакой zapret не поможет.»нужен другой или шифрованный DNS

Итак, zapret2 может помочь с блокировками и замедлением сайтов по HTTP и HTTPS и против сигнатурного анализа протоколов TCP и UDP, например при блокировке VPN. Ещё он годится для частичной маскировки протоколов. Общее у них: всё зависит от содержимого или вида пакетов. Имя сайта самый наглядный случай, его показывает наша лаборатория. Подмену DNS, блок по адресу или порту и гео-блокировку он не лечит, и тогда нужен другой путь: шифрованный DNS, VPN или прокси. Чем VPN и прокси отличаются от zapret2, разберём дальше.

VPN и прокси: что это и что они лечат

Коротко о прошлом. Подмену DNS, блок по адресу или по порту и гео-блокировку zapret2 не лечит: он меняет только то, как выглядит начало соединения. Для таких блокировок нужен другой путь, VPN или прокси. Сначала разберёмся, что это такое, а потом сравним их с zapret2.

Начнём с VPN. Пример выдуманный. Вам не открывают магазин на вашей улице, а в другом городе живёт знакомый. Вы отдаёте ему всю свою почту в запечатанном мешке, и он отправляет письма от своего имени. Магазин видит адрес знакомого, а не ваш. По общим сведениям, VPN устроен так же: это зашифрованный туннель от вашего устройства до чужого сервера. Трафик, обычно весь, идёт внутри туннеля и выходит в интернет с адреса этого сервера. Наблюдатель на пути видит адрес сервера, сам факт туннеля и нередко его протокол. Содержимого и конечных адресов он не видит.

Теперь прокси. По общим сведениям, это посредник, который сам открывает соединение с сайтом вместо вас. В нашем примере знакомый берёт не всю почту, а только те письма, которые вы ему отдали. По общим сведениям, прокси обычно настраивают для одной программы или для системы, и через него идёт только её трафик. Шифруется ли путь до прокси, зависит от его вида: обычный HTTP-прокси и SOCKS-прокси этот путь не шифруют. Сайт видит адрес прокси, а не ваш. Разница одной фразой: прокси обычно служит выбранным программам и не обязательно шифрует, а VPN обычно несёт весь трафик устройства через шифрованный туннель. Это зависит от продукта.

Три пути к сайту: напрямую, через VPN и через прокси По общим сведениям, VPN и прокси ведут трафик через чужой сервер, и сайт видит его адрес, а не ваш; на выдуманном примере знакомый в другом городе получает от вас запечатанный мешок с письмами и отправляет их от своего имени, VPN это зашифрованный туннель от устройства до сервера, где наблюдатель на пути видит адрес сервера, факт туннеля и часто протокол, но не содержимое и не конечные адреса, а прокси это посредник для выбранной программы, и путь до обычного HTTP-прокси или SOCKS-прокси не шифруется. три пути к сайту по общим сведениям пример выдуманныйвам не открывают магазин на вашей улице Вы запечатанный мешоксо всеми письмами знакомыйв другом городе магазин от своего имени магазин видит адрес знакомого, а не ваш напрямую устройствосайт сайт видит:ваш адрес через VPN-туннель устройство туннель серверсайт сайт видит:адрес сервера обычно весь трафик устройства наблюдатель на пути видит: адрес сервера факт туннеля часто протокол не видит: содержимое конечные адреса через прокси одна программапроксисайт сайт видит:адрес прокси путь до прокси: зависит от вида,шифруется не всегдаобычный HTTP-прокси и SOCKS-проксиэтот путь не шифруют идёт только трафиквыбранной программы прокси: обычно служит выбранным программам и не обязательно шифрует.VPN: обычно несёт весь трафик устройства через шифрованный туннель. Это зависит от продукта.

Что они лечат, по общим сведениям. Подмену DNS, если запросы к DNS идут через них. Блок по адресу и по порту: ваши пакеты теперь идут не на заблокированный адрес, а на адрес посредника. Гео-блокировку: сервис видит адрес посредника, а не ваш. Иногда ещё скрывают от местной сети, какие сайты вы посещаете. Платят за это так. Нужен сервер, который надо арендовать или которому надо довериться, потому что тот, кто его держит, видит, куда вы ходите. Путь становится длиннее, а скорость иногда ниже. И сам туннель или адрес сервера тоже могут заблокировать. В описании назначения zapret2 как раз названа блокировка VPN как пример сигнатурного анализа.

Теперь честная оговорка. В документации zapret2 нет раздела «чем это отличается от VPN». На главной странице документации слово VPN встречается один раз, в описании назначения, а слова «прокси» нет вовсе. Поэтому всё сказанное про VPN и прокси это общие сведения, а не слова документации. Мы не будем приписывать ей то, чего в ней нет. А сравнение с zapret2 проверим на пакетах нашей лаборатории.

Что лечат VPN и прокси и чем платят По общим сведениям, VPN и прокси лечат подмену DNS, если запросы к DNS идут через них, блок по адресу и по порту, потому что пакеты идут на адрес посредника, и гео-блокировку, потому что сервис видит адрес посредника, а не ваш, и иногда скрывают от местной сети посещаемые сайты, а платят арендой сервера или доверием к нему, более длинным путём и риском, что туннель или адрес сервера тоже заблокируют; в документации zapret2 слово VPN встречается один раз, в описании назначения, слова прокси там нет, и раздела о том, чем zapret2 отличается от VPN, тоже нет. после «нет» в таблице блокировок: другой путь по общим сведениям zapret2 их не лечит: он меняет только начало соединения подмена DNS блок по адресу блок по порту другой путь: VPN или прокси гео-блокировка что лечатпо общим сведениям чем платятпо общим сведениям подмену DNSесли запросы к DNS идут через них блок по адресупакеты идут на адрес посредника блок по портупакеты идут на адрес посредника гео-блокировкусервис видит адрес посредника, а не ваш скрыть посещаемый сайтот местной сети; зависит от вида сервер: арендовать или доверитьсякто его держит, видит, куда вы ходите путь длиннеескорость иногда ниже туннель или адрес сервератоже могут заблокировать документацияdocs/readme.md, раздел «Зачем это нужно» …сигнатурный анализ TCP и UDP протоколов, например, с целью блокировки VPN. в документации нет раздела про отличия от VPN:слово VPN встречается один раз, в описании назначения; слова «прокси» нетвсё про VPN и прокси это общие сведения, а не слова документации Чем отличается от VPN

Итак, VPN и прокси ходят через чужой сервер: трафик идёт к нему, а сайт видит его адрес. Это общие сведения, документация zapret2 тут ничего не сравнивает. Они лечат DNS, блок по адресу, блок по порту и гео-блокировку, а платят сервером и длинным путём. Теперь посмотрим, что делает вместо туннеля zapret2.

Что делает zapret2 вместо туннеля: проверка на пакетах

Вопрос такой. Отправляет ли zapret2 трафик куда-то ещё, как это делает VPN? Меняет ли адрес получателя, прячет ли имя сайта? В выпуске «Письмо в сортировочном центре» мы говорили, что трафик идёт прямо к сайту. Теперь проверим это по пакетам.

Сначала опыт без программы. Правила ядра Linux, то есть настройки перехвата в операционной системе, стоят, но сама программа не запущена. В нашем тесте клиент отправляет запрос одним пакетом. В нём двести пятьдесят байт данных. С заголовками на проводе это триста шестнадцать байт: остальное это заголовки Ethernet, IP и TCP. По общим сведениям, это служебные поля в начале пакета: Ethernet для соседних устройств, IP для адресов, TCP для порядка и подтверждений. Сервер получил двести пятьдесят байт, ровно то, что отправил клиент. Запомним эту картинку: один пакет и один получатель.

Теперь тот же запрос, но программа запущена со стратегией multisplit. Режет она в середине имени сайта, в команде это место называется midsld. В нашем тесте клиент отправил два пакета вместо одного. Оба ушли на тот же адрес сервера и на тот же порт. В первом сто четыре байта, и кончается он на «www.exa». Во втором сто сорок шесть байт, и начинается он с «mple.com». Сервер собрал всё обратно и получил те же двести пятьдесят байт. Адрес и порт получателя не изменились, изменилась только нарезка.

Один пакет без программы и два пакета с программой: получатель тот же В нашем тесте без программы клиент отправил запрос одним пакетом с 250 байтами данных, на проводе это 316 байт (Ethernet 14, IP 20, TCP 32 и данные 250), и сервер получил ровно 250 байт; а с программой и стратегией multisplit с разрезом midsld клиент отправил два пакета, в 104 и 146 байт, на тот же адрес и тот же порт сервера, первый пакет кончается внутри имени сайта, второй начинается с его продолжения, сервер собрал те же 250 байт, и изменилась только нарезка. опыт без программыв нашем тесте с программойв нашем тесте правила ядра Linux стоят, nfqws2 не запущен пакет с запросом (кадр в записи клиента)10.1.0.1:39220 > 10.2.0.2:443[AP] len=250 ttl=64 id=64005 на проводе 316 байт: заголовки и данные Ethernet 14IP 20TCP 32данные 250 14 + 20 + 32 + 250 = 316 SERVER conn 1 total 250chunks [(250, 250)]сервер получил 250 байт один пакет, один получатель --payload=tls_client_hello--lua-desync=multisplit:pos=midsld кадр 410.1.0.1:34544 > 10.2.0.2:443[AP] len=104кончается внутри имени сайта кадр 710.1.0.1:34544 > 10.2.0.2:443[AP] len=146продолжение имени сайта6d 70 6c 65 2e 63 6f 6dmple.com адрес и порт получателя те же,изменилась только нарезка SERVER conn 1 total 250chunks [(104, 104), (146, 250)]stream equals original payload: Trueсервер собрал те же 250 байт метка разреза в команде: midsld

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

Ещё одно отличие: zapret2 работает с началом соединений, а не со всем трафиком. На Linux правило в ядре Linux передаёт программе только первые пакеты каждого соединения. Причина названа в документации: передавать пакеты из ядра Linux в программу дорого, поэтому лишнее отсекают как можно раньше. Остальные пакеты того же соединения идут мимо программы, прямо через ядро Linux. Сколько именно первых пакетов берётся, увидим чуть позже, когда дойдём до самого правила.

Имя сайта не спрятано, и программа видит только начало соединения В нашем тесте разрез по midsld делит запрос в 250 байт на два пакета, в 104 и 146 байт, но имя сайта остаётся открытым текстом и лишь разрезано между пакетами, а сервер собирает его обратно; стратегии режут, переставляют и подделывают пакеты, ничего не шифруют и не меняют получателя, хотя в том же проекте есть средства обфускации, которым нужна программа на обоих концах; кроме того, правило в ядре Linux передаёт программе только первые пакеты каждого соединения, потому что передача из ядра в программу обходится дорого, а остальные пакеты идут мимо программы. разрез ничего не прячетв нашем тесте запрос: 250 байт данных www.example.com нож: midsld, на байте 104 пакет 1: 104 байтаwww.exa пакет 2: 146 байтmple.com имя лежит открытым текстом, только разрезано; сервер собрал его обратно стратегии обхода: зато они: режут пакеты переставляют их добавляют подделки ничего не шифруют не меняют получателя документацияоговорка: в том же проекте есть обфускация, часть сообщений она шифрует,но нужна программа на обоих концах, и это не основной режим (docs/manual.md) zapret2 работает с началом соединенийдокументация … первые: в очередь программы остальные идут мимо программы, прямо через ядро Linux tcp dport "{80,443}" ct original packets queue num bypassdocs/readme.md передавать пакеты из ядра Linux в программу дорого, поэтому лишнее отсекают как можно раньше сколько именно первых пакетов берётся, узнаем чуть позже

Соберём часть в таблицу: проблема и инструмент. Подмена DNS: другой DNS или шифрованный DNS. Адрес и порт: VPN или прокси. Имя сайта и сигнатура протокола: zapret2, и результат нужно проверять. Для адресов из списка блокировок документация готовит отдельный список для стороннего перенаправления и прямо пишет: «требуется VPN или прокси». Сам zapret2 с этим списком ничего не делает и трафик в VPN не направляет. Поэтому главный вопрос всегда один: на каком месте пути стоит помеха.

Проблема и инструмент: что чем лечится Таблица «проблема и инструмент»: подмену DNS по общим сведениям лечит другой или шифрованный DNS, блок по адресу и по порту лечат VPN или прокси, а блок по имени сайта и по сигнатуре протокола это случай zapret2, результат которого нужно проверять; для адресов из списка блокировок документация прямо пишет, что требуется VPN или прокси, а сам zapret2 с этим списком ничего не делает и трафик в VPN не направляет, поэтому главный вопрос всегда один, на каком месте пути стоит помеха. проблема и инструмент проблемачем лечатна чём основано подмена DNSответ DNS подменёндругой DNSили шифрованный DNSпо общим сведениям блок по адресу и по портупакеты идут на заблокированный адресVPN или проксипо общим сведениям имя сайта и сигнатура протоколавидны в начале соединенияzapret2результат нужно проверятьдокументацияв нашем тесте документацияdocs/manual.md, раздел «Система ipban» …ip адреса из этого списка не обходятся автономно, требуется VPN или прокси. сам zapret2 с этим списком ничего не делает и трафик в VPN не направляет главный вопрос всегда один: на каком месте пути стоит помеха?

Проверь себя. Почему нельзя просто сказать: «zapret2 не нужны чужие серверы»?

Потому что без оговорок это неверно. В основном режиме так и есть. Но двусторонней обфускации нужна программа на втором конце. А от полного блока по адресу без проксирования ничего сделать нельзя.

Итак, zapret2 не вместо VPN или прокси, а для другого случая: он остаётся на вашем устройстве, в основном режиме ничего не прячет и меняет только начало соединений. Теперь заглянем внутрь: из чего он состоит и что происходит с одним пакетом.

Из чего состоит zapret2: три слоя и папки

Мы выяснили, что zapret2 остаётся на вашем устройстве и меняет только начало соединений. Теперь заглянем внутрь. Сначала общая картина без подробностей: из каких частей состоит программа и где какая лежит?

Пример выдуманный: проходная на заводе. Охранник на входе отбирает, кого пускать внутрь. В цехе рабочий разбирает каждую деталь и записывает, откуда она. А что делать с деталью, написано в инструкции, которую можно переписать. В zapret2 те же три слоя. Слой перехвата отбирает пакеты и передаёт их программе. На Linux это правило в ядре Linux, то есть в главной части операционной системы. На других системах перехват устроен иначе, об этом чуть дальше. Слой движка: Си-часть программы. Она разбирает пакеты, помнит соединения и выбирает профиль, то есть набор настроек для такого трафика. Слой стратегий: файлы на языке Lua, компактном языке сценариев. Они решают, что сделать с пакетом. Минимальный рабочий набор это именно эти три части. Всё остальное по желанию. Запомним порядок: сначала отбор, потом разбор, потом решение.

Три слоя zapret2: отбор, разбор, решение Три слоя zapret2: слой перехвата отбирает пакеты, на Linux это правило в ядре Linux, а на других системах перехват устроен иначе, Си-часть программы (движок nfqws2) разбирает пакеты, помнит соединения и выбирает профиль, а файлы на Lua решают, что сделать с пакетом; минимальный рабочий набор это именно эти три части, а всё остальное по желанию, и тот же порядок, отбор, разбор, решение, показывает выдуманный пример с проходной завода, где охранник отбирает, рабочий разбирает и записывает, а инструкция на полке решает. из чего состоит zapret2: три слоя пример выдуманныйпроходная на заводе охранникотбирает, кого пускать рабочий в цехеразбирает деталь,записывает, откуда она инструкция на полкечто делать с деталью,её можно переписать те же слои, настоящие имена минимальный рабочий набор (из документации)документация 1слой перехватаперехват пакетовотбираетна Linux: правило в ядре Linux,главной части системы;передаёт пакеты программе;на других системах иначе 2слой движкаСи-часть программы(движок), nfqws2разбирает, помнит,выбирает профильнабор настроекдля такого трафика 3слой стратегийфайлы на Luaрешает, что сделатьLua: компактный языксценариев порядок: сначала отбор, потом разбор, потом решение всё остальное по желанию: blockcheck2 скрипты запуска файл настроек списки

У движка три имени. На 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 и подробное руководство. Зачем нужна каждая папка, станет понятно по ходу выпуска.

Три имени программы, платформы и папки проекта У программы три имени: nfqws2 на Linux, dvtws2 на BSD и winws2 в Windows, перехват пакетов на Linux делают iptables или nftables, на FreeBSD ipfw, на OpenBSD pf, в Windows встроенных средств перехвата нет, и winws2 перехватывает сам через драйвер WinDivert; документация нацеливает проект прежде всего на роутеры с OpenWrt, называет Linux, FreeBSD, OpenBSD и Windows и не поддерживает macOS, а BSD и Windows мы читали по документации и по коду, но не запускали; в папках проекта главные две, Си-часть и Lua, а вокруг них помощники, из которых важнее всего перебор стратегий, файл настроек и скрипты запуска. одна основа, три имени nfqws2Linuxперехват пакетовiptablesnftables в нашей лаборатории dvtws2BSD: семейство системперехват пакетовipfw (FreeBSD)pf (OpenBSD) по документации и по коду winws2Windows: своих средств нетперехват пакетовWinDivert внутри winws2 по документации и по коду BSD и Windows: в нашей лаборатории не запускали платформы по документациидокументация OpenWrt-роутеры: прежде всего Linux FreeBSD OpenBSD Windows macOS: не поддерживается OpenWrt это свободная прошивка для роутеров на основе Linux папки проекта zapret2 минимальный набор вместе со слоем перехвата nfq2/Си-часть программы, 19 файлов lua/6 файлов с кодом на Lua три главных помощника blockcheck2.sh и blockcheck2.d/перебирают стратегии за вас config.defaultнастройки для скриптов запуска init.d/ и common/скрипты запуска: правила и программа остальное: коротко ipset/загружает списки mdig/ и ip2net/работают со списками files/fake/несколько десятков заготовок пакетов binaries/только записка: файлы в релизах docs/краткий readme и подробное руководство в записке сказано: Binaries are only in releases

Итак, у программы три слоя: перехват, Си-часть и Lua. Главные папки: nfq2 и lua. Всё остальное, от blockcheck2 до скриптов запуска, по желанию, но делает программу удобной. Дальше пройдём по пути одного пакета через эти слои.

Путь пакета, часть первая: перехват, разбор, запись о соединении

Как пакет попадает в программу и что она делает с ним сразу? Пример выдуманный. На столе приёма лежат стопки папок, и сотрудник читает только первые листы каждой папки. Остальные листы он не трогает, они идут дальше без чтения. Так и здесь: программа видит только начало каждого соединения, а остальное проходит мимо.

Как отбираются пакеты на Linux, видно по правилам ядра Linux. Вот пять правил из документации, на экране они в таблице, вслух читать их не будем. Четыре отдают пакеты программе, в очередь, то есть в место в ядре, откуда программа их забирает: исходящие и входящие, для TCP и для UDP. По общим сведениям, UDP отличается от TCP тем, что доставку не подтверждает. Порт восемьдесят это обычный HTTP. Порт четыреста сорок три это защищённое соединение. Каждое из этих четырёх правил берёт только первые пакеты соединения и обходит пакеты с пометкой программы: так она отмечает свои пакеты. Пятое правило снимает отслеживание с пакетов, которые отправила сама программа. А слово bypass в первых четырёх значит: если программы на другом конце очереди нет, ядро Linux пропускает пакеты само. В нашем тесте правила стояли, а программа не была запущена, и соединение работало как обычно.

Сколько первых пакетов? В примере из документации, как и в нашей лаборатории, берут первые двенадцать в каждом направлении. Это пример для опытов, а не значение по умолчанию. В настоящем файле настроек, который идёт с программой, числа другие. Для TCP от клиента к серверу двадцать. Обратно, от сервера, десять. Для UDP туда пять. Для UDP обратно три. В нашем тесте штатный скрипт запуска построил именно такие правила. В файле настроек есть и закомментированный режим без ограничения числа исходящих пакетов, и рядом с ним предупреждение: такой режим может сильно нагружать процессор.

Пять правил ядра Linux и сколько первых пакетов они берут Пять правил ядра Linux из документации: четыре отдают в очередь программы только первые пакеты каждого соединения, исходящие и входящие, для TCP на порты 80 и 443 и для UDP на порт 443, обходят пакеты с пометкой программы и содержат слово bypass, то есть без программы ядро пропускает пакеты само, а пятое снимает отслеживание с пакетов с пометкой программы; число первых пакетов 12 это пример из документации и правило нашей лаборатории, а в файле настроек, который идёт с программой, числа другие, 20 для TCP от клиента, 10 для TCP от сервера, 5 для UDP от клиента и 3 для UDP от сервера, и в нашем тесте штатный скрипт запуска построил именно такие правила. как пакеты попадают в программу пример выдуманныйстол приёма бумаг: читают первые листы каждой папки первые листы читает сотрудник,остальные идут дальше без чтения пять правил ядра Linuxдокументация в нашей лаборатории стоят те же правила направлениепротоколпортыпервые пакетыкуда исходящиеTCP80, 443первые 12в очередь программы исходящиеUDP443первые 12в очередь программы входящиеTCP80, 443 (порт сервера)первые 12в очередь программы входящиеUDP443 (порт сервера)первые 12в очередь программы 5снять отслеживание с пакетов с пометкой программыnotrack пакеты с пометкой программыв очередь не идут bypass: если программы нет,ядро Linux пропускает пакеты само в нашем тестеправила стоят, программа не запущенаconnected in 0.3 msSERVER conn 1 total 250соединение работает как обычно по документации и по кодумеханизм там другой сколько первых пакетов пример12в каждом направлении пример из документациии правило нашей лабораториидокументацияв нашем тесте в файле настроек, который идёт с программой, числа другие: 20TCPот клиента 10TCPот сервера 5UDPот клиента 3UDPот сервера в нашем тесте штатный скрипт запуска построил именно такие правила двенадцать это не значение по умолчанию в файле настроек есть и закомментированный режим без ограничения числа исходящих пакетов:в файле предупреждено: он может сильно грузить процессор

А что на других системах? По документации, на FreeBSD, OpenBSD и в Windows ограничителя «первые пакеты» нет: перехватывается весь поток в выбранном направлении. В Windows встроенных средств перехвата нет, поэтому winws2 перехватывает сам, через сторонний драйвер WinDivert. Фильтр задают параметрами самой программы, это группа параметров wf. На BSD порты выбирают в правиле ipfw или pf. Чтобы не нагружать процессор, фильтры сужают, а лишнее программа отсекает сама, своими диапазонами по номеру пакета. Дальше всё одинаково: Си-часть, профили и стратегии на Lua. Всё это мы читали по документации и по коду, но не запускали.

Слой перехвата по системам Слой перехвата зависит от системы: на Linux это правило файервола ядра с очередью и ограничителем первых пакетов соединения, на FreeBSD и OpenBSD правила ipfw и pf перенаправляют программе весь поток по направлению, в Windows встроенных средств нет и winws2 перехватывает сам через драйвер WinDivert, а macOS не поддерживается, зато дальше везде одно и то же: Си-часть, профили и стратегии на Lua. слой перехвата по системамДОКУМЕНТАЦИЯ системакак перехватывает«первые N пакетов» в правиле Linuxправило файервола ядра: iptablesили nftables, очередьесть:первые пакеты соединения FreeBSDправило ipfw с перенаправлениемпакетов программенет:весь поток по направлению OpenBSDправило pf с перенаправлениемпакетов программенет:весь поток по направлению Windowsдрайвер WinDivert внутри winws2;фильтр задают параметры wfнет:весь поток по направлению macOSне поддерживается: нет подходящегосредства перехвата—не применимо дальше везде одно и то же: Си-часть, профили и стратегии на Lua ПО ДОКУМЕНТАЦИИ И ПО КОДУ, В ЛАБОРАТОРИИ НЕ ЗАПУСКАЛИнаша лаборатория: только Linux

Теперь один пакет в журнале программы. Это наш запрос из двухсот пятидесяти байт, журнал взят из нашего теста. Первая строка: пакет пришёл, его длина триста два. Это двести пятьдесят байт данных. Остальное, ещё пятьдесят два байта, заголовки. Следующие две строки: программа разобрала слои, это называется разбором пакета. В строке про IP видно, что пакет идёт от клиента к серверу по протоколу TCP. В строке про TCP: двести пятьдесят байт данных и их первые байты. Дальше строка о том, что программа нашла запись об этом соединении. Запись это её собственная карточка соединения, и в ней уже лежит выбранный набор правил, профиль. О нём чуть позже. Затем программа узнаёт содержимое по сигнатуре: это клиентское приветствие защищённого соединения, и оно целое. Заодно она отмечает версии протокола. Расширения ECH, которое прячет имя, в нём нет. И последняя строка: имя сайта www.example.com. Всё это сделала Си-часть, Lua ещё не звали.

Один пакет в журнале программы: разбор, запись о соединении, имя сайта В нашем тесте журнал программы по одному запросу в 250 байт показывает, что пакет пришёл с длиной 302, это 250 байт данных и 52 байта заголовков, программа разобрала слои IP и TCP, нашла профиль в записи о соединении, по сигнатуре узнала целое клиентское приветствие защищённого соединения без расширения ECH и прочитала имя сайта, и всё это сделала Си-часть программы, слов Lua в этих строках ещё нет. один пакет в журнале программыв нашем тесте журнал программы, наш запрос в 250 байт (строки сокращены знаком …) packet: id=4 len=302 mark=00000000 ifin=(0) ifout=c0(3) пакет пришёл: длина 302250 данных + 52 заголовка IP4: 10.1.0.1 => 10.2.0.2 proto=tcp ttl=64 sport=34544 dport=443 …TCP: len=250 : 16 03 01 00 F5 01 00 00 F1 03 03 0B 91 46 … разбор пакета: слои IP и TCPв TCP: 250 байт данных client mode desync profile/ipcache search target ip=10.2.0.2 port=443using cached desync profile 1 (noname) профиль берётся из записио соединении packet contains tls_client_hello payloadTLS client hello is FULLTLS record layer version : TLS 1.0TLS handshake version : TLS 1.2TLS supported versions ext : TLS 1.3TLS ALPN ext : not presentTLS ECH ext : not presenthostname: www.example.comdiscovered l7 protocoldiscovered hostname содержимое и имя сайта:клиентское приветствиезащищённого соединения,целое, без ECH;имя сайта прочитано строк с LUA: здесь ещё нет, всё это сделала Си-часть программы

А если приветствие не помещается в один пакет? В нашем тесте мы отправили приветствие в тысячу четыреста восемьдесят четыре байта. Программа записала в журнал: приветствие неполное. Она задержала пакет, дождалась остальных частей и, когда всё собралось, проиграла задержанные пакеты заново, как будто они только что пришли. После этого сервер получил приветствие целиком. Наше обычное приветствие короткое и целое, ему всё это не нужно.

Большое приветствие: программа задерживает пакеты, пока не соберёт его целиком В нашем тесте приветствие в 1484 байта не поместилось в один пакет, программа записала в журнале, что приветствие неполное, задержала пакет, дождалась остальных частей и проиграла задержанные пакеты заново, после чего сервер получил приветствие целиком, все 1484 байта, а наше обычное приветствие в 250 байт короткое и целое, и ему всё это не нужно. если приветствие не помещается в один пакетв нашем тесте приветствие в 1484 байта уходит двумя пакетами 1448 байт 36 байт: остаток 1TLS client hello is PARTIALприветствие неполное 2DELAY desync until reasm is complete (#1)программа задержала пакет, ждёт остальное 3REPLAYING delayed packet #1 offset 0собрано: пакеты проиграны заново SERVER conn 1 total 1484сервер получил приветствие целиком наше обычное приветствие короткое (250 байт) и целое: ему всё это не нужно

Итак, в начале пути пакета стоят перехват, на Linux это правило ядра Linux и очередь, затем разбор, запись о соединении, тип содержимого и имя сайта. Всё это делает Си-часть программы, пока без Lua. Дальше программа выберет профиль и решит, что делать с пакетом.

Путь пакета, часть вторая: профиль, стратегия, вердикт

Программа теперь знает тип содержимого и имя сайта. Остаётся главное: как она выбирает, что делать с пакетом, и чем всё кончается? Здесь три шага: выбрать профиль, вызвать стратегию и получить вердикт. Разберём их по очереди на том же запросе из нашего теста.

Сначала выбирается профиль. Пример выдуманный: список правил на проходной. Курьеру налево, бухгалтеру направо, остальным просто пройти. Читают сверху вниз и берут первое подходящее. Профили работают так же. Профиль состоит из условий профиля, например списка имён сайтов, и списка вызовов стратегий, то есть записей вида «применить такую-то стратегию с такими-то настройками». Программа читает профили по порядку, и первый подошедший выигрывает. В самом конце всегда стоит пустой профиль no_action: если ничего не подошло, пакет остаётся в покое. В нашем тесте одна и та же стратегия дала два результата. Когда имя сайта было в списке, сервер получил два куска. В первом сто четыре байта. Во втором сто сорок шесть. Когда имени в списке не было, сервер получил запрос целиком, двести пятьдесят байт. Отличался только список.

Как выбирается профиль Профиль выбирают по порядку, как правила на проходной: читают сверху вниз и берут первое подходящее, а если не подошёл ни один, срабатывает пустой последний профиль no_action и пакет остаётся в покое; в нашем тесте одна и та же стратегия разрезала запрос в 250 байт на два куска по 104 и 146 байт, когда имя сайта было в списке, и оставила запрос целым, когда имени в списке не было. профиль выбирают по порядку: сверху вниз, побеждает первый подошедший выдуманный пример список правил на проходной курьер→ налево бухгалтер→ направо остальные→ просто пройти пришёл бухгалтер эту строку уже не читают читают сверху вниз и берут первое подходящее профили в программе профиль 1условия профиля: имя сайта в списке имёнвызовы: стратегия и её настройки профиль 2условия профиля: TLS, порт 443вызовы: стратегия и её настройки no_actionпустой профиль, всегда последнийпакет остаётся в покое 12соединение соединение 1: имя в списке; соединение 2: имени нет одна и та же стратегия, различается только список В НАШЕМ ТЕСТЕ в списке имён одно слово:example.com имя в приветствии: www.example.com include hostlist check for www.example.com : negativehostlist check for example.com : positivedesync profile 1 (noname) matches выбран:профиль 1 сервер получил: 104 байта146 байт chunks [(104, 104), (146, 250)]два куска: 104 и 146 байт в списке имён одно слово:example.org имя в приветствии: www.example.com include hostlist check for www.example.com : negativehostlist check for example.com : negativehostlist check for com : negativedesync profile 0 (no_action) matches выбран:no_action сервер получил: 250 байт chunks [(250, 250)]запрос целиком: 250 байт

Профиль выбран, и теперь вызов. Си-часть собирает одну таблицу о пакете: что в нём лежит, какое это соединение, какой профиль, в какую сторону он идёт. Эту же таблицу получают по очереди все вызовы профиля. Затем Си-часть вызывает функцию на Lua, имя которой записано в настройках профиля. Перед каждым вызовом она сама проверяет, подходит ли пакет по номеру в соединении и по виду данных: она работает быстрее Lua, и будить его зря незачем.

Вот вторая половина журнала из нашего теста. Строки с приставкой LUA написал уже Lua, остальные Си-часть. Сначала Lua пишет, что режет в середине имени сайта. Потом: место разреза найдено, это сто четвёртый байт. Дальше две части. Первая в сто четыре байта, от начала. Вторая в сто сорок шесть байт, до самого конца. Заметьте, Lua не отправляет пакеты сам, он просит об этом Си-часть. Поэтому после каждой части идёт строка про отправку, её пишет Си-часть, и пакет уходит в сеть со своей пометкой. И последняя строка: исходный пакет выброшен, слово drop.

Вызов стратегии и журнал Вызов стратегии: Си-часть собирает одну таблицу о пакете, сама проверяет номер пакета и вид данных и только потом вызывает функцию на Lua, имя которой записано в настройках профиля, а если все вызовы вышли за свои диапазоны, Lua до конца соединения не трогают; в нашем тесте во второй половине журнала Lua пишет, что режет посередине имени сайта, находит 104-й байт, а отправку частей в 104 и 146 байт каждый раз выполняет Си-часть, и последняя строка сообщает, что исходный пакет выброшен. вызов стратегии: Си-часть готовит таблицу, Lua отвечает Си-частьсобирает таблицу о пакете что в пакетесоединениепрофильнаправление привратникномер пакета и вид данныхпроверяет Си-часть:Lua зря не будят функция на Luaимя записано в строке профиля--lua-desync=multisplit:pos=midsldСи-часть зовёт её по имени одна и та же таблица идёт всем вызовам профиля по очереди все вызовы вне своих диапазонов: Lua до конца соединения больше не трогают вторая половина журнала одного пакета В НАШЕМ ТЕСТЕ строки Си-частистроки с приставкой LUA: LUA: multisplit: split pos: midsld Lua: режем в середине имени сайта LUA: multisplit: resolved split pos: 104 место разреза найдено: байт 104 LUA: multisplit: sending part 1 0-103 len=104 seqovl=0 : 16 03 01 … часть 1: 104 байта, от начала rawsend_dissect repeats=1 size=156 badsum=0 ifout=c0 fwmark=40000000 Си-часть отправляет, в рамке метка LUA: multisplit: sending part 2 104-249 len=146 seqovl=0 : 6D 70 6C … часть 2: 146 байт, до самого конца rawsend_dissect repeats=1 size=198 badsum=0 ifout=c0 fwmark=40000000 снова отправляет Си-часть packet: id=4 drop исходный пакет выброшен: drop Lua сам не отправляет пакеты: он просит Си-часть, поэтому после каждой части идёт её строка.

Это слово и есть вердикт. Вызов отвечает одним из трёх. Pass: пропустить как есть. В нашем тесте так отвечала стратегия, которая ничего не делает, и в журнале стоит «пропущен без изменений». Modify: пропустить с правкой. В нашем тесте так менялся регистр букв в имени сайта в запросе, длина осталась прежней. Drop: не пропускать. Ответы всех вызовов сводятся в один, и любой drop побеждает. Но drop не значит, что данные потеряны. Посчитаем. В нашем тесте в очередь попали шесть исходящих пакетов клиента. Один из них выброшен. Вместо него программа сама отправила два новых. На проводе от клиента вышло семь. Свои пакеты программа метит, и правила ядра Linux по этой пометке не пускают их обратно в очередь. А если в Lua случилась ошибка, пакет проходит без изменений, а уже отправленное остаётся отправленным.

Три вердикта и счёт пакетов Вызов стратегии отвечает одним из трёх вердиктов: pass пропускает пакет как есть, modify пропускает его с правкой, drop не пропускает, и любой drop побеждает, но данные при этом не теряются; в нашем тесте из шести исходящих пакетов клиента один выброшен, программа сама отправила вместо него два новых в 104 и 146 байт, на проводе вышло семь, а ошибка в Lua оставляет пакет без изменений. ответ вызова одним словом: pass, modify или drop PASS пропустить как естьстратегия ничего не делает LUA: passpacket: id=4 pass unmodified MODIFY пропустить с правкойв HTTP-запросе меняется регистр LUA: http_domcase: www.example.com => WwW.ExAmPlE.CoMpacket: id=4 pass modified. len 133 => 133 DROP не пропускать, но данныене потеряны: часто это замена packet: id=4 dropответы вызовов сводятся в один: побеждает drop drop не значит «потеряли»: посчитаем В НАШЕМ ТЕСТЕ в очереди программы шесть исходящих пакетов клиента id 1id 3id 4id 8id 9id 11 id 4 выброшен на проводе от клиента вышло семь id 1id 3id 8id 9id 11 104 146 новые: 104 и 146 байт 6 → 5 + 2 = 7шесть в очереди, один выброшен,два добавлены, семь на проводе правила ядра Linux вместе с меткой не пускаютсвои пакеты обратно в очередь ошибка в Lua: пакет проходит без изменений,а уже отправленное остаётся отправленным

Итак, профиль выбирается по порядку, и первый подошедший выигрывает. Вызов получает таблицу о пакете и отвечает вердиктом, а ответы всех вызовов сводятся в один. Слово drop значит не «потеряли», а часто «заменили»: пакет выбросили, зато отправили два новых. Ошибка в Lua пакет не ломает.

Где кончается Си и начинается Lua

Что делает Си-часть программы, что делает Lua и зачем такое разделение? Пример выдуманный: двигатель и рецепты. Двигатель быстрый, и устроен он один раз. Рецепты меняют часто, и каждый может написать свой. Хорошо, когда их можно менять отдельно от двигателя.

Что умеет Си-часть, в трёх группах. Первая: приём пакета. Перехватить его, разобрать, запомнить соединение и узнать тип содержимого. Вторая: сложные случаи. Держать составные сообщения и проигрывать их заново, выбирать профиль и сверять списки имён. Третья: служебное. Отправлять свои пакеты, хранить блобы, то есть готовые двоичные заготовки вроде поддельного пакета, держать мост к Lua, вести таймеры и следить за безопасностью.

Про безопасность одна фраза: права администратора программа сбрасывает до запуска Lua, и файл стратегии не может запускать программы. А вот воздействия на трафик в Си-части нет совсем. Там нет никаких возможностей собственно для воздействия на трафик. Всё, что умеет Си-часть, служебное: взять, разобрать, запомнить, отправить.

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

Остальные три нужны не всегда. Обфускация, то есть маскировка протокола. Запись пакетов в файл для проверки. И самопроверка. Программа и Lua-файлы должны быть из одного релиза, иначе Lua выдаст ошибку, и в сообщении об ошибке так и сказано.

Что делает Си-часть и что делает Lua Двигатель быстрый и устроен один раз, а рецепты меняют часто, и так же делится программа: Си-часть перехватывает пакеты, разбирает их, помнит соединения, ведёт профили и списки имён, отправляет свои пакеты и следит за безопасностью, но сама не воздействует на трафик, а шесть файлов на Lua хранят помощников, сами стратегии, автоматику, обфускацию, запись пакетов и самопроверку, и программа вместе с этими файлами должна быть из одного релиза. Си-часть берёт и отправляет пакеты, Lua решает, что с ними делать выдуманный пример двигательбыстрый, устроен один раз рецептыменяют часто, каждый может написать свой Си-часть программы (движок) Lua пока пусто 1. приём пакетаперехватить · разобрать · запомнить соединение ·узнать тип содержимого 2. сложные случаидержать составные сообщения и проигрывать заново· выбирать профиль и сверять списки имён 3. служебноеотправлять свои пакеты · хранить блобы, то естьготовые двоичные заготовки, например поддельныйпакет · мост к Lua · таймеры · безопасность ДОКУМЕНТАЦИЯ «там нет никаких возможностей собственно длявоздействия на трафик» файл стратегии не может запускать программы скрипты запуска загружают всегда: нужны не всегда: zapret-lib.luaбиблиотека помощников2739 строк zapret-antidpi.luaбиблиотека стратегий: их 251250 строк zapret-auto.luaавтоматика577 строк zapret-obfs.luaобфускация, маскировка протокола487 строк zapret-pcap.luaзапись пакетов в файл40 строк zapret-tests.luaсамопроверка1157 строк Lua-файлы и программа должны бытьиз одного релиза, иначе Lua выдаст ошибку стратегия это функция, которую вызывают по имениновая стратегия: правка Lua-файла и перезапуск, программу пересобирать не нужно

Зачем разделять? В предыдущей версии проекта, zapret, стратегии были зашиты прямо в Си-код, и написать новую было нелегко: нужны квалификация и время. Задумано так, чтобы стратегию мог написать любой, кто разбирается в сетях и немного умеет программировать. Это про гибкость, а не про то, что так эффективнее. Практический вывод: новая стратегия это правка Lua-файла и перезапуск. Пересобирать программу не нужно. А готовым решением можно потом поделиться с друзьями.

Проверим на опыте. В нашем тесте в список стратегий мы нарочно вписали multisplit с опечаткой: multisplt. Программа ответила: «функции multisplt не существует». Это значит, что имя стратегии ищется в момент вызова, как имя обычной функции, а не зашито в Си-код заранее. Поэтому новую стратегию достаточно добавить в Lua-файл.

Теперь весь путь целиком, станция за станцией. На Linux правило ядра Linux отбирает первые пакеты. Они попадают в очередь программы. Си-часть разбирает пакет на слои. Находит или создаёт запись о соединении. Узнаёт тип содержимого и имя сайта. Выбирает профиль. Вызывает функции на Lua. Получает вердикт и отправляет пакеты. Восемь станций, и Lua решает только на одной из них. Остальные работают без него: даже когда профиль ничего не делает, пакет всё равно проходит станции до самого профиля.

Восемь станций пути пакета Весь путь пакета по станциям: перехват отбирает пакеты, на Linux правилом ядра, на Windows драйвером WinDivert, они попадают в очередь, Си-часть разбирает пакет, находит запись о соединении, узнаёт тип содержимого и имя сайта, выбирает профиль, вызывает функцию на Lua и получает вердикт, так что Lua решает только на одной станции из восьми; в нашем тесте стратегия с опечаткой в имени дала ответ, что такой функции не существует, а строку с именем сайта без приставки LUA написала Си-часть. весь путь пакета: восемь станций, и Lua решает только на одной 1перехватLinux: правило ядраWindows: WinDivert 2очередьpacket: id=4 len=302 3разбор на слоиTCP: len=250 4запись соединенияusing cached desyncprofile 1 (noname) 5тип и имя сайтаhostname:www.example.com 6выбор профиляdesync profile 1(noname) matches 7вызов Lua* lua 'multisplit_1_2': desync здесь решает Lua 8вердикт и отправкаpacket: id=4 drop ядро LinuxСи-часть: строки без приставкиLua Lua решает только на одной станции из восьми, остальные работают без негодаже когда профиль ничего не делает, пакет проходит станции до самого профиля В НАШЕМ ТЕСТЕимя стратегии с опечаткой, внесённой нарочно --lua-desync=multisplt:pos=midsld desync function 'multisplt' does not exist имя ищется в момент вызова, как имя обычнойфункции, а не зашито в Си-код заранее проверь себя hostname: www.example.comприставки LUA нет: кто написал строку? hostname: www.example.comСи-часть: имя сайта она достала сама, до первого вызова Lua

Проверь себя. В журнале встретилась строка «hostname: www.example.com», приставки LUA в ней нет. Кто её написал, Си-часть или Lua?

Си-часть. Имя сайта она достала сама, ещё до первого вызова Lua. Приставку LUA несут только строки, которые пишет Lua, так что по приставке в журнале всегда видно, чья это работа.

Итак, Си-часть программы перехватывает, разбирает и отправляет пакеты, а Lua решает, что с ними делать; стратегия это функция, которую вызывают по имени. Дальше посмотрим, чем всем этим управляют: опциями, профилями и аргументами стратегий.

Опции: восемь групп и три класса

Мы узнали, что делает Си-часть и что делает Lua. Осталось понять, чем всем этим управляют. Какие настройки есть у программы и как они устроены?

Настройка в командной строке называется опцией: это слово, которое начинается с двух чёрточек. Опций много, но по смыслу их можно разложить на восемь групп. Первые четыре группы про то, что и как программа берёт. Как пакеты попадают в программу: например, номер очереди, в которую ядро Linux их кладёт. Что загрузить: файлы на Lua и блобы, то есть готовые куски байтов, вроде заготовки поддельного пакета. Профили: сколько их и как они разделены. Условия профиля: например, какой порт нужен.

Дальше четыре группы про работу с соединением и запуск. Какие пакеты соединения брать: например, только первые. Память о соединении и сборка сообщения из частей. Отладка: куда писать журнал. И наконец права и запуск: от какого пользователя работать и как стать фоновой службой. Сверх этого есть настройки для IPv6 и для автоматических списков имён.

Опции делятся ещё и на три класса. Пример выдуманный: пульт печи. Выключатель общий. Выбор блюда открывает новую страницу. Ручки температуры и времени действуют на выбранное блюдо. В программе так же. Глобальные опции действуют на всё. Профильные начинаются заново после слова new: оно открывает следующий профиль. А ручки это вид данных, то есть какие пакеты по содержимому брать, например только приветствие, и два диапазона, то есть какие по счёту пакеты брать, для входящих и для исходящих; они действуют на вызовы стратегий, записанные после них.

Восемь групп опций и три класса Опции программы делятся на восемь групп, а именно как пакеты попадают в программу, что загрузить, профили, условия профиля, какие пакеты соединения брать, память о соединении и сборка, отладка и права с запуском, плюс отдельные настройки для IPv6 и автоматических списков имён, и ещё на три класса по образу выдуманного пульта печи: глобальные действуют на всё, профильные начинаются заново после слова new, а ручки задают вид данных и два диапазона для вызовов стратегий, записанных после них. опции: восемь групп и три класса Си-часть: перехват, разбор, отправка Lua: решает чем управлять? первые четыре: что и как программа берёт вторые четыре: работа с соединением и запуск 1как пакеты попадаютв программу--qnum 2что загрузить--lua-init--blob 3профили--new 4условия профиля--filter-tcp 5какие пакетысоединения брать--payload 6память о соединениии сборка сообщения--ctrack-timeouts 7отладка--debug 8права и запуск--user сверх этого есть настройки дляIPv6автоматических списков имён выдуманный пример: пульт печи общий выключатель выбор блюдаблюдо 1блюдо 2блюдо 3 две ручкитемпературавремя глобальныедействуют на всё профильныепосле слова new начинаются заново:чистая страница ручкивид данных и два диапазона: для входящихи для исходящих; действуют на вызовы после них

Теперь настоящая команда. Сначала смысл, потом слова: строка читается слева направо, и каждая часть отвечает на свой вопрос. В нашем тесте лаборатория запускает программу самой простой из своих строк. Разрежем её на части. Номер очереди: двести. Файл журнала. Папка, куда Lua разрешено писать. Три файла на Lua: общая библиотека, готовые стратегии и запись пакетов. Условия профиля: только TCP и порт четыреста сорок три. Вызов, который записывает пакеты в файл. И в конце то, что меняется от опыта к опыту: вид данных и сама стратегия. При запуске программа печатает в журнал, как поняла строку: один профиль без имени и два вызова. Ручки у них выставлены по-разному: у записи пакетов открыты обе стороны, а у стратегии входящие закрыты.

Настоящая команда разрезана на части Настоящая команда нашей лаборатории разрезана на подписанные части: очередь 200, файл журнала, папка для записи, три файла Lua, условия профиля с TCP и портом 443, вызов записи пакетов и в конце вид данных со стратегией multisplit; в журнале при запуске видно, как программа поняла строку, один профиль без имени и два вызова, у записи пакетов обе стороны открыты, а у стратегии входящие закрыты, и опции программы это отдельный список от аргументов стратегии, которые пишут после её имени через двоеточие. настоящая команда нашей лаборатории, разрезанная на части В НАШЕМ ТЕСТЕ --qnum=200очередь 200 --debug=@nfqws.logфайл журнала --writable=.папка для записи Lua --lua-init=@zapret-lib.luaбиблиотека --lua-init=@zapret-antidpi.luaготовые стратегии --lua-init=@zapret-pcap.luaзапись пакетов --filter-tcp=443условия профиля: TCP, порт 443 --in-range=aручка: открыто --lua-desync=pcap:file=nfqws_seen.pcapвызов: записать пакеты --in-range=xручка: закрыто --payload=tls_client_helloвид данных --lua-desync=multisplit:pos=midsldстратегия опыта как программа поняла строку: журнал при запуске profile 1 (noname) lua pcap(file="nfqws_seen.pcap" range_in=a0-a0 range_out=a0-a0 payload_type= all) profile 1 (noname) lua multisplit(pos="midsld" range_in=x0-x0 range_out=a0-a0 payload_type= tls_client_hello) x: закрытоa: открыто a: открытоa: открыто один профиль без имени и два вызова; у записи пакетов открыты обе стороны, у стратегии входящие закрыты запомните разницу: это два разных списка опции программы--qnum=200 --filter-tcp=443относятся к программе и к профилямначинаются с двух чёрточек ≠ аргументы одной стратегиипишутся сразу после имени, через двоеточие multisplit:pos=midsldимя стратегии, аргумент pos (позиция)и его значение midsld глобальных настроек обманок нет: обманки, по-научному fooling, это аргументы самих стратегий

Запомните разницу. Опции относятся к программе и к профилям. А аргументы относятся к одной стратегии: они пишутся сразу после её имени, через двоеточие. В нашей строке это стратегия multisplit с одним аргументом: pos, то есть позиция, и значение midsld. Это два разных списка: опции программы и аргументы стратегии. Глобальных настроек для обманок в программе нет: обманки, по-научному fooling, это аргументы самих стратегий, и о них чуть позже.

Опций много, но они укладываются в восемь групп и три класса. Опции программы и аргументы стратегии это два разных списка. Как читать такую строку слева направо, подробно показывает выпуск «Читаем командную строку zapret2».

Профили, условия профиля, диапазоны и списки

Как в одной команде задать разное поведение для разного трафика? Представьте тетрадь со страницами. Пример выдуманный. На каждой странице заголовок и инструкция. Вы идёте сверху вниз и берёте первую страницу, чей заголовок подходит, а остальные не читаете. Так программа выбирает профиль для соединения. Посмотрим, как это записывается в команде.

Профиль это страница. Слово new переворачивает страницу. Заголовок страницы это условия профиля. Какой транспорт и порт: TCP или UDP. Какой протокол программа узнала в потоке, например TLS или QUIC. Есть ли имя сайта в списке имён, или адрес в списке адресов. Страница может сказать, например, «только TLS на порту четыреста сорок три». Подходит первая страница сверху, даже если ниже есть ещё подходящие. Если не подошла ни одна, срабатывает пустой последний профиль, и трафик идёт как есть. В файле настроек из коробки три такие страницы: для HTTP, для TLS и для QUIC. Их мы разберём сразу после этого.

Мы уже видели это в лаборатории. Стратегия одна, различается только список имён. В первом списке одна строка: example.com. Во втором: example.org. Имя в приветствии www.example.com, поддомены в список входят сами. В первом случае сервер получил два куска. Сначала сто четыре байта, потом сто сорок шесть. Во втором все двести пятьдесят байт одним куском.

Профиль как страница и пара опытов Профиль это страница тетради с заголовком из условий профиля: транспорт и порт, протокол потока, список имён и список адресов, программа идёт сверху вниз и берёт первую подходящую страницу, в файле настроек из коробки таких страниц три для HTTP, TLS и QUIC, а последняя пустая no_action ничего не делает; в нашем тесте при одной и той же стратегии сервер получил два куска по 104 и 146 байт, когда имя сайта было в списке, и все 250 байт одним куском, когда его там не было. профиль это страница: заголовок задаёт условия профиля выдуманный пример: тетрадь заголовок 1инструкция заголовок 2инструкция заголовок 3инструкция берём первую подходящую страницу,остальные не читаем транспорт и порт протокол потока список имён список адресов в файле настроек из коробки три страницы HTTPTCP, порт 80, протокол http TLSTCP, порт 443, протокол tls QUICUDP, порт 443, протокол quic no_actionпустая, последняя: ничего не делать мы уже видели это в лаборатории: стратегия одна, различается только список В НАШЕМ ТЕСТЕ имя в приветствии: www.example.com, поддомены входят сами в списке имён:example.com hostlist check for example.com : positivedesync profile 1 (noname) matches 104 байта146 байтchunks [(104, 104), (146, 250)] в списке имён:example.org hostlist check for example.com : negativedesync profile 0 (no_action) matches 250 байтchunks [(250, 250)]

Второй вопрос: на каких пакетах соединения звать вызов. Пример выдуманный: из каждой папки с письмами берут только первые листы. Так работают диапазоны. Пакеты можно считать по номеру, по номеру среди пакетов с данными или по числу байт; как записывать диапазон, объясняет другой выпуск. Нам важны два правила. Первое: входящие пакеты по умолчанию закрыты. Программа не знает, что нужно функции, и не хочет отправлять в Lua гигабайты скачанного. Исходящие по умолчанию открыты. Второе: когда все вызовы профиля вышли за свои диапазоны, программа больше не обращается к Lua в этом соединении, и тогда остальные пакеты проходят мимо Lua.

Есть ещё автоматические списки имён. Обычный список вы пишете сами. Автоматический пополняет программа. Пример выдуманный: вахтёр, который записывает в журнал тех, к кому трижды не смог дозвониться. Так и здесь. Если с каким-то именем несколько раз подряд случаются неудачи, программа записывает его в файл, и с этой минуты профиль применяется к нему. Неудача это повторные отправки пакетов, сброс соединения в самом начале, перенаправление на другой домен, а для UDP много исходящих пакетов и почти нет входящих. По умолчанию нужно три неудачи за шестьдесят секунд, а удача обнуляет счёт. Из файла программа ничего не удаляет. Это правило самой программы, а не сведения о том, как ведёт себя настоящая блокировка. Как оно работает вместе со сменой стратегий, разбирает выпуск про автоматическую смену стратегий.

Диапазоны и автоматические списки имён Диапазон решает, на каких пакетах соединения звать вызов: исходящие по умолчанию открыты, входящие закрыты, чтобы скачанное не шло в Lua, а когда все вызовы вышли за свои диапазоны, Lua до конца соединения не трогают; автоматический список имён пополняет сама программа, когда с именем несколько раз случаются неудачи, то есть повторные отправки, сброс соединения в самом начале, перенаправление на другой домен или у UDP много исходящих и почти нет входящих, по умолчанию три неудачи за шестьдесят секунд, и это правило программы, а не сведения о настоящей блокировке. диапазон: на каких пакетах соединения звать вызов исходящие пакеты: по умолчанию открыты 1 2 3 4 5 6 7 8 9 10 11 12 входящие пакеты: по умолчанию закрыты чтобы скачанное не шло в Lua примервызов просит только первые пять пакетов все вызовы вне диапазона: Lua не трогаем до конца соединения автоматические списки имён: пополняет сама программа признаки неудачи повторные отправки пакетов сброс соединения в самом начале перенаправление на другой домен UDP: много исходящих, почти нет входящих выдуманный пример: вахтёртрижды не дозвонился, записал в журнал неудачи с одним именем 1 2 3 по умолчанию: три неудачи за 60 секунд успех обнуляет счёт имя записано в файл файл списка…имя сайта из файла программаничего не удаляет ПРОГРАММА правило программы, а не сведения о том, как ведёт себя настоящая блокировка

Профиль это страница с условиями профиля. Диапазон решает, на каких пакетах соединения звать вызов. Список имён решает, к каким сайтам применяется страница, и его может пополнять сама программа. А что именно сделать на этой странице, записано в строке стратегии.

Настоящая строка из коробки и аргументы стратегий

Сейчас обойдёмся без выдуманных примеров: перед нами настоящая строка, которую программа собирает сама из файла настроек. Это не код, а набор настроек. Как выглядит строка стратегии и что значат её аргументы?

Файл настроек из коробки называется config.default. В нём одна длинная строка со стратегиями, и она состоит из трёх профилей. Первый для HTTP: сначала поддельный запрос, потом настоящий запрос, разрезанный после первых двух букв метода. Второй для TLS: поддельное приветствие с MD5 и сдвинутым номером, потом настоящее приветствие, разрезанное по двум позициям, причём куски уходят в обратном порядке. Третий для QUIC: поддельный пакет, который повторяется несколько раз. MD5 и сдвиг номера это обманки: что это такое, объясним через минуту. Очередь, пользователя, пометку и три файла на Lua скрипт запуска добавляет сам, поэтому в строке только профили и стратегии. Списки имён скрипт подставляет на место заглушек. И здесь стоит ограничитель: свежая установка ничего не делает, пока вы её не включите. Помогают ли эти настройки в настоящей сети, мы не проверяли.

Строка стратегий из коробки Настоящая строка стратегий из файла настроек из коробки состоит из трёх профилей, для HTTP, TLS и QUIC, у каждого есть условия профиля, вид данных и вызовы стратегий с аргументами: для TLS сначала идёт поддельное приветствие с обманками MD5 и сдвигом номера, потом настоящее приветствие, разрезанное по двум позициям в обратном порядке; очередь, пользователя, метку и три файла Lua добавляет скрипт запуска, а свежая установка ничего не делает, пока её не включат. строка из коробки: профили, вызовы, аргументы В НАШЕМ ТЕСТЕ условия профиля вид данных вызов стратегии профили разделяет слово --new HTTPпрофиль 1 --filter-tcp=80--filter-l7=http--payload=http_req 1--lua-desync=fake:blob=fake_default_http:tcp_md5сначала поддельный запрос с обманкой MD5 2--lua-desync=multisplit:pos=method+2потом настоящий запрос, разрезанный после первых двух букв метода --new TLSпрофиль 2 --filter-tcp=443--filter-l7=tls--payload=tls_client_hello 1--lua-desync=fake:blob=fake_default_tls:tcp_md5:tcp_seq=-10000сначала поддельное приветствие с MD5 и сдвигом номера: обе обманки 2--lua-desync=multidisorder:pos=1,midsldпотом настоящее приветствие: две позиции, куски в обратном порядке --new QUICпрофиль 3 --filter-udp=443--filter-l7=quic--payload=quic_initial 1--lua-desync=fake:blob=fake_default_quic:repeats=6поддельный пакет, который повторяется несколько раз в строке нет служебных опций: их добавляет скрипт запуска --user=daemon--fwmark=0x40000000--qnum=300очередь 300: так в лаборатории--lua-init=@zapret-lib.lua--lua-init=@zapret-antidpi.lua--lua-init=@zapret-auto.lua и подставляет списки имён на место заглушек NFQWS2_ENABLE=0свежая установка ничего не делает, пока не включить помогают ли такие настройкив настоящей сети, не проверяли

В нашем тесте скрипт из коробки собрал именно такую команду. Посмотрим, что сделал профиль для TLS. Первым ушёл поддельный пакет в шестьсот восемьдесят байт, с опцией MD5. Замысел в том, что получатель такой пакет выбросит. Потом настоящее приветствие тремя кусками, хвостом вперёд. Сначала кусок в сто сорок шесть байт. Потом в сто три. Последним кусок в один байт. Сервер всё равно получил двести пятьдесят байт, и подделка в его данные не попала.

Что ушло на провод при строке из коробки В нашем тесте профиль для TLS отправил с клиента сначала поддельное приветствие в 680 байт с опцией MD5, потом настоящее приветствие тремя кусками хвостом вперёд, 146, 103 и 1 байт, а сервер всё равно получил ровно 250 байт, и подделка в его данные не попала. профиль для TLS: что ушло с клиента В НАШЕМ ТЕСТЕ настоящее приветствие: 250 байт и две позиции разреза, 1 и midsld байты 1–103: 103 байтабайты 104–249: 146 байт позиция 1midsld = 104байт 0 на проводе, по порядку, слева направо 1поддельное приветствие680 байтопция MD5, номер сдвинут 2настоящий146 байтбайты 104–249 3настоящий103 байтабайты 1–103 4настоящий1 байтбайт 0 куски настоящего приветствия уходят хвостом вперёд замысел: получательтакой пакет выбросит сервер получил 250 байт одним куском, подделка в его данные не попалаSERVER conn 1 total 250 chunks [(250, 250)]принятый поток равен исходному приветствию

Теперь аргументы. Вот общая шпаргалка, эти слова понимает большинство стратегий. Начнём с четырёх главных. Dir: в какую сторону пакеты трогать, от клиента или к клиенту. Обманки, по-научному fooling: изменения, после которых получатель пакет игнорирует, например короткое время жизни, опция MD5, испорченная контрольная сумма или сдвиг номеров. Repeats: отправить пакет несколько раз. И pos: список меток, где резать, о них дальше.

Ещё четыре аргумента есть на экране, назовём их коротко. Payload: второй фильтр по виду данных, страховка от ошибки в строке. Blob: чем заполнить поддельный пакет. Nodrop: не выбрасывать оригинал, когда стратегия посылает свои куски. Seqovl: перекрытие номеров, сейчас нам нужно только название. У отдельных стратегий есть и свои особые аргументы, но этого набора достаточно, чтобы читать строку.

Общие аргументы стратегий Шпаргалка общих аргументов стратегий: четыре главных, направление пакетов, обманки с примерами короткого времени жизни, опции MD5, испорченной контрольной суммы и сдвига номеров, повтор пакета и список меток, где резать, и ещё четыре, второй фильтр по виду данных, содержимое поддельного пакета, сохранение оригинала и перекрытие номеров, а читается строка так: имя стратегии, затем аргументы через двоеточие. аргументы стратегии: общая шпаргалка аргументы пишут сразу после имени стратегии, через двоеточие --lua-desync=fake:blob=fake_default_tls:tcp_md5 имя стратегииаргументы четыре главных, их разберём сейчас dirв какую сторону пакеты трогать: от клиента или к клиенту обманкипо-научному fooling: изменения, после которых получатель пакет игнорирует ip_ttlкороткое время жизниtcp_md5опция MD5badsumиспорченная контрольная суммаtcp_seqсдвиг номеров repeatsотправить пакет несколько раз posсписок меток, где резать, о них дальше ещё четыре, коротко payloadвторой фильтр по виду данных: страховка от ошибки в строке blobчем заполнить поддельный пакет nodropне выбрасывать оригинал, когда стратегия посылает свои куски seqovlперекрытие номеров: сейчас нужно только название у отдельных стратегий есть и особые аргументы, но этого набора хватает, чтобы читать строку

Теперь ловушка. Одна и та же обманка, короткое время жизни, в двух местах. Пример выдуманный: открытка «довезти только до первого узла». На первом узле её увидят, а адресат уже нет. Первое место: поддельный пакет. В нашем тесте он умирает на роутере, роутер отвечает, что время вышло, и до сервера доходит только настоящий пакет. Это то, что нужно. Второе место: куски стратегии multisplit. Она накладывает обманку и на настоящие куски, они умирают, и сервер не получает ни байта. А поддельный пакет совсем без обманок дошёл до программы сервера: она приняла шестьсот восемьдесят байт за свои данные. Вывод простой: обманку ставят на подделку, а не на настоящие данные.

Ловушка обманки на настоящих кусках Одна и та же обманка, короткое время жизни пакета, в двух местах даёт разный результат: на поддельном пакете она умирает на роутере и сервер получает честные 250 байт, на настоящих кусках стратегии multisplit умирают они сами и сервер получает ноль байт, а подделка вообще без обманок доходит до программы сервера и та принимает 680 байт за свои данные. одна обманка, два места: короткое время жизни В НАШЕМ ТЕСТЕ 1. обманка на подделкеfake:blob=fake_default_tls:ip_ttl=1 клиентроутерсервер 680подделка: умираетна роутере, он отвечает«время вышло» 250настоящий пакет:доходит до сервера сервер получил 250 байт,подделки в данных нет 2. обманка на настоящемmultisplit:pos=midsld:ip_ttl=1 клиентроутерсервер 104куски 104 и 146 байт:умирают на роутересами сервер получил 0 байт:соединение сломано 3. подделка без обманокfake:blob=fake_default_tlsобманок нет клиентроутерсервер 680подделка доходит досервера целиком программа сервераприняла 680 байт засвои данные, ответа нет пример выдуманный: открытка«довезти только до первого узла»:на первом узле её увидят,а адресат уже нет вывод: обманку ставят на подделку,а не на настоящие данные

Строка настроек это профили, вызовы и аргументы. Обманка на настоящих кусках ломает соединение, а на подделке делает её безвредной для сервера. Из коробки без включения программа ничего не делает. Как работают сами подделки, разбирает выпуск «Фейк и его условия».

Метки позиций: основа для всего дальнейшего

Как сказать программе «режь здесь»? Можно числом. Но имя сайта в нашем приветствии начинается с байта девяносто семь. А в нашем запросе HTTP оно начинается с байта тридцать два. Число, которое подходит одному пакету, для другого уже мимо. Нужен способ сказать «в начале имени» словами.

Позицию можно задать тремя способами. Числом: сколько байт стоит перед разрезом, считая от нуля. Отрицательным числом: тогда счёт идёт с конца, и минус один это последний байт. И словом, то есть меткой позиции; это не пометка, которую программа ставит на свои пакеты. Меток девять, объясним четыре. Host: первый байт имени сайта. Midsld: середина домена второго уровня, у нас это слово example. Sniext: начало поля, в котором в приветствии лежит имя. Method: начало метода запроса HTTP. К метке можно прибавить число или вычесть его, например «midsld плюс один». Если меток несколько, программа сортирует их и убирает повторы, а метку, которой в пакете нет, молча отбрасывает. Слова работают только для запроса HTTP и приветствия TLS: программа сначала должна узнать, что внутри пакета. У нашего QUIC слова ничего не нашли, сработали только числа.

Позиции и метки на двух пакетах Число, которое подходит одному пакету, для другого уже мимо: имя сайта в нашем приветствии начинается с байта 97, а в нашем запросе HTTP с байта 32, поэтому позицию задают числом, числом с конца или словом-меткой, и в нашем тесте метки host, midsld и endhost превратились в 97, 104 и 112 на приветствии и в 32, 39 и 47 на запросе, а для QUIC слова ничего не нашли и сработали только числа. как сказать программе «режь здесь» В НАШЕМ ТЕСТЕ наше приветствие: 250 байтимя сайта начинается с байта 97 наш запрос HTTP: 81 байтимя сайта начинается с байта 32 число, которое подходит одному пакету, для другого уже мимо: нужно сказать «в начале имени» словами позицию можно задать тремя способами число104сколько байт стоит до разреза,считая от нуля число с конца-1счёт идёт с конца:минус один это последний байт слово, метка позицииmidsldк метке можно прибавить числоили вычесть его: midsld+1 метки на нашем приветствии, байты 86–113 крупно 8687888990919293949596w97w98w99.100e101x102a103m104p105l106e107.108c109o110m111112113 имя сайта: www.example.com extlen 86 sniext 92 host 97 sld 101 midsld 104 endsld 108 endhost 112 и на нашем запросе HTTP, 81 байт 01020304050607080 method 0 host 32 midsld 39 endhost 47 всего девять имён меток, мы объясняем четыре: host, midsld, sniext, method abshostendhostsldmidsldendsldmethodextlensniext слова только для запроса HTTPи приветствия TLS: программа должна узнать пакет наш QUIC: слова ничего не нашли,сработали только числа

Посмотрим на настоящий опыт. В нашем тесте стратегии multisplit дали четыре позиции: число два и три метки, host, midsld и endhost, то есть конец имени сайта. В журнале host стала числом девяносто семь. Метка midsld стала числом сто четыре. Приветствие ушло пятью кусками. Первый кусок два байта. Второй девяносто пять. Третий семь, и это «www.exa». Четвёртый восемь, и это «mple.com». Пятый сто тридцать восемь. Сервер всё равно получил двести пятьдесят байт. Заметьте: число два режет в самом начале пакета, далеко от имени, а метки встали точно на имя.

Пять кусков по меткам В нашем тесте стратегия multisplit получила четыре позиции, число 2 и метки host, midsld и endhost, программа превратила их в числа 2, 97, 104 и 112 и отправила приветствие пятью кусками по 2, 95, 7, 8 и 138 байт, куски с третьего и четвёртого вместе дают имя сайта целиком, а сервер всё равно получил все 250 байт. четыре позиции стали пятью кусками В НАШЕМ ТЕСТЕ мы попросили у стратегии multisplit четыре позиции: 22 host97 midsld104 endhost112 в журнале программы:resolved split pos: 2 97 104 112слова стали числами наше приветствие, 250 байт, режется в этих местах 1 2 3 4 5 1байты 0–12 байтасамое начало пакета, далеко от имени 2байты 2–9695 байтвсё до имени сайта 3байты 97–1037 байт77 77 77 2E 65 78 61«www.exa»часть имени сайта 4байты 104–1118 байт6D 70 6C 65 2E 63 6F 6D«mple.com»часть имени сайта 5байты 112–249138 байтостальное приветствие сервер всё равно получил 250 байт, принятый поток равен исходномуSERVER conn 1 total 250 chunks [(2, 2), (95, 97), (7, 104), (8, 112), (138, 250)] число 2 режет в самом начале, далеко от имени, а метки встали точно на имя

Теперь проверка на игрушечном инспекторе из нашей лаборатории. Он не настоящее оборудование: он ищет имя целиком в каждом пакете отдельно. blockcheck2 пробует разрезы по очереди. Разрезы внутри имени, midsld и host плюс один, инспектор пропустил. Разрезы вне имени, число два и method плюс два, нет: имя осталось целым в одном из кусков. Это факт про нашу игрушку, а не про настоящие системы.

Разрез внутри имени и вне имени Игрушечный инспектор нашей лаборатории, не настоящее оборудование, ищет имя сайта целиком в каждом пакете отдельно, и в нашем тесте blockcheck2 показал, что разрезы внутри имени, midsld и host плюс один, он пропустил, а разрезы вне имени, число 2 и method плюс 2, нет, потому что имя осталось целым в одном из кусков; это факт про нашу игрушку, а не про настоящие системы. blockcheck2 пробует разрезы по очереди В НАШЕМ ТЕСТЕ игрушечный инспектор из нашей лаборатории, не настоящее оборудование он ищет имя сайта целиком в каждом пакете отдельно: кусок с целым именем он видит, половину имени не видит TLSmultisplit:pos=midsldразрез внутри имени AVAILABLEсайт открылся TLSmultisplit:pos=host+1разрез сразу после первой буквы AVAILABLEсайт открылся TLSmultisplit:pos=2имяразрез в начале, имя целиком в куске 2 UNAVAILABLE code=28таймаут, сайт не открылся HTTPmultisplit:pos=midsldразрез внутри имени AVAILABLEсайт открылся HTTPmultisplit:pos=method+2имяразрез после метода, имя целиком в куске 2 UNAVAILABLE code=28таймаут, сайт не открылся это факт про нашу игрушку, а не про настоящие системы

Метки встречаются часто. Девять из двадцати пяти стратегий работают с позициями. Из коробки стоят method плюс два для HTTP и «один и midsld» для TLS. И blockcheck2 сам перебирает несколько вариантов позиций для каждого сайта. Поэтому выпуски про резку, про перестановку и про резку с подделкой строятся на метках: везде первый вопрос «где резать».

Подведём итог части. Опции программы делятся на восемь групп и три класса. Чтобы собрать команду, нужно ответить на три вопроса. Что взять: для этого профиль, условия профиля и диапазоны. Что сделать: для этого вызов стратегии с аргументами. И где: для этого метки, а не числа. Так строка из коробки и устроена: профили, в них вызовы, у вызовов аргументы.

Три вопроса при сборке команды Чтобы собрать команду, нужно ответить на три вопроса: что взять, для этого профиль, условия профиля и диапазоны, что сделать, для этого вызов стратегии с аргументами, и где, для этого метки, а не числа; девять из двадцати пяти стратегий работают с позициями, из коробки стоят method плюс 2 для HTTP и 1 и midsld для TLS, а blockcheck2 сам перебирает несколько вариантов позиций для каждого сайта. карта возможностей: три вопроса при сборке команды восемь групп опций три класса: глобальные, профильные, ручки 1. что взятьпрофиль,условия профиля,диапазоны 2. что сделатьвызов стратегиис аргументами 3. гдеметки,а не числа так устроена строка из коробки для TLS: --filter-tcp=443 --filter-l7=tls --payload=tls_client_helloчто взять --lua-desync=multidisorderчто сделать :pos=1,midsldгде метки встречаются часто: девять из двадцати пяти стратегий работают с позициями http_domcasemultisplitmultidisordermultidisorder_legacyhostfakesplit fakedsplitfakeddisordertcpsegoob из коробки стоятmethod+2 для HTTP1,midsld для TLS blockcheck2 сам перебираетнесколько вариантов позицийдля каждого сайта

Проверьте себя. Где у нашего приветствия середина домена второго уровня? Назовите номер байта. Подумайте несколько секунд.

Сто четыре. Это метка midsld: разрез идёт перед байтом с этим номером, считая с нуля.

Итак, команда zapret2 собирается из профилей, вызовов стратегий и их аргументов, а место для воздействия задают метками, а не числами. Теперь о самих приёмах: какие они бывают и зачем их несколько.

Три основные семьи: резать, перемешать, подделывать

Мы научились собирать команду. Теперь о самих приёмах. Какие они бывают и зачем их несколько? Три основные семьи: резать, перемешать и подделывать. Каждую покажем на одном и том же приветствии.

Начнём с резки. Пример выдуманный: фраза «встретимся у фонтана» пришла на двух открытках, на одной «встретимся у», на другой «фонтана». Теперь наше приветствие. В нашем тесте оно занимает двести пятьдесят байт. Резка делит его на два пакета: в первом сто четыре байта, во втором сто сорок шесть. Сервер получил все двести пятьдесят, ровно столько, сколько ушло. Это мы уже видели, поэтому запомним лишь картинку: два ящика, меньший впереди.

Резка: один пакет становится двумя Резка делит наше приветствие в 250 байт на два пакета, в первом 104 байта, во втором 146, как фраза на двух открытках, и в нашем тесте сервер получил все 250 байт, ровно столько, сколько ушло. семья первая: резать В НАШЕМ ТЕСТЕ пример выдуманный встретимся уфонтана фраза «встретимся у фонтана»пришла на двух открытках наше приветствие, 250 байт: резка делит его на два пакета пакет 1104 байта, байты 0–103104@0 пакет 2146 байт, байты 104–249146@104 запись «длина@начало»: 104@0 это 104 байта, начиная с байта 0 сервер получил все 250 байт, ровно столько, сколько ушло

Перемешивание. Те же открытки, но вторая лежит сверху. В обычном TCP каждый кусок несёт номер своего первого байта, поэтому получатель сам сложит их по номерам. Теперь живой пример из нашего теста. Сначала клиент отправил конец приветствия, сто сорок шесть байт. Сервер сразу ответил: начала ещё нет, а вторую часть я уже держу. В записи пакетов этот ответ виден по пометке SACK: в ней получатель сообщает, какие куски уже держит. Потом пришёл кусок в сто четыре байта. И сервер подтвердил все двести пятьдесят. Программа сервера прочла их одним куском, как будто ничего не случилось. По общим сведениям, читателя, который ждёт кусков по порядку, такая перестановка может сбить.

Перемешивание и ответ сервера с пометкой SACK Перемешивание отправляет куски приветствия в другом порядке, и в нашем тесте клиент сначала отправил конец в 146 байт, сервер ответил, что начала ещё нет, а вторую часть он уже держит, это видно по пометке SACK, потом пришли первые 104 байта, сервер подтвердил все 250 и программа сервера прочла их одним куском; по общим сведениям, читателя, который ждёт кусков по порядку, такая перестановка может сбить. семья вторая: перемешать В НАШЕМ ТЕСТЕ пример выдуманный фонтанавстретимся уоткрытка 2 лежит сверхуоткрытка 1 в обычном TCP каждый кусок несётномер своего первого байта,получатель сам сложит их по номерам живой пример из нашего тестаклиентсервер [AP] rseq=105 len=146сначала конец приветствия:146 байт [A] rseq=1 rack=1 ... SACKжду начало, вторую частьуже держу [AP] rseq=1 len=104потом начало:104 байта [A] rack=251подтверждаю все250 байт пометка SACK: получатель сообщает, какие куски уже держит программа сервера прочла 250 байт одним куском, как будто ничего не случилосьSERVER conn 1 total 250 chunks [(250, 250)] ПО ОБЩИМ СВЕДЕНИЯМчитателя, который ждёт кусков по порядку, такая перестановка может сбить

Подделка. Тот же пример: в пачку подложили открытку с ложным текстом, которую получатель выбросит, а чужой читатель примет за настоящую. Документация говорит так: фейки это отдельные пакеты с ложной информацией, которую DPI должен принять, а сервер нет. Помните подделку с коротким сроком жизни? Она умирала на роутере. Теперь новое. Возьмём игрушечный инспектор из нашей лаборатории, не настоящее оборудование. Он решает по первому пакету с данными и смотрит только на него. Без программы он видит имя, блокирует соединение, и сервер не получает ничего. А с подделкой впереди его первый пакет это приветствие с другим именем. Инспектор разрешает соединение, и сервер получает настоящие двести пятьдесят байт. Это только игрушка. Игрушечные инспекторы нашей лаборатории, которые проверяют то же, что и получатель, подделку замечают и блокируют.

Подделка и игрушечный инспектор Подделка это отдельный пакет с ложной информацией, который получатель выбросит, а чужой читатель примет за настоящий, и в нашем тесте игрушечный инспектор, решающий по первому пакету с данными, без программы блокирует соединение и сервер получает ноль байт, а с подделкой впереди разрешает его и сервер получает настоящие 250 байт; это только игрушка, игрушечные инспекторы, проверяющие то же, что и получатель, подделку замечают и блокируют. семья третья: подделывать В НАШЕМ ТЕСТЕ пример выдуманный встретимся уложный текстфонтаналожную открытку получатель выбросит,а чужой читатель примет за настоящую ДОКУМЕНТАЦИЯ«Фейки - это отдельные пакеты с ложнойинформацией, которую DPI долженпринять, а сервер - нет» помните подделку с коротким сроком жизни: дальше роутера дошёл только пакет на 250 байт len=680 ttl=1 ICMP type=11 code=0 len=250 ttl=64 игрушечный инспектор из нашей лаборатории, не настоящее оборудование без программы250 байтприветствие с именемпервый пакет с данными несёт имя:connection BLOCKEDсервер получил 0 байт с подделкой впереди680 байтложное приветствие250 байтнастоящеепервый пакет с данными без этого имени:connection ALLOWEDсервер получил 250 байт игрушечные инспекторы нашей лаборатории, которые проверяют то же, что и получатель,подделку замечают и блокируют: это только игрушка

Зачем столько семей? Документация отвечает прямо: обход требует всё более тонких воздействий, которые меняются со временем, а старые перестают работать. Идея каждой семьи это догадка о слабости читателя. По общим сведениям, такие слабости встречаются. Кого-то удивляет резка, потому что он читает каждый пакет отдельно. Кого-то удивляет подделка, потому что он не проверяет то, что проверяет получатель. Это гипотеза. В наших игрушках видно похожее. Из пяти игрушечных читателей один читает каждый пакет отдельно. Остальные собирают поток по-разному. Одна резка обошла только одного. А при резке вместе с подделкой имя не нашёл никто из пяти. Приём, который побеждает одного читателя, может проиграть другому.

Зачем нужно несколько семей Семей приёмов несколько, потому что обход требует всё более тонких воздействий, которые меняются со временем, а старые перестают работать, и по общим сведениям идея каждой семьи это догадка о слабости читателя, это гипотеза; в наших игрушках из пяти читателей один читает каждый пакет отдельно, одна резка обошла только его, а резка вместе с подделкой обошла всех пятерых. зачем столько семей ДОКУМЕНТАЦИЯ«Обход DPI требует все более тонкихи специфических воздействий, которые меняются со временем, а старыеперестают работать» ПО ОБЩИМ СВЕДЕНИЯМгипотезаидея каждой семьи это догадкао слабости читателя:читает каждый пакет отдельно: удивит резкане проверяет то же, что получатель: удивит подделка игрушечные читатели нашей лаборатории, не настоящее оборудование игрушка 1игрушка 2игрушка 3игрушка 4игрушка 5 игрушки 1–4: собирают поток по-разномуигрушка 5: каждый пакет отдельно резкаmultisplitзаблокированона 2-м пакетезаблокированона 2-м пакетезаблокированона 2-м пакетезаблокированона 2-м пакетене нашла имя резка вместес подделкойfakedsplit с MD5не нашла имяне нашла имяне нашла имяне нашла имяне нашла имя приём, который побеждает одного читателя, может проиграть другому

Три основные семьи. Резать: разделить приветствие на куски. Перемешать: отправить куски в другом порядке. Подделывать: добавить ложный пакет, который получатель выбросит. Семей несколько, потому что читатели бывают разные. Это гипотеза, и в наших игрушках она видна. Лекарства на все случаи нет.

Три основные семьи приёмов Три основные семьи приёмов: резать, то есть разделить приветствие на куски, перемешать, то есть отправить куски в другом порядке, и подделывать, то есть добавить ложный пакет, который получатель выбросит; семей несколько, потому что читатели бывают разные, это гипотеза, в наших игрушках она видна, и лекарства на все случаи нет. три основные семьи на одном и том же приветствии резать104 байтабайты 0–1031146 байтбайты 104–2492порядок отправки: 1, 2разделить приветствиена куски перемешать146 байтбайты 104–2491104 байтабайты 0–1032порядок отправки: 1, 2отправить кускив другом порядке подделыватьложныйпакет1настоящее250 байт целиком2порядок отправки: 1, 2добавить ложный пакет,который получатель выбросит семей несколько, потому что читатели бывают разныеэто гипотеза, и в наших игрушках она видналекарства на все случаи нет

Остальные семьи и где они стоят

Три семьи это начало. Что ещё есть и где всё это лежит в программе и в курсе? Дальше идут парные приёмы, фокусы рукопожатия и другие слои. Есть ещё ротация, то есть автоматическая смена стратегии, и обфускация, то есть маскировка протокола: о них чуть позже. По каждой группе приёмов покажу одно-два наблюдения из нашей лаборатории.

Парные приёмы: резка и подделка вместе. Пример выдуманный: рядом с каждой настоящей открыткой кладут по ложной, до и после. Так один разрез превращается в шесть пакетов: подделка первого куска, настоящий первый кусок, ещё одна подделка, и то же самое для второго куска. Другой приём делает то же в обратном порядке. Третий кладёт настоящее имя сайта отдельным пакетом между двумя поддельными именами той же длины. Называются они fakedsplit, fakeddisorder и hostfakesplit. В нашем тесте у подделок стоит опция MD5, это обманка, из-за которой получатель пакет игнорирует. Сервер каждый раз получал все двести пятьдесят байт.

Парные приёмы: резка вместе с подделкой Парные приёмы кладут рядом с настоящими кусками ложные: fakedsplit превращает один разрез в шесть пакетов, подделка и настоящий кусок для каждой из двух частей, fakeddisorder делает то же в обратном порядке, а hostfakesplit кладёт настоящее имя сайта отдельным пакетом между двумя поддельными именами той же длины; в нашем тесте у подделок стояла опция MD5 и сервер каждый раз получил все 250 байт. пары: резка и подделка вместе В НАШЕМ ТЕСТЕ пример выдуманный ложнаянастоящаяложнаярядом с каждой настоящей открыткойкладут по ложной, до и после подделканастоящий кусокMD5у подделок опция MD5, это обманка: получатель пакет игнорирует fakedsplitодин разрез, шесть пакетов подделкаMD5104 байтас байта 0 настоящий104 байтас байта 0 подделкаMD5104 байтас байта 0 подделкаMD5146 байтс байта 104 настоящий146 байтс байта 104 подделкаMD5146 байтс байта 104 сервер получил 104 + 146 = 250 байт fakeddisorderте же шесть пакетов в обратном порядке подделкаMD5146 байтс байта 104 настоящий146 байтс байта 104 подделкаMD5146 байтс байта 104 подделкаMD5104 байтас байта 0 настоящий104 байтас байта 0 подделкаMD5104 байтас байта 0 сервер получил все 250 байт hostfakesplitнастоящее имя отдельным пакетом между двумя поддельными той же длины настоящий97 байтс байта 0 подделкаMD515 байтс байта 97 настоящий15 байтс байта 97 подделкаMD515 байтс байта 97 настоящий138 байтс байта 112 сервер получил 97 + 15 + 138 = 250 байт

Фокусы рукопожатия. Рукопожатие это первые служебные пакеты соединения, ещё без данных. Фокусы работают именно там. Один из них: SYN с данными. По общим сведениям, SYN это самый первый пакет соединения, и обычно данных в нём нет. Другие фокусы, сброс, срочный байт и подмена окна, перечислены на экране. Покажу одну пару с игрушечным инспектором из нашей лаборатории, который решает по первому пакету с данными. Без приёма он видит имя и блокирует: сервер получает ноль байт. Если клиент прислал SYN с шестнадцатью байтами данных, инспектор решает по ним, имени не находит, объявляет соединение чистым и больше не проверяет. Сервер получает все двести пятьдесят байт. Игрушка поумнее, которая данные в SYN игнорирует, всё равно блокирует.

Фокусы рукопожатия и игрушечный инспектор Фокусы рукопожатия работают в первых служебных пакетах соединения, до данных, и в нашем тесте игрушечный инспектор, решающий по первому пакету с данными, без приёма видит имя в приветствии и блокирует соединение, сервер получает ноль байт, а когда клиент прислал SYN с шестнадцатью байтами данных, инспектор не находит там имени, объявляет соединение чистым и больше не проверяет, и сервер получает все 250 байт; игрушка поумнее, которая данные в SYN игнорирует, всё равно блокирует. фокусы рукопожатия: что можно сделать до первого байта данных SYN с данными сброс лишний SYN-ACK разрезанный SYN-ACK сервера срочный байт подмена окна рукопожатие это первые служебные пакеты соединения, ещё без данных по общим сведениям, SYN это самый первый пакет соединения, и обычно данных в нём нет игрушечный инспектор из нашей лаборатории, не настоящее оборудованиетакой инспектор решает по первому пакету с данными В НАШЕМ ТЕСТЕ без приёмаклиентсервер SYN SYN-ACK ACK данные 250 байт с именем TOY DECISION BLOCKпервый пакет с данными: 250 байт,в нём имя сайта сервер получил 0 байт SYN с 16 байтами данныхклиентсервер SYN + 16 байт данных SYN-ACK ACK данные 250 байт, не проверяются TOY DECISION CLEANпервый пакет с данными: SYN, 16 байт, без имени:поток помечен чистым, больше не проверяется сервер получил все 250 байт игрушка поумнее, которая данные в SYN игнорирует, всё равно блокирует

Другие слои. Заголовки IPv6, фрагменты IP-пакетов, правки самого HTTP-запроса, UDP и QUIC. Фрагментация это разрезание уже не сообщения, а самого IP-пакета: в нашем тесте каждый кусок уходил двумя фрагментами, а ядро Linux на сервере собирало их обратно. Правка запроса в нашем тесте сделала буквы имени то большими, то маленькими. А ловушка вот какая. Поддельный пакет в соединении по IPv6, но с параметром для IPv4: параметр молча игнорируется, подделка доходит до сервера, и ответа нет. С правильным параметром для IPv6 всё работает. А QUIC функции для TCP не режут. Для UDP есть приёмы без имени сайта: они меняют длину пакета и начало сообщения DHT.

Другие слои: IPv6, фрагменты, HTTP, QUIC Другие слои это заголовки IPv6, фрагменты IP-пакетов, правки самого запроса HTTP и UDP с QUIC, и в нашем тесте правка запроса сделала буквы имени то большими, то маленькими, каждый кусок приветствия ушёл двумя фрагментами, а ловушка такова, что параметр для IPv4 в соединении IPv6 молча игнорируется и подделка доходит до сервера, тогда как с параметром для IPv6 всё работает, и функции для TCP датаграмму QUIC не режут. другие слои: четыре наблюдения из лаборатории В НАШЕМ ТЕСТЕ правки HTTPhttp_domcase имя в запросе:www.example.com имя, которое увидел сервер:WwW.ExAmPlE.CoM буквы то большие, то маленькие;сервер получил запрос в 81 байт одним куском фрагменты IPipfrag фрагментация режет не сообщение,а сам IP-пакет кусок 104 байтафрагмент 1фрагмент 2 кусок 146 байтфрагмент 1фрагмент 2 каждый кусок ушёл двумя фрагментами;сервер получил целые куски 104 и 146 байт заголовки IPv6подделка в соединении IPv6: ip6_ttl=1параметр для IPv6: подделка умерла,сервер получил 250 байт ip_ttl=1параметр для IPv4: молча игнорируется,подделка дошла: 680 байт, ответа нет UDP и QUICдесять функций для TCP в одной строке multisplitmultidisorderfakedsplitfakeddisorderhostfakesplittcpsegrstsyndataoobhttp_domcase датаграмма QUIC, 1200 байт сервер получил её целиком, одним куском:функции для TCP QUIC не режут

Где всё это лежит. По документации и по коду, двадцать пять стратегий это функции на Lua в одной библиотеке стратегий. Любую из них в командной строке вызывают по имени. Среди них и служебные drop и send, отдельного выпуска у которых нет. Автоматика лежит в своём файле, обфускация в своём. Три семьи из выпуска «Письмо в сортировочном центре» это упрощённое начало. У каждой семьи из этой сцены есть свой выпуск, полная карта на экране, а по порядку мы пройдём их в части о курсе. Назовём пока три главных: резать это «multisplit: резать на части», перемешать это «Перемешать: disorder», подделывать это «Фейк и его условия».

Где лежат приёмы и в каком выпуске Все приёмы это функции на Lua, которые вызывают по имени, и таблица показывает, где что лежит: резать, перемешать и подделывать, а затем пары, фокусы рукопожатия, другие слои, ротация и обфускация лежат в файлах библиотеки стратегий, автоматики и обфускации, у каждой семьи есть свой выпуск, а у служебных drop и send отдельного выпуска нет; три семьи из выпуска Письмо в сортировочном центре это упрощённое начало. все приёмы: семья, стратегии, файл Lua, выпуск курса семьястратегиифайл Luaвыпуск резатьmultisplit, tcpsegzapret-antidpi.luamultisplit:резать на части перемешатьmultidisorder,multidisorder_legacyzapret-antidpi.luaПеремешать:disorder подделыватьfakezapret-antidpi.luaФейк и егоусловия парыfakedsplit, fakeddisorder,hostfakesplitzapret-antidpi.luaРезать и подделыватьвместе фокусырукопожатияsyndata, rst, synack, synack_split,oob, wsize, wssizezapret-antidpi.luaФокусырукопожатия другие слоиhttp_domcase, udplen, dht_dn, pktmodи заголовки IPv6, фрагменты IPzapret-antidpi.luaДругие слои ротацияcircular, condition, stopif, repeaterzapret-auto.luaпро автоматическуюсмену стратегий обфускацияwgobfs, ippxor, udp2icmp, synhidezapret-obfs.luaпро обфускацию служебныеdrop, sendzapret-antidpi.luaотдельного выпуска нет двадцать пять стратегий это функции на Lua в одной библиотеке стратегий, любую вызывают по имени три семьи из «Письмо в сортировочном центре» это упрощённое начало: вверху три главные, ниже остальные

Основные семьи: резать, перемешать, подделывать. Дальше идут пары, рукопожатие, другие слои, ротация и обфускация. Все приёмы это функции на Lua, которые вызывают по имени. У каждой семьи свой выпуск, а у служебных drop и send отдельного выпуска нет.

Инструменты вокруг программы: blockcheck2, ротация, установка, отладка

Что стоит вокруг программы, чтобы ею пользоваться? Сама программа это движок. Остальное необязательно, но именно оно делает её пригодной для жизни. Пройдём по четырём вещам: проверка, ротация, установка и журнал.

Что стоит вокруг программы Вокруг программы стоят четыре помощника, которые не обязательны, но делают её пригодной для жизни: проверка стратегий скриптом blockcheck2, ротация стратегий, установка со списками имён и журнал отладки. вокруг движка: четыре помощника nfqws2движок: сама программаперехват, профили, вызовы Lua 1blockcheck2скрипт, который по очередипробует стратегии и проверяет 2ротация стратегийпосле неудач программаберёт следующую стратегию сама 3установка и спискифайл настроек, установщик,загрузчики списков имён 4журналчто программа делалас каждым пакетом необязательно, но именно это делает программу пригодной для жизни

Начнём с blockcheck2. Пример выдуманный: механик по очереди пробует ключи к замку и записывает, какой подошёл. Скрипт делает то же со стратегиями. Сначала он один раз проверяет DNS. Потом для каждого сайта смотрит, открыт ли порт, пробует сайт без всякого обхода и проверяет, не закрыт ли адрес. Затем запускает программу с одной стратегией, повторяет запрос, останавливает её и берёт следующую. В конце печатает сводку, SUMMARY, со стратегиями, которые сработали. Запускать его нужно при выключенных средствах обхода и VPN. Сам скрипт честно пишет: сводка не гарантирует готового рецепта, это не создатель волшебных таблеток, а проверка обхода DPI. В нашем тесте, на игрушечном инспекторе из нашей лаборатории, он сделал четырнадцать попыток. Сработали четыре.

Прогон blockcheck2 Скрипт blockcheck2 один раз проверяет DNS, для каждого сайта смотрит порт, пробует сайт без обхода и проверяет адрес, потом по очереди запускает программу с одной стратегией и в конце печатает сводку, а в нашем тесте на игрушечном инспекторе из четырнадцати попыток сработали четыре, и сам скрипт пишет, что сводка не гарантирует готового рецепта. blockcheck2: пробует стратегии по очереди В НАШЕМ ТЕСТЕ DNS (один раз) порт сайт без обхода адрес стратегия 1 стратегия 2 … SUMMARY для каждого сайта: цикл «запустить, проверить, остановить» запускать при выключенных средствах обхода и VPN 1. сайт без обхода: игрушка блокирует- checking without DPI bypasscurl: (28) Operation timed out after 3003 milliseconds with 0 bytes receivedUNAVAILABLE code=28 2. одна стратегия: запрос прошёл- curl_test_http ipv4 blocked.test : nfqws2 --payload=http_req --lua-desync=multisplit:pos=midsld!!!!! AVAILABLE !!!!! всего попыток: 14сработали: 4 1234567891011121314 зелёные: прошёл запрос; серые: нет 3. в конце: SUMMARY, четыре строки (для ipv4 blocked.test, запуск nfqws2 с такими опциями)curl_test_http--payload=http_req --lua-desync=multisplit:pos=midsldcurl_test_https_tls12--payload=tls_client_hello --lua-desync=multisplit:pos=midsldcurl_test_https_tls12--payload=tls_client_hello --lua-desync=multidisorder:pos=midsldcurl_test_https_tls12--payload=tls_client_hello --lua-desync=multisplit:pos=host+1 4. последние строки печатает сам скрипт (оригинал по-английски, третья строка обрезана)Please note this SUMMARY does not guarantee a magic pill for you to copy/paste and be happy.Understanding how strategies work is very desirable.This knowledge allows to understand better which strategies to prefer and which to avoid if possible, …Blockcheck does it's best to prioritize good strategies but it's not bullet-proof.It was designed not as magic pill maker but as a DPI bypass test tool.по смыслу: готового рецепта сводка не обещает, это не создатель волшебных таблеток игрушечный инспектор из нашей лаборатории, не настоящее оборудование

Ротация стратегий. Это два разных механизма, и путать их нельзя. Один на Lua: после нескольких неудач он переключается на следующую стратегию. Другой в Си-части: после повторных неудач он записывает имя сайта в файл. Вот журнал из нашего теста: повторные отправки: три из трёх. Потом «обнаружен сбой». Счётчик сбоев тоже три из трёх. И последняя строка: переключаемся на вторую стратегию. Насколько это помогает против настоящей блокировки, мы не утверждаем. Подробно автоматику разбирает выпуск про автоматическую смену стратегий.

Два механизма ротации Ротация это два разных механизма, которые нельзя путать: на Lua переключение на следующую стратегию после нескольких неудач, а в Си-части автоматический список имён с записью в файл, и в нашем тесте журнал показывает три из трёх повторных отправок, обнаруженный сбой, счётчик три из трёх и переключение на вторую стратегию, а о настоящих блокировках мы ничего не утверждаем. ротация: два разных механизма В НАШЕМ ТЕСТЕ Lua: circularследующая стратегияпосле нескольких неудач переключаетсяна следующую стратегию из списка Си-часть: список имёнавтоматический список имёнпосле повторных неудач записываетимя сайта в файл, стратегию не меняет ≠не путать вот журнал из нашего теста: так Lua доходит до смены стратегии LUA: standard_failure_detector: retransmission 3/3повторные отправки: три из трёх LUA: automate: failure detectedобнаружен сбой LUA: automate: failure counter 3/3счётчик сбоев: три из трёх LUA: circular: rotate strategy to 2переключаемся на вторую стратегию стратегия 1: сбойстратегия 2: теперь она о настоящих блокировкахмы не утверждаем, помогает ли это подробно автоматику разбираетвыпуск про автоматическую смену стратегий

Установка. Установщик в диалоге спрашивает про файервол, про IPv6 и про режим списков и подключается к вашей системе запуска. Настройки лежат в файле config.default, и из коробки программа выключена, пока вы сами её не включите. Рядом лежат загрузчики списков имён и два малых инструмента. Один, mdig, в много потоков превращает очень длинные списки доменов в адреса. Другой, ip2net, собирает длинный список адресов в короткий список подсетей. Источники списков это сторонние сайты, и мы за них не ручаемся.

Установка и списки Установщик в диалоге спрашивает про файервол, IPv6 и режим списков и подключается к вашей системе запуска, настройки лежат в файле настроек, где из коробки программа выключена, рядом лежат загрузчики списков имён из сторонних источников и два малых инструмента: mdig превращает длинные списки доменов в адреса, а ip2net собирает длинный список адресов в короткий список подсетей. установка: настройки, запуск, списки в папке проекта install_easy.shустановщик с вопросами config.defaultнастройки для скриптов запуска init.d/скрипты запуска для вашей системы ipset/загрузчики списков имён и адресов mdig/длинные списки доменов в адреса ip2net/длинный список адресов в короткий список подсетей настройки из коробки NFQWS2_ENABLE=0программа выключена, пока вы не включите MODE_FILTER=noneфильтра по спискам из коробки нет DISABLE_IPV6=1IPv6 из коробки не обрабатывается установщик в диалоге спрашивает файервол IPv6 режим списков какой список скачать и подключается к вашей системе запуска в ipset/ лежат загрузчики списков, вот несколько имён файлов get_antizapret_domains.shget_refilter_domains.shget_antifilter_ip.shget_user.sh get_exclude.shcreate_ipset.shclear_lists.sh источники списков сторонние,мы за них не ручаемся

Журнал. Опция debug пишет, что программа делала с каждым пакетом, и в документации сказано, что умение читать этот журнал совершенно необходимо. Режим dry-run проверяет опции и выходит, не запуская Lua. Вызов pcap записывает пакеты в файл. Это тот самый журнал, строки которого мы разбирали раньше. А повторить опыт самому можно в лаборатории, которой не нужны права администратора. Отдельно стоит обфускация, то есть маскировка протокола. Некоторым её инструментам нужна программа на обоих концах.

Журнал, проверка и обфускация Журнал отладки показывает, что программа делала с каждым пакетом, и в документации сказано, что умение его читать совершенно необходимо, режим dry-run проверяет опции и выходит, не запуская Lua, вызов pcap записывает пакеты в файл, повторить опыт можно в лаборатории без прав администратора, а отдельно стоит обфускация, то есть маскировка протокола, где двум из четырёх инструментов нужна программа на обоих концах. журнал, проверка самому, маскировка журнал из нашего тестаВ НАШЕМ ТЕСТЕ packet: id=4 len=302 hostname: www.example.com desync profile 1 (noname) matches LUA: multisplit: resolved split pos: 104 packet: id=4 drop документация: читать этот журнал совершенно необходимо три помощника для проверки --debugпишет, что программа делала с пакетом --dry-runпроверяет опции и выходит, Lua не запускает pcapвызов записывает пакеты в файл повторить опыт самому: лаборатория без прав администратора клиентздесь программа роутерпересылает серверзаписывает точки записи пакетов: c0, r0, r1, s0 обфускация: маскировка протокола, это отдельная тема wgobfs ippxor udp2icmp synhide нужна программана обоих концах нужна программана обоих концах

Повторим часть. Семьи приёмов мы назвали, и у каждой есть свой выпуск. Вокруг программы стоят четыре помощника: blockcheck2 перебирает стратегии, ротация пробует следующую сама, установка включается руками, а журнал решает споры. Всё это уместилось в одну таблицу: семья, файл на Lua и выпуск курса.

Семьи, файлы и выпуски Все семьи приёмов разложены в одну таблицу: семья, названия стратегий, файл на Lua и выпуск курса, три основные семьи резать, перемешать и подделывать идут первыми, дальше пары, фокусы рукопожатия, другие слои, ротация и обфускация, у служебных drop и send отдельного выпуска нет, а четыре помощника вокруг программы тоже привязаны к своим выпускам. всё в одной таблице: семья, стратегии, файл Lua, выпуск семьястратегиивыпуск курса zapret-antidpi.lua: библиотека стратегий резатьmultisplit«multisplit: резать на части» перемешатьmultidisorder«Перемешать: disorder» подделыватьfake«Фейк и его условия» парыfakedsplit, fakeddisorder, hostfakesplit«Резать и подделывать вместе» фокусы рукопожатияsyndata, rst, synack, oob, …«Фокусы рукопожатия» другие слоиhttp_domcase, udplen, dht_dn, pktmod«Другие слои» служебныеdrop, sendотдельного выпуска нет zapret-auto.lua: автоматика ротацияcircularвыпуск про автоматическую смену стратегий zapret-obfs.lua: обфускация обфускацияwgobfs, ippxor, udp2icmp, synhideвыпуск про обфускацию вокруг программы: остальные помощники, ротация уже выше blockcheck2перебирает стратегии за васвыпуск про blockcheck2 установкавключается рукамивыпуск про установку и запуск журналрешает споры«Читаем и отлаживаем стратегии» все приёмы это функции на Lua, их вызывают по имени

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

Тест проверяет один домен по одному протоколу, а браузер делает больше. Он ходит на другие домены сайта, пробует IPv6 и QUIC, использует другую версию TLS.

Почему в браузере не открылось Если blockcheck2 показал, что стратегия работает, а в браузере сайт не открылся, то тест проверяет один домен по одному протоколу, а браузер ходит на другие домены сайта, пробует IPv4 и IPv6, TLS и QUIC и использует другую версию TLS. проверь себя: тест прошёл, а сайт не открылся ДОКУМЕНТАЦИЯтак сказано в документации blockcheck2 показал, что стратегия работает.А в браузере сайт не открылся. Почему такое возможно? что проверил blockcheck2один доменодин протоколи больше ничего что делает браузер другие домены сайтапункт 2 списка в документации IPv4 и IPv6пункт 3 TLS и QUICпункт 3 другая версия TLSпункт 7 пересказ из документации:blockcheck проверяет одиндомен по одному протоколу,не более

Итак, помощников вокруг программы четыре, но ни один не заменит проверку: результат придётся проверять самому. Осталось понять, в каком порядке идти по курсу.

Курс: основы, язык и приёмы

Коротко обо всём выпуске. Блокировки бывают разные, и zapret2 может помочь против блокировок по имени сайта или по сигнатуре протокола, но не против подмены DNS и блока по адресу. Внутри перехват, Си-часть и Lua со стратегиями. Какие выпуски есть и о чём каждый?

Три повтора выпуска Коротко обо всём выпуске: блокировки бывают разные и zapret2 может помочь против блокировок по имени сайта или по сигнатуре протокола, но не против подмены DNS и блока по адресу, программа состоит из правила ядра Linux, Си-части и Lua со стратегиями, а дальше идут приёмы и инструменты, и главный вопрос в том, какие выпуски курса есть. коротко обо всём выпуске что блокируютблокировки бывают разные;zapret2 может помочь противблока по имени сайта или попротоколу, но не противподмены DNS и блока по адресу из чего состоит программаперехват пакетов,Си-часть и Luaсо стратегиями приёмы и инструментытри основные семьи приёмов,потом пары, рукопожатие,слои, ротация, обфускацияи инструменты вокруг какие выпуски курса есть и о чём каждый?

Курс устроен в четыре блока: основы, приёмы вместе с языком командной строки, инструменты и устройство программы изнутри. Основы объясняют, что вообще происходит. Приёмы учат менять начало соединения. Инструменты помогают подобрать и включить стратегию. А «под капотом» показывает, как всё устроено в программе. По нашему подсчёту, всё вместе больше тридцати часов. Не пугайтесь: смотреть всё подряд необязательно, дальше мы покажем, как выбрать путь. В среднем это около полутора-двух часов на выпуск. Каждый длинный выпуск состоит из трёх частей, и любую часть можно смотреть отдельно. Этот вводный выпуск стоит перед ними как вход и ничего заранее не требует.

Доска курса Курс устроен в четыре блока: основы, приёмы вместе с языком командной строки, инструменты и устройство программы изнутри, всего больше тридцати часов, в среднем около полутора-двух часов на выпуск, каждый длинный выпуск состоит из трёх частей, которые можно смотреть отдельно, а вводный выпуск стоит перед ними как вход. курс: четыре блока + этот вводный выпуск основы «Письмо в сортировочном центре» «Что видит наблюдатель» приёмы вместе с языком командной строки «Читаем командную строку zapret2» «Где резать: метки» «multisplit: резать на части» «Перемешать: disorder» «Фейк и его условия» «Резать и подделывать вместе» «Фокусы рукопожатия» «Другие слои» «Читаем и отлаживаем стратегии» инструменты выпуск про blockcheck2 выпуск про автоматическую смену стратегий выпуск про установку и запуск выпуск про обфускацию «под капотом»: устройство изнутри «Внутри программы» «От байтов к таблице» «Память о соединении» «Тип нагрузки и имя сайта» «Профили: как программа выбирает» «Lua внутри программы» «Сборка и повторный проигрыш» больше тридцати часов около полутора-двух часов на выпуск каждый длинный выпуск:часть aчасть bчасть c любую часть можно смотреть отдельно; смотреть всё подряд необязательно

Основы это два выпуска. «Письмо в сортировочном центре» объясняет, что происходит с запросом по дороге и как устроена наша игрушечная лаборатория. После него вы различаете четыре симптома блокировки и понимаете, почему разрезанный пакет может пройти мимо игрушечного инспектора, который читает пакеты по одному. «Что видит наблюдатель» учит читать пакет руками. После него вы найдёте имя сайта в приветствии на двести пятьдесят байт. Дальше пара про язык. «Читаем командную строку zapret2» учит читать настоящую команду слева направо. После него вы скажете, какие пакеты она трогает и какие функции запускает. «Где резать: метки» учит говорить программе, где резать, и объясняет, почему это нужно до всего остального.

Основы и пара про язык Основы это два выпуска, письмо в сортировочном центре и что видит наблюдатель, а за ними пара про язык, где командная строка учит читать настоящую команду слева направо, а метки учат говорить программе, где резать, и нужны до всего остального. основы и пара про язык основы: два выпуска «Письмо в сортировочном центре»что происходит с запросом по дороге?после выпуска вы сможете:различать четыре симптома блокировки и понимать,почему разрезанный пакет может пройти мимоигрушечного инспектора, который читает пакеты поодному «Что видит наблюдатель»что видно внутри пакета и где лежит имя сайта?после выпуска вы сможете:найти имя сайта в приветствии на 250 байт пара про язык «Читаем командную строку zapret2»как читать настоящую команду слева направо?после выпуска вы сможете:сказать, какие пакеты она трогает и какие функциизапускает «Где резать: метки»как сказать программе, где резать?после выпуска вы сможете:говорить программе, где резать, и понимать, почемуэто нужно до всего остальногодо всего остального

Теперь приёмы. «multisplit: резать на части» отвечает на вопрос, как одно приветствие становится несколькими пакетами и что лежит в каждом. После него вы скажете, что в каком пакете. «Перемешать: disorder» спрашивает, что будет, если конец отправить раньше начала. После него вы прочтёте в записи пакетов ответ сервера с пометкой SACK и поймёте, почему получатель всё равно соберёт сообщение. «Фейк и его условия» объясняет, чем подделка должна отличаться от настоящего пакета, чтобы один читатель её принял, а другой отбросил. После него вы поймёте, какие обманки, по-научному fooling, за что отвечают.

Первые три приёма Первые три приёма идут цепочкой: метки нужны перед выпуском про разрезание на части, он нужен перед выпуском про перестановку, а выпуск про фейк и его условия объясняет, чем подделка должна отличаться от настоящего пакета, и от него стрелки лишь намечены дальше. приёмы: первые три выпуска «Где резать: метки» «multisplit: резать начасти»как одно приветствиестановится несколькимипакетами и что лежит вкаждом?после выпуска вы сможете:сказать, что в каком пакете «Перемешать: disorder»что будет, если конецотправить раньше начала?после выпуска вы сможете:прочесть в записи пакетовответ сервера с пометкой SACKи понять, почему получательвсё равно соберёт сообщение «Фейк и его условия»чем подделка должнаотличаться от настоящегопакета, чтобы один читатель еёпринял, а другой отбросил?после выпуска вы сможете:понять, какие обманки,по-научному fooling, за чтоотвечают нужны перед резать и подделыватьфокусы рукопожатия пунктиром намечено, куда ведёт фейк: подробнее в следующей части

«Резать и подделывать вместе» собирает оба приёма в одну серию: разрез и подделки идут одним потоком пакетов. «Фокусы рукопожатия» о том, что можно сделать до первого байта данных. «Другие слои» о том, что есть кроме резки, перестановки и подделки внутри TCP: заголовки IPv6, фрагменты, правки HTTP и QUIC. А «Читаем и отлаживаем стратегии» учит повторять любой опыт самому, чтобы ничего не принимать на веру, и разбирает типичные ловушки.

Остальные приёмы Остальные четыре выпуска про приёмы: резать и подделывать вместе одним потоком пакетов, фокусы рукопожатия до первого байта данных, другие слои вроде заголовков IPv6, фрагментов, правок HTTP и QUIC, а последний учит повторять любой опыт самому и разбирает типичные ловушки. приёмы: остальные четыре выпуска «Резать и подделывать вместе»как собрать оба приёма в одну серию?после выпуска вы сможете:увидеть разрез и подделки одним потоком пакетов «Фокусы рукопожатия»что можно сделать до первого байта данных?после выпуска вы сможете:назвать приёмы, которые работают на первыхслужебных пакетах соединения «Другие слои»что есть кроме резки, перестановки и подделкивнутри TCP?после выпуска вы сможете:различать правки на других слоях: заголовки IPv6,фрагменты, правки HTTP, QUIC «Читаем и отлаживаем стратегии»как повторить любой опыт самому, чтобы ничего непринимать на веру?после выпуска вы сможете:проверять стратегию своими руками и обходитьтипичные ловушки последний выпуск проверка своими руками: он не требует выпусков про приёмы

Сначала основы, затем язык командной строки, затем приёмы, затем проверка своими руками. Всё это про то, как менять начало соединения. Инструменты и устройство изнутри идут после них. Названия звучат без номеров, а порядок и зависимости мы разберём в конце.

Порядок блоков курса Курс идёт сначала основы, затем язык командной строки, затем приёмы, затем проверка своими руками, и всё это про то, как менять начало соединения, а инструменты и устройство программы изнутри стоят после них. порядок блоков основы язык командной строки приёмы проверка своими руками всё это про то, как менять начало соединения после них, когда нужно или интересно: инструменты«под капотом» порядок и зависимости между выпусками разберём в конце выпуска

Курс: инструменты и «под капотом»

Что в остальной части курса и обязательна ли она? Мы разобрали первые два блока: основы, а также приёмы вместе с языком командной строки. Остаются два блока: инструменты и устройство программы изнутри. Начнём с инструментов, они нужнее на практике.

Блок инструментов состоит из четырёх выпусков. Выпуск про blockcheck2 показывает, как скрипт находит стратегию, которая открывает сайт: цикл «запустить, проверить, остановить», проверки запросами curl, сводка, уровни проверки и свои списки. После него вы поймёте, как читать его отчёт и почему не стоит принимать его за гарантию. Его удобно смотреть сразу после приёмов, а при желании и раньше: он показывает, как стратегию подбирают на практике. Выпуск про автоматическую смену стратегий отвечает на вопрос, может ли программа переключаться сама: признаки неудачи, пороги и автоматические списки имён, и чем они отличаются от смены стратегий. Выпуск про установку и запуск рассказывает, что должно стоять вокруг программы, чтобы стратегия работала каждый день и после перезагрузки: файл настроек, правила перехвата, скрипты запуска, установщик. Выпуск про обфускацию о том, что делать, если подозрительным выглядит сам протокол: инструменты маскировки и случаи, когда программа нужна на обоих концах.

Четыре выпуска про инструменты Блок инструментов состоит из четырёх выпусков: про то, как blockcheck2 находит стратегию, которая открывает сайт, про автоматическую смену стратегий, про установку и запуск, чтобы стратегия работала каждый день, и про обфускацию на случай, когда подозрительным выглядит сам протокол. блок инструментов: четыре выпуска выпуск про blockcheck2как скрипт находит стратегию, которая открываетсайт?после выпуска вы знаете:цикл «запустить, проверить, остановить», проверкизапросами curl, сводка, уровни проверки и своисписки; как читать отчёт и почему он не гарантия выпуск про автоматическую сменустратегийможет ли программа переключаться сама?после выпуска вы знаете:признаки неудачи, пороги и автоматические спискиимён, и чем они отличаются от смены стратегий выпуск про установку и запускчто должно стоять вокруг программы, чтобы онаработала каждый день и после перезагрузки?после выпуска вы знаете:файл настроек, правила ядра Linux, скрипты запуска,установщик выпуск про обфускациючто делать, если подозрительным выглядит сампротокол?после выпуска вы знаете:инструменты маскировки и случаи, когда программанужна на обоих концах инструментам не нужны выпуски про приёмывыпуск про blockcheck2 удобно смотреть сразу после приёмов, а при желании и раньше

Остальное это блок «под капотом»: семь выпусков цепочкой, и каждый начинается с повтора предыдущего. Он необязателен: выпуски про приёмы его не предполагают. Если хотите понять, как всё устроено внутри, смотрите его в конце, когда приёмы уже знакомы. В этом вводном выпуске мы прошли путь пакета лишь бегло, а там его разбирают по шагам. Это блок для тех, кому интересно, откуда берутся числа и строки журнала, которые мы показывали.

Блок под капотом цепочкой Остальное в курсе это блок под капотом из семи выпусков, которые идут цепочкой и каждый начинается с повтора предыдущего, он необязателен, выпуски про приёмы его не предполагают, и лучше смотреть его в конце, когда приёмы уже знакомы. блок «под капотом»: семь выпусков цепочкой «Внутри программы» «От байтов ктаблице» «Память осоединении» «Тип нагрузки и имясайта» «Профили: какпрограмма выбирает» «Lua внутрипрограммы» «Сборка и повторныйпроигрыш» необязательно, лучше в конце каждый выпуск начинается с повтора предыдущего выпуски про приёмы этот блок не предполагают смотрите его в конце, когда приёмы уже знакомы

Вот эти семь выпусков, сначала первые четыре. Они идут по пути пакета от перехвата до таблицы и памяти. «Внутри программы» про перехват на Linux: правило ядра Linux, очередь, главный цикл, три ответа программы, отправку собственных пакетов с меткой и защиту от петли. «От байтов к таблице» про то, как пакет разбирается на поля, превращается в таблицу для Lua и собирается обратно. «Память о соединении» про запись о соединении, роли сторон и счётчики. «Тип нагрузки и имя сайта» про то, как программа узнаёт приветствие, строку Host в HTTP и QUIC и достаёт имя.

Первые четыре выпуска под капотом Первые четыре выпуска блока под капотом идут по пути пакета от перехвата до таблицы и памяти: правило ядра Linux, очередь и главный цикл, разбор пакета на поля и таблица для Lua, запись о соединении с ролями сторон и счётчиками, и узнавание приветствия, строки Host и QUIC с извлечением имени. под капотом: первые четыре, путь пакета от перехвата до таблицы и памяти «Внутри программы»правило ядра Linux,очередь, главныйцикл, три ответапрограммы, отправкасобственных пакетов сметкой и защита отпетли «От байтов ктаблице»как пакет разбираетсяна поля, превращаетсяв таблицу для Lua исобирается обратно «Память осоединении»запись о соединении,роли сторон и счётчики «Тип нагрузки и имясайта»как программа узнаётприветствие, строкуHost в HTTP и QUIC идостаёт имя здесь путь пакета разбирают по шагам, а в вводном выпуске мы прошли его лишь бегло

Последние три выпуска про решения и сборку. «Профили: как программа выбирает» про поиск профиля, диапазоны и списки. «Lua внутри программы» про то, как Си-часть и Lua разговаривают и как сливаются их ответы. «Сборка и повторный проигрыш» про то, как собирается большое приветствие и проигрывается заново.

Последние три выпуска под капотом Последние три выпуска блока под капотом про решения и сборку: как программа ищет профиль, диапазоны и списки, как Си-часть и Lua разговаривают и как сливаются их ответы, и как собирается большое приветствие и проигрывается заново. под капотом: последние три, решения и сборка «Профили: как программавыбирает»поиск профиля, диапазоны исписки «Lua внутри программы»как Си-часть и Luaразговаривают и как сливаютсяих ответы «Сборка и повторныйпроигрыш»как собирается большоеприветствие и проигрываетсязаново для тех, кому интересно, откуда берутся числа и строки журнала, которые мы показывали

Каждый длинный выпуск начинается с короткого повтора. Жёсткие зависимости между выпусками есть, и мы назовём их в конце. Поэтому порядок всё-таки важен.

Три части выпуска Каждый длинный выпуск начинается с короткого повтора и состоит из трёх частей, a, b и c, а любую часть можно смотреть отдельно. как устроен длинный выпуск короткийповтор в начале каждого выпуска часть a отдельно часть b отдельно часть c отдельно каждую часть можно смотреть отдельно; жёсткие зависимости между выпусками при этом есть,мы назовём их в конце выпуска, поэтому порядок всё-таки важен

Инструменты нужны для практики и не требуют выпусков про приёмы. Блок «под капотом» необязателен, его лучше смотреть в конце. Порядок и зависимости разберём дальше.

Две группы выпусков Инструменты нужны для практики и не требуют выпусков про приёмы, а блок под капотом необязателен и лучше смотреть его в конце, порядок и зависимости разберём дальше. две группы: для практики и для интересующихся для практики: инструменты выпуск про blockcheck2 выпуск про автоматическую смену стратегий выпуск про установку и запуск выпуск про обфускацию не требуют выпусков про приёмы «под капотом»: необязательно, в конце «Внутри программы» «От байтов к таблице» «Память о соединении» «Тип нагрузки и имя сайта» «Профили: как программа выбирает» «Lua внутри программы» «Сборка и повторный проигрыш» выпуски про приёмы его не предполагают порядок и зависимости разберём дальше

Как смотреть курс и как читать наши утверждения

Остался последний вопрос выпуска. В каком порядке всё это смотреть и как понимать то, что мы говорим? Ответим на оба.

Есть два пути. Путь для тех, кто хочет пользоваться: основы, пара про язык, то есть командная строка и метки, потом «multisplit: резать на части» и «Фейк и его условия», а затем выпуск про blockcheck2 и выпуск про установку и запуск. Остальное по мере нужды. Если сомневаетесь, с чего начать, начните с основ: они нужны на обоих путях. Путь для тех, кто хочет понять: все выпуски по порядку, потом «Читаем и отлаживаем стратегии», а блок «под капотом» в самом конце. Если вы хорошо знаете TCP и TLS, выпуск «Что видит наблюдатель» можно смотреть выборочно. Это наше предложение, на зрителях мы его не проверяли. Риск в том, что дальше звучит словарь именно этого выпуска.

Два пути по курсу Есть два пути по курсу: путь для тех, кто хочет пользоваться, идёт через основы, пару про язык, разрезание на части, фейк, выпуск про blockcheck2 и выпуск про установку и запуск, а остальное по мере нужды, а путь для тех, кто хочет понять, идёт по всем выпускам по порядку, потом читаем и отлаживаем стратегии, а блок под капотом в самом конце, и это наше предложение, которое мы на зрителях не проверяли. два пути по курсу хочу пользоваться основы«Письмо в сортировочном центре» основы«Что видит наблюдатель» язык«Читаем командную строку zapret2» язык«Где резать: метки» приёмы«multisplit: резать на части» приёмы«Фейк и его условия» инструментывыпуск про blockcheck2 инструментывыпуск про установку и запуск остальное по мере нужды хочу понять все выпуски по порядкублоки подряд, один за другим «Читаем и отлаживаем стратегии»проверка своими руками блок «под капотом»в самом конце если вы хорошо знаете TCP и TLS,«Что видит наблюдатель» можносмотреть выборочнориск: дальше звучит словарь именно этого выпускасомневаетесь, с чего начать: начните с основ наше предложение,на зрителях мы его не проверяли

Теперь жёсткие зависимости: без них порядок выбирать нельзя, иначе вы встретите слова, которых ещё не объясняли. «Где резать: метки» нужны перед «multisplit: резать на части». «multisplit: резать на части» нужен перед «Перемешать: disorder» и перед «Резать и подделывать вместе». «Фейк и его условия» нужен перед «Резать и подделывать вместе» и перед «Фокусы рукопожатия». «Другие слои» опираются на multisplit и фейк. А инструментам и выпуску «Читаем и отлаживаем стратегии» выпуски про приёмы не нужны.

Жёсткие зависимости выпусков Жёсткие зависимости между выпусками: метки нужны перед выпуском про разрезание на части, он нужен перед перестановкой и перед резкой с подделкой, фейк нужен перед резкой с подделкой и перед фокусами рукопожатия, другие слои опираются на разрезание и фейк, а у инструментов и выпуска про отладку стратегий стрелок нет, поэтому в любом порядке смотреть нельзя. жёсткие зависимости: что нужно посмотреть раньше «Где резать: метки» «multisplit: резать на части» «Перемешать: disorder» «Фейк и его условия» «Резать и подделывать вместе» «Фокусы рукопожатия» «Другие слои» стрелка значит:сначала смотрят то, откуда она идётот multisplitот фейка без стрелок: выпуски про приёмы им не нужны выпуск про blockcheck2 выпуск про автоматическую смену стратегий выпуск про установку и запуск выпуск про обфускацию «Читаем и отлаживаем стратегии» в любом порядке смотреть нельзя: иначе встретите слова, которых ещё не объясняли

И как читать наши утверждения. Сказанное просто прочитано в программе или документации: в документации сказано, что zapret2 может помочь. «В нашем тесте» значит измерено в нашей лаборатории, на игрушечном инспекторе. «По общим сведениям» значит общее знание о VPN и DPI, а не факт о настоящей системе. Готовых рецептов программа не даёт: блокировки меняются, и старые рецепты перестают работать. О настоящем ТСПУ мы как о факте не говорим ничего. И одно слово: способ обхода мы всегда называем стратегией.

Как читать наши утверждения Наши утверждения бывают трёх видов: то, что сказано в документации и прочитано в программе, то, что в нашем тесте измерено в лаборатории на игрушечном инспекторе, и то, что по общим сведениям известно о VPN и DPI, а не о настоящей системе, и готовых рецептов программа не даёт, потому что блокировки меняются, а способ обхода мы всегда называем стратегией. как читать наши утверждения ДОКУМЕНТАЦИЯпрочитано в программеили в документациипример:«это не готовоерешение для чайников» В НАШЕМ ТЕСТЕизмерено в нашей лаборатории,на игрушечном инспекторепример:«сервер получил все250 байт запроса» ПО ОБЩИМ СВЕДЕНИЯМобщее знание о VPN и DPI,не факт о настоящей системепример:«блокирующее оборудованиеможет читать имя сайта» ДОКУМЕНТАЦИЯпредупреждает:«Сейчас это так, а завтра будет еще что-то другое»готовых рецептов нет: блокировки меняются, и старые рецепты перестают работать способ обхода мы всегда называемстратегия о настоящем ТСПУ как о фактемы не говорим ничего результат нужно проверять самому

Повторим весь выпуск. Сначала мы выяснили, что блокируют: DNS, адрес и порт, имя сайта, сигнатуру. Потом поняли, что zapret2 может помочь против имени и сигнатуры, но не против подмены DNS и блока по адресу, и что он не заменяет VPN или прокси. Потом разобрали устройство: перехват, Си-часть и Lua. Потом возможности: опции, профили, вызовы стратегий и метки. Потом приёмы: три основные семьи и ещё пары, рукопожатие, слои, ротацию и обфускацию, и инструменты вокруг. И наконец порядок курса и жёсткие зависимости.

Карта выпуска из шести слоёв Карта всего выпуска из шести слоёв: что блокируют и что может вылечить zapret2, чем он отличается от VPN и прокси, путь пакета через правило ядра Linux, Си-часть и Lua, возможности программы, семьи приёмов и инструменты вокруг и, наконец, порядок курса с жёсткими зависимостями. карта выпуска: шесть слоёв что блокируют и что лечит zapret2подмена DNSблок по адресуимя сайтасигнатура сравнение с VPN и прокси (по общим сведениям)zapret2 не заменяет VPNzapret2 не заменяет прокси путь пакетаперехват пакетовСи-частьLua со стратегиями возможностиопциипрофиливызовы стратегийметки семьи приёмов и инструментырезатьперемешатьподделыватьпарырукопожатиеслоиротацияобфускацияинструменты вокруг доска курсапорядок выпусковжёсткие зависимости

Помните три способа говорить: просто, «в нашем тесте» и «по общим сведениям». И правило, ради которого существует весь курс: результат нужно проверять самому. Это был вводный выпуск, а сам курс начинается с выпуска «Письмо в сортировочном центре». Там мы рассказываем полную историю одного запроса и показываем нашу лабораторию. Вот с него и начинайте: каждый следующий выпуск опирается на слова предыдущего.

Итог и с чего начать Итог вводного выпуска: помнить три способа говорить, просто, в нашем тесте и по общим сведениям, и правило, ради которого существует весь курс, результат нужно проверять самому, а сам курс начинается с выпуска письмо в сортировочном центре, где рассказана полная история одного запроса и показана наша лаборатория. итог выпуска и с чего начинать помните три способа говорить простопрочитано в программе или документации в нашем тестеизмерено в нашей лаборатории по общим сведениямобщее знание, не факт о настоящей системе результат нужно проверять самому с чего начинать курс«Письмо в сортировочном центре»полная история одного запросаи наша лабораториякаждый следующий выпуск опираетсяна слова предыдущего

См. также


🤖 Эти статьи открыты — можно обучать на них ИИ

При желании вы можете натренировать ИИ на наших статьях. Исходное форматирование доступно в Forgejo: исходник этой заметки · скачать весь репозиторий одним zip-архивом.