todo/Zapret2/video/01-pismo-v-sortirovochnom-centre.md
loop-uh ae1d0be970
Some checks failed
Published content check / validate (push) Failing after 7s
Видеосерия: статьи к видео 1, 2, 3, 4, 5, 6, 16
Полный текст выпусков с анимированными SVG-схемами: «Письмо в сортировочном центре», «Что видит наблюдатель», «Читаем командную строку zapret2», «Где резать: метки», «multisplit: резать на части», «Перемешать: disorder», «Внутри программы». Список видео в Zapret2/Zapret2.md обновлён.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-25 14:24:56 -04:00

60 KiB
Executable file
Raw Permalink Blame History

title date tags aliases description
Видео 1. Письмо в сортировочном центре 2026-10-25
zapret2
видео
сценарий
tspu
dpi
paket
laboratoriya
Видео 1
Видео 1 серии о Zapret 2: как запрос превращается в пакеты, что может сделать наблюдатель на пути и почему против него возможны приёмы, с анимированными схемами.

[!info] О чём заметка Это полный текст видео номер 1 из серии о том, как работает Zapret2/Zapret2, разбитый по сценам, с анимированными схемами. Каждую сцену можно читать отдельно.

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

Знакомая ситуация и первые слова

Здравствуйте. Это первый выпуск серии о том, как работает zapret2.

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

Прежде чем идти дальше, договоримся о словах, потому что они будут встречаться на каждом шагу.

Первое слово: запрос. Когда вы вводите адрес сайта, браузер отправляет серверу сообщение, которое по смыслу значит «пришли мне эту страницу». Вот как оно выглядит в простейшем случае, без шифрования. Первая строка: GET, путь к странице и версия протокола. Вторая: Host, имя сайта, например www.example.com. Дальше несколько служебных строк, и всё. Это обычный текст, его можно прочитать глазами. Сервер отвечает таким же сообщением, и страница, которую вы видите, это результат десятков таких обменов: сначала текст страницы, потом картинки, стили, скрипты.

!wiki-anim-video01-s01-request.svg

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

!wiki-anim-video01-s01-handshake.svg

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

Из этого получаются три вопроса. Что на самом деле происходит с вашим запросом по дороге к серверу? Кто решает, что с ним делать? И что здесь можно сделать технически?

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

Письмо и сортировщик

Чтобы разобраться, давайте на время забудем про интернет и представим почту.

Сортировочный центр. Письма едут по ленте одно за другим, сотни в минуту.

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

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

!wiki-anim-video01-s02-sorter.svg

Заметьте две особенности этого сортировщика. Первая: он торопится и не вникает. Вторая: он смотрит только туда, куда ему положено, в окошко. Всё остальное для него не существует.

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

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

!wiki-anim-video01-s02-split.svg

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

Пакет, подробно

Теперь перенесём эту картину в сеть. Письмо превратится в пакет.

Что такое пакет? Когда браузер отправляет запрос, он не посылает его одним куском. Каналы связи общие, на них одновременно работают миллионы устройств, и один огромный кусок данных занимал бы канал надолго. Поэтому данные режут на порции, и каждая порция упаковывается в свой конверт и отправляется в путь отдельно. Эта порция вместе с конвертом и называется пакетом. Если быть точным, в протоколе TCP такую порцию называют сегментом, а в протоколе IP датаграммой, но мы для простоты везде говорим «пакет».

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

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

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

!wiki-anim-video01-s03-packet.svg

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

Теперь о тех, кто возит пакеты. Роутер, или маршрутизатор, это устройство, которое соединяет несколько сетей и пересылает между ними пакеты. Получив пакет, он читает адрес получателя, находит в своей таблице маршрутов подходящую запись, решает, в какую сторону передать, уменьшает время жизни на единицу и передаёт. Это его главная работа. У вас дома это коробочка, которая обычно совмещает роутер с точкой Wi-Fi, а у оператора, то есть у компании, которая подключает вас к интернету, и которую ещё называют провайдером, это мощные шкафы в машинных залах. Принцип тот же.

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

!wiki-anim-video01-s03-path.svg

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

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

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

Сортировщик на пути: ТСПУ как модель

Где же в этой цепочке сортировщик?

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

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

!wiki-anim-video01-s04-where-tspu.svg

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

!wiki-anim-video01-s04-inline-mirror.svg

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

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

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

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

Итак, на пути пакетов, в сети провайдера, стоит оборудование ТСПУ. Оно может стоять в линии, и тогда видит и останавливает весь трафик, или на копии, и тогда только наблюдает и подсовывает свои пакеты. По открытым описаниям, у него считанные мгновения на каждое соединение. Как оно устроено у конкретного оператора, мы не знаем, поэтому дальше работаем с моделью.

Повтор и что оборудование может сделать

Коротко напомним, где мы. Запрос режется на пакеты, пакеты едут по сети к серверу, а на их пути, в сети провайдера, по нашей модели стоит быстрый сортировщик, оборудование ТСПУ.

