[Фича]: stallbreak.lua: сброс соединений, зависших на «16 КБ», чтобы приложения сразу переподключались #110

Open
opened 2026-10-16 19:46:24 +03:00 by ilyasmychkov · 0 comments

Описание проблемы / потребности

Меня раздражает, что ТСПУ случайно «замораживает» соединения: после ~14–35 КБ данных сервер перестаёт приходить, и клиент молча ждёт минутами. Это происходит на каждое соединение отдельно (одинаковый IP то отдаёт файл целиком, то виснет), чаще всего на Cloudflare, Akamai, CloudFront. Видно это как недогруженные ассеты Roblox, «вечная» загрузка в Steam, обрыв стрима ответа.

Хендшейк-стратегии (fake/split/hostfakesplit/seqovl) это не лечат: в моих замерах ни одна из 7 стратегий не уменьшила частоту таких зависаний, а новое соединение обычно проходит.

Предлагаемое решение

Было бы удобно, если бы в комплекте был опциональный lua/stallbreak.lua (нужны таймеры, winws2/nfqws2 ≥ 0.9.5.1), а оркестратор или пресеты могли включать его для «игровых» категорий (Roblox, Steam, лаунчеры).

Как работает: функция следит за границами TLS-записей во входящих данных. Если соединение замолчало посреди записи (это настоящий зависон: простаивающий keep-alive/websocket останавливается на границе записи) или запрос клиента остался без ответа, она шлёт клиенту RST с точным seq. Приложение сразу получает ошибку и переподключается, а не висит. Сам трафик не модифицируется.

Подключение:
--lua-init=@lua/stallbreak.lua
--wf-tcp-in=443
в профиле (в конце цепочки):
--in-range=a
--lua-desync=stallbreak:stall=2.5:hs=4

Замеры (один провайдер, Москва, октябрь 2026, выборки небольшие):

  • клиент с повторами, Roblox CDN + Steam + Cloudflare: 19/30 → 28/30 успешных загрузок (Linux nfqws2 1.0.5.2);
  • через Linux-шлюз, Roblox + Steam: 19/20;
  • Windows 10, winws2 из Zapret 2 GUI (сборка июля 2026): зависания Roblox (clientsettingscdn) и Steam (store, community) сбрасывались через ~2.8–3.1 с вместо 15 с (curl без повторов, 4 попытки на цель).

Альтернативные варианты

  • Пиннинг «хороших» edge-IP через hosts: зависания сильно зависят от конкретного IP CDN (у discord.com один IP Cloudflare дал 12/12, другой 3/12). Это примерно удваивает успешность, но требует регулярной перепроверки и не лечит всё.
  • Докачка через Range-запросы (прокси, который сам перезапрашивает остаток): в тесте 12/12 файлов скачались целиком, но для HTTPS нужен MITM с установкой сертификата.
  • Туннель (VPS): решает полностью, но это уже не zapret.
    stallbreak самый лёгкий вариант: без сертификатов и без внешних серверов.

Дополнительный контекст / скриншоты

Ограничения:

  • Помогает только приложениям, которые сами повторяют запрос. Браузер сброшенную картинку/скрипт обычно не перезапрашивает, поэтому для общего сёрфинга смысла нет.
  • --wf-tcp-in=443 гонит весь входящий 443 через winws2: это нагрузка на CPU при быстрых загрузках (связано с #104). Hostlist профиля лучше держать узким.
  • На Cloudflare часть зависаний попадает ровно на границу TLS-записи и неотличима от простоя.
  • В режиме роутера (Linux, хук forward) нужен отдельный «только наблюдающий» инстанс с --reasm-disable и :noserver: иначе переотправленные многопакетные ClientHello идут мимо NAT и ломают браузеры. Подробности в шапке файла.

Файл: stallbreak.lua (во вложении), лицензия MIT.

Проверка дубликатов

  • Я проверил существующие задачи и не нашёл аналогичного запроса
### Описание проблемы / потребности Меня раздражает, что ТСПУ случайно «замораживает» соединения: после ~14–35 КБ данных сервер перестаёт приходить, и клиент молча ждёт минутами. Это происходит на каждое соединение отдельно (одинаковый IP то отдаёт файл целиком, то виснет), чаще всего на Cloudflare, Akamai, CloudFront. Видно это как недогруженные ассеты Roblox, «вечная» загрузка в Steam, обрыв стрима ответа. Хендшейк-стратегии (fake/split/hostfakesplit/seqovl) это не лечат: в моих замерах ни одна из 7 стратегий не уменьшила частоту таких зависаний, а новое соединение обычно проходит. ### Предлагаемое решение Было бы удобно, если бы в комплекте был опциональный lua/stallbreak.lua (нужны таймеры, winws2/nfqws2 ≥ 0.9.5.1), а оркестратор или пресеты могли включать его для «игровых» категорий (Roblox, Steam, лаунчеры). Как работает: функция следит за границами TLS-записей во входящих данных. Если соединение замолчало посреди записи (это настоящий зависон: простаивающий keep-alive/websocket останавливается на границе записи) или запрос клиента остался без ответа, она шлёт клиенту RST с точным seq. Приложение сразу получает ошибку и переподключается, а не висит. Сам трафик не модифицируется. Подключение: --lua-init=@lua/stallbreak.lua --wf-tcp-in=443 в профиле (в конце цепочки): --in-range=a --lua-desync=stallbreak:stall=2.5:hs=4 Замеры (один провайдер, Москва, октябрь 2026, выборки небольшие): - клиент с повторами, Roblox CDN + Steam + Cloudflare: 19/30 → 28/30 успешных загрузок (Linux nfqws2 1.0.5.2); - через Linux-шлюз, Roblox + Steam: 19/20; - Windows 10, winws2 из Zapret 2 GUI (сборка июля 2026): зависания Roblox (clientsettingscdn) и Steam (store, community) сбрасывались через ~2.8–3.1 с вместо 15 с (curl без повторов, 4 попытки на цель). ### Альтернативные варианты - Пиннинг «хороших» edge-IP через hosts: зависания сильно зависят от конкретного IP CDN (у discord.com один IP Cloudflare дал 12/12, другой 3/12). Это примерно удваивает успешность, но требует регулярной перепроверки и не лечит всё. - Докачка через Range-запросы (прокси, который сам перезапрашивает остаток): в тесте 12/12 файлов скачались целиком, но для HTTPS нужен MITM с установкой сертификата. - Туннель (VPS): решает полностью, но это уже не zapret. stallbreak самый лёгкий вариант: без сертификатов и без внешних серверов. ### Дополнительный контекст / скриншоты Ограничения: - Помогает только приложениям, которые сами повторяют запрос. Браузер сброшенную картинку/скрипт обычно не перезапрашивает, поэтому для общего сёрфинга смысла нет. - --wf-tcp-in=443 гонит весь входящий 443 через winws2: это нагрузка на CPU при быстрых загрузках (связано с #104). Hostlist профиля лучше держать узким. - На Cloudflare часть зависаний попадает ровно на границу TLS-записи и неотличима от простоя. - В режиме роутера (Linux, хук forward) нужен отдельный «только наблюдающий» инстанс с --reasm-disable и :noserver: иначе переотправленные многопакетные ClientHello идут мимо NAT и ломают браузеры. Подробности в шапке файла. Файл: stallbreak.lua (во вложении), лицензия MIT. ### Проверка дубликатов - [x] Я проверил существующие задачи и не нашёл аналогичного запроса
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
zapretdiscordyoutube/zapretgui#110
No description provided.