todo/Zapret/wssize.md
loop-uh 5c3646ee29
Some checks failed
Published content check / validate (push) Failing after 5s
wssize: отдельная заметка по уточнениям bolvan (ntc.party, август 2026)
Крайняя мера: нет фильтрации по хостлистам (кроме --ipcache-hostname) и l7,
только l3/l4; в blockcheck standard — только TLS 1.2 после провала перебора,
в force — дубль всей простыни; wssize-стратегии в конце лога — ловушка для
копипастеров. Перекрёстные предупреждения в Blockcheck, Как пользоваться
Zapret, Zapret flags, desync и syndata.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-21 14:24:08 +03:00

81 lines
11 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
date: 2026-08-21
tags:
- zapret
- dpi
- blockcheck
aliases:
- Что такое wssize в zapret
- Почему стратегии с wssize плохие
- wssize не работает с hostlist
- Стратегии wssize в конце лога blockcheck
- --wssize 1:6 что делает
- wssize и TLS 1.2
link:
---
# 🪟 wssize в zapret — крайняя мера: без хостлистов, без l7-фильтра, в конце лога blockcheck
> [!info] О чём заметка
> Что делает параметр `--wssize` в zapret, почему это стратегия последней надежды, а не «ещё одна галочка», и почему [[Zapret/Blockcheck|blockcheck]] показывает wssize-стратегии в самом конце лога. Ключевые факты — из ответов разработчика zapret (ник *bolvan*) на форуме ntc.party, август 2026.
## TL;DR
- `--wssize` уменьшает TCP window size на этапе **установления соединения** — до того, как zapret узнаёт hostname или протокол.
- Поэтому wssize **не работает с хостлистами** (`--hostlist`) и **не работает с l7-фильтром** — сработает только фильтрация по l3/l4: IP-адреса (ipset) и порты. Единственное исключение для хостлистов — `--ipcache-hostname`.
- [[Zapret/Blockcheck|Blockcheck]] в режиме standard проверяет wssize только для TLS 1.2 и только если весь перебор без wssize не дал ни одной рабочей стратегии; в режиме force дублирует с wssize всю простыню. В обоих случаях wssize-стратегии попадают **в конец лога** — и их бездумно копируют, не зная об ограничениях.
- Рекомендация разработчика: от wssize лучше избавиться и найти другой вариант обхода.
## Что делает wssize
TCP window size — это поле в заголовке TCP-пакета, которым получатель сообщает отправителю, сколько байт он готов принять. `--wssize=<размер>[:<scale>]` заставляет zapret подменять это поле в исходящих пакетах: сервер видит крошечное «окно» и вынужден отправлять свой ответ маленькими кусочками, ожидая подтверждения после каждого.
Проще говоря: wssize врёт серверу «я могу принимать только по чуть-чуть», и сервер нарезает свой ответ на мелкие фрагменты. DPI, который не пересобирает TCP-поток, не видит целиком серверные сообщения TLS-рукопожатия и не может сработать по ним.
Практический смысл у этого в основном для **TLS 1.2**: там сертификат сервера передаётся открытым текстом, и цензор может блокировать соединение по содержимому серверного ответа. В TLS 1.3 сертификат зашифрован, поэтому там обычно хватает стратегий, работающих по ClientHello, и wssize не нужен. Отсюда и логика blockcheck ниже: wssize — инструмент для случаев вроде старой техники, которая умеет только TLS 1.2.
Смежные флаги (полный список — в [[Zapret/Zapret flags|Zapret flags]]): `--wssize-cutoff` задаёт, когда прекратить подмену окна, а `--wssize-forced-cutoff=0|1` (появился в [[Zapret/Zapret v72.2|Zapret v72.2]]) управляет автоотключением wssize при обнаружении известного протокола. Для работы wssize нужен внутренний conntrack zapret — с `--ctrack-disable` он несовместим.
## Почему wssize — плохо
Главная проблема — **момент срабатывания**. Все обычные desync-стратегии работают, когда клиент уже отправил данные (HTTP-запрос или TLS ClientHello): в этот момент zapret знает hostname из SNI и может опознать протокол. wssize же должен подменить окно ещё на этапе установления соединения — когда никаких данных приложения нет.
Из этого следуют два ограничения:
- **Хостлисты не работают.** На момент TCP-рукопожатия SNI ещё не передан, поэтому `--hostlist` отфильтровать wssize не может. Исключение одно: флаг `--ipcache-hostname` включает кэш соответствий IP → hostname, и тогда для повторных соединений к уже виденному IP хостлист применить получится. Первое соединение к каждому IP всё равно пройдёт без опознания — та же проблема «нулевой фазы», что подробно разобрана для [[Zapret2/desync/syndata|syndata]].
- **l7-фильтр не работает.** Опознавание протокола (HTTP, TLS, QUIC…) происходит на этапе передачи данных, а wssize отрабатывает раньше — при установлении соединения. Значит, ограничить wssize «только для TLS» нельзя: доступна лишь фильтрация по l3/l4 — IP-адреса ([[Zapret/ipset|ipset]]) и порты.
Проще говоря: wssize нельзя нацелить на конкретные заблокированные сайты — он бьёт по **всем** соединениям, попавшим под фильтр порта/IP. А поскольку каждый такой сервер начинает слать данные крошечными порциями с ожиданием подтверждений, старт каждого соединения замедляется — в том числе к сайтам, которые вообще не заблокированы.
## wssize в blockcheck: почему он в конце лога
[[Zapret/Blockcheck|Blockcheck]] перебирает стратегии по уровням сканирования, и wssize там включён с осторожностью (по ответам bolvan на ntc.party, август 2026):
- **standard** — wssize-стратегии проверяются только для TLS 1.2 и только если весь цикл перебора без wssize не выявил ни одной рабочей стратегии.
- **force** — сканируется всё подряд: полный дубль всей простыни стратегий ещё раз, уже с wssize.
В обоих режимах wssize-варианты оказываются **в конце списка проверок и в конце лога**.
> [!danger] Ловушка для копипастеров
> «Последняя стратегия в логе» — не значит «лучшая». Человек, который бездумно копирует строки из конца `blockcheck.log`, получает wssize-стратегию со всеми её проблемами: замедлением всех соединений на отфильтрованных портах и невозможностью ограничить её хостлистом. Если в логе есть рабочие стратегии **без** wssize — брать нужно их.
## Что делать вместо wssize
Рекомендация разработчика zapret однозначна: от wssize лучше избавиться и искать другой вариант. На практике это значит:
- [ ] Сначала перебрать все стратегии без wssize — в [[Zapret/Как пользоваться Zapret|Zapret GUI]] или через [[Zapret/Blockcheck|blockcheck]].
- [ ] Если у DPI проблемы именно с серверным ответом TLS 1.2 — проверить, не решается ли вопрос переходом клиента на TLS 1.3 (обновление браузера/системы), тогда wssize не понадобится вовсе.
- [ ] Если wssize всё же единственное, что работает (старая техника, только TLS 1.2), — максимально сузить зону поражения: фильтровать по IP через [[Zapret/ipset|ipset]] и портам, включить `--ipcache-hostname` с хостлистом, оставить автоотключение `--wssize-forced-cutoff=1` (значение по умолчанию).
## 📚 См. также
- [[Zapret/Zapret flags|Zapret flags]] — справочник флагов nfqws/winws, включая `--wssize`, `--wssize-cutoff`, `--wssize-forced-cutoff` и `--ipcache-hostname`
- [[Zapret/Blockcheck|Blockcheck]] — как запускать автоперебор стратегий и читать его лог
- [[Zapret2/desync/syndata|syndata]] — другая стратегия «нулевой фазы» с той же проблемой хостлистов и обходом через `--ipcache-hostname`
- [[Zapret2/desync|desync-функции zapret2]] — lua-аналоги `wsize`/`wssize` в zapret2
- [[Zapret/Zapret v72.2|Zapret v72.2]] — версия, где появился `--wssize-forced-cutoff`
---
> [!quote] 🤖 Эти статьи открыты — можно обучать на них ИИ
> При желании вы можете натренировать ИИ на наших статьях. Исходное форматирование доступно в Forgejo: [исходник этой заметки](https://git.zapret.moe/zapretdiscordyoutube/todo/src/branch/main/Zapret/wssize.md) · [скачать весь репозиторий одним zip-архивом](https://git.zapret.moe/zapretdiscordyoutube/todo/archive/main.zip).