Что оно делает с пакетами, когда решило, что сайт в списке? Открытые описания называют несколько действий. Мы покажем каждое на примере. Для этого в нашей лаборатории мы поставили в роутер игрушечный инспектор. Он не ТСПУ. Он очень простой: смотрит на каждый пакет по отдельности, и если внутри лежит имя сайта www.example.com, делает то, что мы ему скажем.

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

!wiki-anim-video01-s05-drop-retries.svg

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

!wiki-anim-video01-s05-reset-rst.svg

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

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

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

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

Что видит роутер, а что ТСПУ

Теперь главный вопрос этой части: что наблюдатель видит? Сравним его с обычным роутером на нашем настоящем пакете.

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

!wiki-anim-video01-s06-router-reads.svg

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

Большинство сайтов сегодня работают по протоколу HTTPS. Это обычный обмен запросами и ответами, только завёрнутый в шифрование, которое называется TLS. Когда шифрованный канал установлен, содержимое страницы видят только браузер и сервер, а посредник на пути видит адреса, порты, размеры пакетов и время, но не сам текст страницы. А ещё он видит то, что открыто в первом сообщении, о котором сейчас речь.

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

!wiki-anim-video01-s06-dpi-sni.svg

Это имя технически называется SNI, от английского Server Name Indication, «указание имени сервера». Подробнее об этом в следующем выпуске. Оно открыто не случайно: на одном адресе может жить множество сайтов, и серверу нужно сразу узнать, с каким вы хотите говорить, чтобы показать правильный сертификат. Браузер обычно его называет. Существует способ зашифровать и это имя, но он включён далеко не везде.

Оборудование для глубокого разбора пакетов заглядывает глубже. Его называют DPI, от английского deep packet inspection, глубокая инспекция пакетов. Обычный роутер смотрит в основном на адреса, а иногда на порты. А DPI разбирает и содержимое: определяет протокол, часто по первым байтам, а иногда по нескольким пакетам, читает имена, вычисляет отпечатки клиента, например по параметрам шифрования, а в некоторых системах наблюдает и за поведением соединения. Такие устройства бывают не только для блокировок: ими пользуются корпоративные межсетевые экраны, антивирусные шлюзы, системы учёта трафика. В этой серии слово DPI означает любое устройство, которое разбирает пакеты глубже заголовка, а слово ТСПУ означает российскую систему такого типа.

В нашей модели инспектор читает именно те пятнадцать байт и сверяет их со своим списком. В описанных исследованиях решение принимается по имени сайта, хотя бывает и по адресу сервера, это тоже документировано.

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

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

Почему против наблюдателя вообще возможны приёмы

Мы выяснили, что наблюдатель торопится и читает данные. Теперь вопрос, ради которого всё затевалось: почему с этим вообще можно что-то сделать?

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

Давайте это увидим. В нашей лаборатории мы включили zapret2 с правилом: разрезать запрос посередине второго по старшинству доменного имени, то есть посередине слова example. Вместо одного пакета в триста шестнадцать байт ушли два: на сто семьдесят и на двести двенадцать байт кадра. Первый несёт сто четыре байта нагрузки и кончается на «www.exa». Второй, через четыре миллисекунды, несёт сто сорок шесть байт и начинается с «mple.com». Сервер получил оба, поставил по номерам и собрал все двести пятьдесят байт без единого отличия от оригинала.

!wiki-anim-video01-s07-cut-midsld.svg

А теперь представьте инспектора, который, как наш игрушечный, смотрит на каждый пакет по отдельности. В первом он видит «www.exa». Во втором «mple.com». Ни то, ни другое не совпадает со списком, и он пропускает оба. Мы проверили это на настоящих пакетах дважды. Когда игрушечный инспектор выбрасывал обычный запрос, разрезанный запрос проходил, счётчик правила показывал ноль сработавших пакетов, а сервер получал все двести пятьдесят байт. Когда он отвечал сбросом, результат был тот же.

!wiki-anim-video01-s07-toy-inspector.svg

Теперь сравним с настоящим наблюдателем. Чтобы прочитать имя сайта, которое лежит в начале запроса, ему нужно запрос дождаться, а если он разрезан на части, собрать его самому: запомнить первую часть, дождаться второй, сложить. Обычно это требует хранить состояние каждого соединения и тратить память и время. А времени, как мы помним, у оборудования мало. Умеет ли конкретное оборудование это делать, и всегда ли, мы не знаем.

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

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

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

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

Повтор и что такое zapret2

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

Теперь о том, кто эти приёмы применяет.

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

!wiki-anim-video01-s08-intercept-rule.svg

Что программа делает с перехваченными пакетами, решает стратегия. Стратегия это сценарий воздействия на пакеты. Он собирается из вызовов функций, и вот как это выглядит в нашем опыте: в команде написано «lua-desync равно multisplit, двоеточие, pos равно midsld». Это значит: вызвать функцию multisplit и передать ей параметр, где резать, посередине домена второго уровня. Эта функция написана на языке Lua. Lua это компактный язык сценариев, который встраивается в другие программы как библиотека, так что поведение можно менять, не пересобирая саму программу. Ядро на языке Си перехватывает и разбирает пакеты, а то, как их менять, решают функции на Lua.

!wiki-anim-video01-s08-strategy-call.svg

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

Ей не нужен VPN и не нужны чужие серверы. Что такое VPN? Это виртуальная частная сеть. Вы устанавливаете зашифрованный туннель до стороннего сервера, и ваш трафик, обычно весь, идёт внутри туннеля, а в интернет выходит уже с адреса того сервера. Наблюдатель на пути видит внешнюю оболочку туннеля: адрес VPN-сервера, сам факт туннеля и нередко его протокол. Содержимое и конечные адреса он не видит, но сам туннель может распознать и заблокировать. Цена такой схемы в том, что нужен чужой сервер, ему приходится доверять, а трафик идёт кружным путём. У zapret2 всё иначе: трафик идёт прямо к сайту, адрес в пакетах остаётся вашим, а программа меняет сами пакеты по дороге: режет, переставляет, добавляет подделки, иногда выбрасывает оригинал.

Проект нацелен прежде всего на роутеры с OpenWrt. Это свободная операционная система на основе Linux для роутеров и других встраиваемых устройств, она заменяет заводскую прошивку. Кроме роутеров с OpenWrt, программа работает на обычном Linux, на FreeBSD, на OpenBSD и на Windows. Под macOS, по словам автора, не поддерживается и вряд ли будет, из-за технических причин.

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

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

Все четыре опыта лаборатории

Покажем, как всё это мы проверили.

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

!wiki-anim-video01-s09-lab-four-points.svg

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

Опыт второй. Тот же инспектор, но на клиенте работает zapret2 и режет запрос посередине слова example. Результат: правило инспектора не сработало ни разу, сервер получил двести пятьдесят байт и ответил.

Опыт третий. Инспектор теперь отвечает сбросом. Обычный запрос. Результат: клиент через одну сотую миллисекунды получает сброс и сразу видит ошибку, сервер получил ноль байт.

Опыт четвёртый. Инспектор со сбросом, а на клиенте zapret2 с тем же разрезом. Результат: сброса нет, сервер получил все двести пятьдесят байт.

!wiki-anim-video01-s09-four-runs.svg

Это ещё не результат против ТСПУ, и мы сразу хотим быть честными. Игрушечный инспектор смотрит на каждый пакет по отдельности и ничего не собирает. Если бы он собирал запрос, разрез ему бы не помешал. Реальное оборудование мы проверить не можем и обещать ничего не будем. Мы разбираем механику.

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

Как мы будем это изучать

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

Как устроена серия. Часть первая, три выпуска: идея, что видит DPI и как zapret2 перехватывает пакеты. Часть вторая внутри программы: как она разбирает пакеты, помнит соединения, выбирает правила и запускает стратегии. Часть третья сами приёмы: резать, перемешивать, подделывать. А потом инструменты вокруг.

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

  1. «Письмо в сортировочном центре» (это видео), 2. «Что видит наблюдатель», 3. «Читаем командную строку zapret2», 4. «Где резать: метки».
  2. Сами приёмы: «multisplit: резать на части», «Перемешать: disorder», «Фейк и его условия», «Резать и подделывать вместе», «Фокусы рукопожатия», «Другие слои».
  3. Инструменты: «Читаем и отлаживаем стратегии», затем выпуски про blockcheck2, автоматическую ротацию стратегий, установку и запуск, обфускацию.
  4. Под капотом: «Внутри программы», «От байтов к таблице», «Память о соединении», «Тип нагрузки и имя сайта», «Профили: как программа выбирает», «Lua внутри программы», «Сборка и повторный проигрыш».

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

А там, где речь о коде, мы будем открывать сам код и читать его, а не пересказывать.

!wiki-anim-video01-s10-layers-sources.svg

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

Итог выпуска

Подведём итог всего выпуска.

Запрос превращается в пакеты, как письма на ленте. Наш запрос в двести пятьдесят байт уехал одним пакетом в триста шестнадцать байт за шесть микросекунд.

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

zapret2 стоит на вашем устройстве и меняет то, как пакеты выглядят на этом пути, не прячась за чужими серверами. Разрезанный посередине слова example запрос прошёл мимо игрушечного инспектора.

!wiki-anim-video01-s11-recap-cards.svg

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

!wiki-anim-video01-s11-next-inside-packet.svg

Итак, в нашей аналогии пакеты это письма, а в нашей модели ТСПУ это сортировщик на пути. zapret2 меняет вид пакетов. Дальше заглянем внутрь пакета.


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