From 3f5aed3ffa6774df3bc83b5158ec1ef6b31202fc Mon Sep 17 00:00:00 2001 From: xyzmean <163691714+xyzmean@users.noreply.github.com> Date: Thu, 24 Sep 2026 01:44:48 +0300 Subject: [PATCH] =?UTF-8?q?=D0=90=D0=B2=D1=82=D0=BE=D0=BE=D0=B1=D1=85?= =?UTF-8?q?=D0=BE=D0=B4:=20=D0=BF=D1=80=D0=B8=20=D1=80=D0=B0=D0=B2=D0=BD?= =?UTF-8?q?=D0=BE=D0=BC=20=D0=B8=D1=82=D0=BE=D0=B3=D0=B5=20=D0=BE=D1=81?= =?UTF-8?q?=D1=82=D0=B0=D1=91=D1=82=D1=81=D1=8F=20=D0=BF=D1=80=D0=B8=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D1=91=D0=BD=D0=BD=D0=B0=D1=8F=20=D1=81=D1=82=D1=80?= =?UTF-8?q?=D0=B0=D1=82=D0=B5=D0=B3=D0=B8=D1=8F,=20=D0=B4=D0=BE=D0=BA?= =?UTF-8?q?=D1=83=D0=BC=D0=B5=D0=BD=D1=82=20=C2=AB=D0=9A=D0=B0=D0=BA=20?= =?UTF-8?q?=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=D0=B5=D1=82=20=D0=B0=D0=B2?= =?UTF-8?q?=D1=82=D0=BE=D0=BE=D0=B1=D1=85=D0=BE=D0=B4=C2=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Фоновое сравнение при равном итоге переключало на стратегию, которая шла в списке первой: на тестовом роутере v4 и v7 сошлись на 137, подбор ставил v7, видел, что сервисов открывается меньше, и возвращал v4. Теперь при равенстве применённая остаётся. - Российская колония: выход у неё внутри страны, за теми же ТСПУ, — через неё не снимается ни геоблок, ни остальные блокировки. Так и сказано в журнале. - docs/autobypass.md — как устроен автообход: порядок подбора, перебор стратегий и счёт, сравнение близких, выбор колоний WARP, списки, ИИ-сервисы, мост Telegram, ограничения. --- ZapretManager_LuCI.sh | 20 +- docs/autobypass.md | 708 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 721 insertions(+), 7 deletions(-) create mode 100644 docs/autobypass.md diff --git a/ZapretManager_LuCI.sh b/ZapretManager_LuCI.sh index d7f7ecc..c4eac70 100644 --- a/ZapretManager_LuCI.sh +++ b/ZapretManager_LuCI.sh @@ -4848,7 +4848,8 @@ ST_CRON_CMD="/etc/init.d/steer enabled && { for i in zmwarp zmwarp2 zmwarp3; do # на трёх устройствах Cloudflare считает одним клиентом. ST_WARP_N=3 ST_WARP_UP="$ST_DIR/warp.up" # поднятые туннели «интерфейс колония», лучший первым -# Российские колонии Cloudflare: туннель через них геоблок не снимает, берутся только в запас. +# Российские колонии Cloudflare: выход у них внутри страны, за теми же ТСПУ, что и без туннеля, — +# через них не снимается ни геоблок, ни остальные блокировки. Берутся только в запас. ST_RU_COLOS="DME SVX LED KJA REN OVB KZN AER VVO" # Что выбрать при первой установке, если ничего не выбрано: ИИ-сервисы закрывает геоблок, # и кроме туннеля им ничего не поможет. @@ -5297,7 +5298,7 @@ _st_warp_scan() { # ИНТЕРФЕЙС КЛЮЧ_УЗЛА ЗАНЯТЫЕ_КОЛО pick=$(awk '{ printf "%d\t%s %s %s\n", $1 * 100000 + $2, $3, $4, $5 }' "$f" | sort -n | head -n1 | cut -f2) case "$f" in *.same) echo " другой колонии нет — та же, но через другой адрес" >&2 ;; - *.ru) echo " наружных колоний нет — беру российскую (геоблок она не снимает)" >&2 ;; + *.ru) echo " наружных колоний нет — беру российскую: блокировки через неё не снимаются" >&2 ;; *.notls) echo "!! ни через одну точку не проходит HTTPS — беру лучшую из оставшихся" >&2 ;; esac echo "$pick" @@ -5412,7 +5413,7 @@ _st_warp_up() { # [repick] fi echo "$colos" > "$ST_DIR/warp.colo" _st_tgws_warp - [ "$ru" = 1 ] && _rb_warn "Часть туннелей WARP идёт через российские колонии: ИИ-сервисы через них не откроются" + [ "$ru" = 1 ] && _rb_warn "Часть туннелей WARP идёт через российские колонии: заблокированное через них не откроется" return 0 } @@ -6592,7 +6593,7 @@ do_redbtn_deep() { # ПРИМЕНЁННАЯ [ -s "$RB_RUN/deep.res" ] && [ -s "$RB_RUN/deep.cand" ] || return 0 sum="$(md5sum "$CONF" | cut -d' ' -f1)" RB_PROBE_DOH="$(_rb_doh_pick)" - win="$(_rb_zt_deep_pick "$RB_RUN/deep.res")" + win="$(_rb_zt_deep_pick "$RB_RUN/deep.res" "$cur")" rm -f "$RB_RUN/deep.res" "$RB_RUN/deep.cand" [ -n "$win" ] && [ "$win" != "$cur" ] || { echo "Оставляем $cur"; return 0; } # За это время настройку могли сменить руками или тестером — тогда чужое не трогаем. @@ -6642,8 +6643,8 @@ _rb_zt_ties() { # ФАЙЛ_РЕЗУЛЬТАТОВ -> имена, по строк # счёт — узлы CDN, до которых дошёл поток, — и итоговый счёт = основной + дополнительный. # Печатает имя победителя по итоговому (или первой, если проверить не удалось). Первая — # применённая: другая побеждает, только набрав строго больше. -_rb_zt_deep_pick() { # ФАЙЛ_РЕЗУЛЬТАТОВ - local res="$1" best key ties n name blk="$RB_RUN/zt.dblock" tgt="$RB_RUN/zt.deep" r sc main tot top=-1 win +_rb_zt_deep_pick() { # ФАЙЛ_РЕЗУЛЬТАТОВ [ПРИМЕНЁННАЯ] + local res="$1" cur="${2:-}" best key ties n name blk="$RB_RUN/zt.dblock" tgt="$RB_RUN/zt.deep" r sc main tot top=-1 win best=$(tail -n +2 "$res" | head -n1) win="${best%% → *}" ties="$(_rb_zt_ties "$res")" @@ -6663,7 +6664,12 @@ _rb_zt_deep_pick() { # ФАЙЛ_РЕЗУЛЬТАТОВ main=$(awk -v n="$name" 'NR > 1 { m = $0; sub(/ → .*/, "", m); if (m == n) { sub(/^.* → /, ""); split($0, a, "/"); print a[1]; exit } }' "$res") tot=$(( ${main:-0} + sc )) echo " основной ${main:-0} + дополнительный $sc из ${r#* } = $tot" >&2 - [ "$tot" -gt "$top" ] && { top="$tot"; win="$name"; } + # При равном итоге остаётся применённая: переключение ради той же суммы — лишний + # перезапуск обхода (на тестовом роутере v4 и v7 сошлись на 137, и сравнение + # переключало на v7 только потому, что та шла в списке первой). + if [ "$tot" -gt "$top" ] || { [ "$tot" -eq "$top" ] && [ "$name" = "$cur" ]; }; then + top="$tot"; win="$name" + fi done < "$RB_RUN/zt.ties" _rb_zt_down rm -f "$RB_RUN/zt.ties" "$blk" "$tgt" diff --git a/docs/autobypass.md b/docs/autobypass.md new file mode 100644 index 0000000..37ad70d --- /dev/null +++ b/docs/autobypass.md @@ -0,0 +1,708 @@ +# Как работает автообход + +Автообход — одна кнопка в Zapret Manager. Роутер сам проверяет популярные сервисы и каждому +подбирает самый дешёвый способ, при котором сервис открывается: напрямую, через стратегию +zapret, через туннель WARP или через свой DNS. Ниже — что именно происходит после нажатия, как +перебираются стратегии, как выбираются колонии WARP и как потом ходит трафик. + +Коротко о словах, которые встретятся дальше: + +| Слово | Что это | +|---|---| +| **zapret** | обход DPI провайдера: первые пакеты соединения подправляются так, чтобы фильтр их не узнал | +| **стратегия** | набор настроек zapret. Здесь есть наборы v (v1–v10), Flowseal, Yv (для YouTube), Dv (для голоса Discord) | +| **WARP** | бесплатный туннель Cloudflare. Весь трафик сервиса уходит в него и выходит у Cloudflare | +| **колония** | узел Cloudflare, через который выходит туннель; обозначается кодом аэропорта: HEL — Хельсинки, DME — Москва | +| **Steer** | движок, который решает, какой сервис идёт в WARP, а какой — обычным путём | +| **fakeip** | подставной адрес, который Steer выдаёт в ответ на DNS-запрос, чтобы потом узнать соединение этого сервиса | +| **DoH** | DNS поверх HTTPS: запрос имени, который провайдер не видит и не подменяет | +| **stgws** | мост Telegram на роутере: прячет протокол Telegram в веб-сокет или ведёт его через WARP | + +--- + +## 1. Что делает кнопка + +``` + ┌──────────────────────────────┐ + │ нажата кнопка «Автообход» │ + └──────────────┬───────────────┘ + │ + ┌─────────────────────────┼─────────────────────────┐ + ▼ ▼ ▼ + ┌──────────────────┐ ┌──────────────────────┐ ┌──────────────────────┐ + │ zapret не стоит │ │ zapret выключен │ │ Steer выключен или │ + │ → ставится │ │ → включается │ │ сервис снят на его │ + │ │ │ и запускается │ │ странице → запрет │ + │ │ │ │ │ снимается │ + └──────────────────┘ └──────────────────────┘ └──────────────────────┘ + │ + ▼ + ┌──────────────────────────────┐ + │ подбор (раздел 2), затем │ + │ фоновое сравнение (разд. 4)│ + └──────────────────────────────┘ +``` + +Нажатая кнопка — согласие на всё, что автообход умеет. То, что было выключено руками, снова +участвует в подборе: иначе подбор находил бы, что сервис открывается через WARP, и не +включал бы его. + +Есть два режима: + +| Режим | Какие стратегии перебираются | Сколько идёт | +|---|---|---| +| **Быстрый** | набор v (10 стратегий) | обычно 5–15 минут | +| **Полный** | Flowseal и v | дольше, до получаса | + +Полный подбор перебирает стратегии всегда, даже если при текущей настройке всё открывается: +его выбирают, чтобы найти вариант лучше. Быстрый перебирает, только если какой-то сервис не +открылся. + +Пока подбор идёт, сеть работает на прежней настройке: стратегии проверяются в стороне и +клиентов не касаются (раздел 3). Автообход нельзя запустить, пока идёт тест стратегий +Zapret Manager или операция на странице Steer. + +--- + +## 2. Порядок подбора + +``` + ┌───────────────────────────────────────────────────────────────────────────┐ + │ ① Проверка при текущей настройке │ + │ YouTube, Discord, Instagram, WhatsApp, X, GitHub │ + └─────────────────────────────────┬─────────────────────────────────────────┘ + ▼ + ┌───────────────────────────────────────────────────────────────────────────┐ + │ ② Подбор стратегии zapret │ + │ быстрый — если что-то не открылось; полный — всегда │ + │ победитель применяется, сервисы перепроверяются, хуже — откат │ + └─────────────────────────────────┬─────────────────────────────────────────┘ + ▼ + ┌───────────────────────────────────────────────────────────────────────────┐ + │ ③ YouTube отдельно — если всё ещё не открывается: свой набор Yv │ + └─────────────────────────────────┬─────────────────────────────────────────┘ + ▼ + ┌───────────────────────────────────────────────────────────────────────────┐ + │ ④ «Напрямую или через zapret» — открывшиеся сервисы проверяются в обход │ + │ zapret, чтобы знать, нужен ли он им вообще │ + └─────────────────────────────────┬─────────────────────────────────────────┘ + ▼ + ┌───────────────────────────────────────────────────────────────────────────┐ + │ ⑤ WARP — для того, что не открылось, если стоит Steer │ + │ три туннеля в разных колониях (раздел 5), сервис проверяется через │ + │ туннель и, если открылся, добавляется в Steer │ + └─────────────────────────────────┬─────────────────────────────────────────┘ + ▼ + ┌───────────────────────────────────────────────────────────────────────────┐ + │ ⑥ Туннели для моста Telegram — если шаг ⑤ не понадобился, туннели всё │ + │ равно проверяются: мост ходит через WARP сам │ + └─────────────────────────────────┬─────────────────────────────────────────┘ + ▼ + ┌───────────────────────────────────────────────────────────────────────────┐ + │ ⑦ ИИ-сервисы — не открываются → DoH только для их доменов (раздел 7) │ + └─────────────────────────────────┬─────────────────────────────────────────┘ + ▼ + ┌───────────────────────────────────────────────────────────────────────────┐ + │ ⑧ Telegram — напрямую, через мост stgws или через WARP (раздел 8) │ + └─────────────────────────────────┬─────────────────────────────────────────┘ + ▼ + ┌───────────────────────────────────────────────────────────────────────────┐ + │ «Готово, обход подобран» │ + │ ⑨ в фоне — сравнение близких стратегий (раздел 4), если такие нашлись │ + └───────────────────────────────────────────────────────────────────────────┘ +``` + +### Лестница стоимости + +Каждому сервису достаётся первая ступень снизу, на которой он открывается. Чем выше ступень, +тем больше вмешательства в трафик. + +``` + дороже ▲ + │ ┌──────────────────────┐ + │ │ туннель WARP │ весь трафик сервиса уходит в туннель + │ ├──────────────────────┤ + │ │ стратегия zapret │ подправляются первые пакеты соединения + │ ├──────────────────────┤ + │ │ DoH для доменов │ меняется только ответ DNS (ИИ-сервисы) + │ ├──────────────────────┤ + │ │ напрямую │ ничего не делается + дешевле └──────────────────────┘ +``` + +``` + ┌──────────┐ + │ сервис │ + └────┬─────┘ + ▼ + ┌──────────────────────────┐ + │ открывается как есть? │ + └──────┬────────────┬──────┘ + да │ │ нет + ▼ ▼ + ┌────────────────────────┐ ┌──────────────────────────┐ + │ и в обход zapret тоже? │ │ подбор zapret помог? │ + └──┬──────────────┬──────┘ └──────┬────────────┬──────┘ + да │ │ нет да │ │ нет + ▼ ▼ ▼ ▼ + ┌───────────┐ ┌─────────────┐ ┌─────────────┐ ┌──────────────────────┐ + │ напрямую │ │ через zapret│ │ через zapret│ │ Steer стоит и через │ + └───────────┘ └─────────────┘ └─────────────┘ │ WARP открывается? │ + └──────┬───────────┬───┘ + да │ │ нет + ▼ ▼ + ┌───────────┐ ┌──────────────┐ + │ через WARP│ │не открывается│ + └───────────┘ └──────────────┘ +``` + +### Когда сервис считается открытым + +У каждого сервиса два списка адресов: + +| Список | Что должно открыться | Пример | +|---|---|---| +| **обязательные** | все до одного | у YouTube — сайт, API и узел видео; у Discord — сайт, шлюз и узел обновлений | +| **дополнительные** | не меньше 60 % | картинки, CDN, статика | + +Одного главного адреса мало: страница YouTube открывается, а видео — нет. Адрес считается +открытым, если сервер ответил каким-то кодом, кроме «451, недоступно по закону», и в ответе +нет фраз геоблока вроде «not available in your country». Ответ, оборвавшийся на +16–20 КБ, открытым не считается: так выглядит блокировка «на середине страницы». + +Все проверки разрешают имена через свой DoH (1.1.1.1, 8.8.8.8 или 77.88.8.8 — первый, что +ответил), а не через DNS роутера: провайдер может подменять ответы. Исключение — ИИ-сервисы: +их проверяют именно DNS роутера, потому что лечит их как раз он (раздел 7). + +--- + +## 3. Перебор стратегий + +### Проверка в стороне + +Обычный тестер Zapret Manager переписывает настройку zapret каждой новой стратегией и +перезапускает обход. Все минуты теста клиенты сети живут то на одной случайной стратегии, то +на другой. Автообход так не делает: + +``` + ┌──────────────── ОБЫЧНЫЙ ТРАФИК СЕТИ ─────────────────┐ + │ телефоны, ноутбуки │ + │ │ │ + │ ▼ │ + │ zapret на ПРЕЖНЕЙ стратегии ──► интернет │ ← не меняется до конца подбора + └──────────────────────────────────────────────────────┘ + + ┌──────────────── ПРОВЕРКА СТРАТЕГИИ ──────────────────┐ + │ запросы самого роутера с портов 20000–20999 │ + │ │ │ + │ ▼ │ + │ свой экземпляр zapret со СВОЕЙ стратегией │ ← только эти запросы + │ на своей очереди пакетов │ + │ │ │ + │ ▼ │ + │ пакеты помечены — общий zapret их пропускает │ + │ │ │ + │ ▼ │ + │ интернет │ + └──────────────────────────────────────────────────────┘ +``` + +Проверочный трафик отличается от клиентского портами отправителя. Он попадает только в свой +экземпляр zapret, а общий zapret его не трогает. Настройка zapret роутера меняется один раз, +в конце, и только если победитель действительно лучше. + +### Что перебирается и на чём + +``` + ┌───────────────────┐ ┌──────────────────────────────────────────────┐ + │ стратегии │ │ цели проверки │ + │ │ │ │ + │ быстрый: v1–v10 │ │ ▸ общий список Zapret Manager: госуслуги, │ + │ │ × │ налоговая, rutube, instagram, discord, x, │ + │ полный: Flowseal │ │ rutracker, openwrt и др. + внешний набор │ + │ + v1–v10 │ │ сайтов с проверкой «16–20 КБ» │ + │ │ │ (на момент написания — 54 адреса) │ + │ │ │ ▸ адреса сервисов, которые не открылись │ + │ │ │ на шаге ① (считаются отдельно) │ + └───────────────────┘ └──────────────────────────────────────────────┘ +``` + +Число стратегий Flowseal и часть целей приходят из внешних списков, поэтому они меняются со +временем. Первым идёт **контроль**: те же цели без zapret. С ним сравнивается каждая +стратегия. + +Для каждой стратегии: + +``` + запустить свой zapret со стратегией ──► не запустился? ──► «не запустилась», дальше + │ + ▼ + все цели параллельно (по 8 разом; на роутере меньше 256 МБ — по 4) + │ + ▼ + основной счёт: «открылось N из 54» + хвост: сколько адресов неоткрывшихся сервисов открылось +``` + +### Как выбирается победитель + +``` + 1. сортировка: по основному счёту, при равном — по хвосту + │ + ▼ + 2. лучшая лучше контроля? ├── основной больше, чем без zapret ──► да + ├── основной равен, но хвост больше ──► да + └── иначе ──► «Ни одна стратегия не открыла больше, + чем без Zapret — настройку не меняем» + │ + ▼ + 3. применяется к zapret роутера + │ + ▼ + 4. все сервисы проверяются заново + открылось меньше, чем до подбора? ──► проверка ещё раз (одна проба шумит) + всё равно меньше ──► откат к прежней настройке + │ + ▼ + 5. «Стратегия … применена» +``` + +Если подбор остановили на середине, неполный победитель не применяется. Если остановили во +время перепроверки, прежняя настройка возвращается. + +YouTube подбирается отдельно, если после общего подбора он всё ещё не открывается. Для него +перебирается свой набор Yv на адресах YouTube и видеоузлов. Применяется он так же — только +если лучше контроля, с перепроверкой и откатом. + +--- + +## 4. Фоновое сравнение близких стратегий + +Короткие запросы основного прохода плохо различают стратегии: разница в пару целей из +полусотни — это шум. При этом провайдер часто рвёт соединение к CDN и хостингам уже после +того, как через него ушло 16–20 КБ. Страница успела «открыться», а дальше замерла. Поэтому +после «Готово» близкие к победителю стратегии ещё раз сравниваются в фоне другим замером. + +``` + результаты основного прохода + │ + ▼ + ┌───────────────────────────────────────────────────────────────┐ + │ близкие: основной счёт не ниже 90 % от счёта лучшей │ + │ первой — применённая, за ней открывшие больше адресов │ + │ неоткрывшихся сервисов; всего не больше 6 │ + └───────────────────────────┬───────────────────────────────────┘ + одна — сравнивать не с кем, фона нет + │ больше одной + ▼ + ┌───────────────────────────────────────────────────────────────┐ + │ у каждой — дополнительный счёт по узлам CDN (метод ниже) │ + │ ИТОГ = основной + дополнительный │ + └───────────────────────────┬───────────────────────────────────┘ + ▼ + ┌───────────────────────────────────────────────────────────────┐ + │ победитель по итогу — другая стратегия, итог СТРОГО больше? │ + │ нет → «Оставляем …» │ + │ да → настройку за это время не меняли руками? │ + │ → применить, проверить сервисы │ + │ → открывается меньше? вернуть прежнюю │ + └───────────────────────────────────────────────────────────────┘ +``` + +### Дополнительный замер — как у dpi-detector + +Способ взят у проекта dpi-detector (Runnin4ik), и узлы — из его списка: адреса Hetzner, +Cloudflare, CDN77, Akamai, AWS, Fastly, Oracle, OVH и других провайдеров. На момент +написания их 110. + +``` + роутер ──────── одно соединение ──────────► узел CDN + │ + │ запрос 1 HEAD + заголовок 4 КБ случайных символов ──► ответ + │ запрос 2 HEAD + ещё 4 КБ ──► ответ + │ … + │ запрос 10 HEAD + ещё 4 КБ (всего ≈ 40 КБ от нас) ──► ответ + │ + ▼ + все 10 ответов → узел «выдержал» первый обрыв → узел не выдержал, дальше не ждём +``` + +Меряется то, что режет DPI, — объём, ушедший **от нас** по одному соединению. У узлов, для +которых в списке указано имя сайта, оно подставляется в TLS; у остальных — example.com, как +у dpi-detector. Сертификат не проверяется: важно, дожило ли соединение, а не чей это узел. На +один запрос даётся 5 секунд. + +Пример с тестового роутера, все 110 узлов, применена v4: + +| Стратегия | Основной | Дополнительный | Итог | +|---|---|---|---| +| **v4** (применена) | 40 | 97 из 110 | **137** | +| v7 | 41 | 96 из 110 | **137** | +| v1 | 39 | 96 из 110 | 135 | +| general (ALT13) | 40 | 85 из 110 | 125 | +| general (EXP) | 38 | 85 из 110 | 123 | +| v8 | 40 | 81 из 110 | 121 | + +Здесь v7 выиграла основной проход на одну цель, а v4 отыграла её на дополнительном замере, и +итог вышел равным. При равном итоге остаётся применённая стратегия — v4. Замер одной +стратегии по 110 узлам занимает на роутере со 128 МБ несколько минут, а обход всё это время +уже работает. + +На странице автообхода, пока идёт сравнение: «Лучшая стратегия определится позже — идёт +сравнение близких». Если стратегия сменилась: «Лучшая стратегия: …». Новый подбор или +переустановка Zapret Manager фоновое сравнение прерывают. Настройка при этом не страдает: +меняется она только в самом конце. + +--- + +## 5. WARP: три туннеля и выбор колоний + +WARP ставится со Steer. Туннелей три: у каждого свои ключи и своя точка входа, и все три в +разных колониях, если это возможно. Трафик идёт через самый быстрый живой. Упал один — +Steer сам переключается на другой. Упали все — трафик сервиса идёт напрямую, без туннеля. + +### Ключи + +``` + Cloudflare API ──► ключи выданы? ──► да ──► туннель готов + │ нет + ▼ + запасные генераторы (как на странице Mixomo) +``` + +Туннель — AmneziaWG, то есть WireGuard с маскировкой рукопожатия. + +### Разведка точки входа + +Годность точки решает только **поднятый туннель**. Проверка по обычному HTTP к Cloudflare +меряет не то: она идёт по TCP, а туннель — по UDP, и провайдер режет их по-разному. А +колония в ответе — это колония *входа*, а не выхода. Поэтому каждая точка ставится на живой +туннель и проверяется изнутри. + +``` + ┌──────────────────────────────────────────────────────────────────────────┐ + │ кандидаты: 14 подсетей Cloudflare │ + │ 188.114.96–99.x · 162.159.192/193/195.x · 8.34.146.x · 8.39.x · … │ + │ сначала «якоря» .1 каждой подсети, затем 10 случайных адресов │ + │ (всего 24) │ + └──────────────────────────────────┬───────────────────────────────────────┘ + ▼ + ┌──────────────────────────────────────────────────────────────────────────┐ + │ порты: 2408 · 500 · 4500 · 987 (вне игрового фильтра zapret) │ + │ пробуются на первых трёх якорях, нужно два работающих; │ + │ ни один не ответил — «провайдер не выпускает ни один порт» │ + └──────────────────────────────────┬───────────────────────────────────────┘ + ▼ + для каждого кандидата: + ┌──────────────────────────────────────────────────────────────────────────┐ + │ а) поставить точку и дождаться рукопожатия (до 8 с) │ + │ б) 3 пинга через туннель → потери и круг │ + │ в) колония ИЗНУТРИ туннеля — по заголовку ответа Cloudflare │ + │ г) HTTPS через туннель обязан проходить │ + └──────────────────────────────────┬───────────────────────────────────────┘ + ▼ + нашлись 3 новые колонии — разведка останавливается +``` + +Про пункт г. На части сетей через туннель проходят только мелкие пакеты и порт 80, а TLS +молчит. Такая точка «работает» по всем замерам, но сайты через неё не открываются. + +### Какую точку взять + +Кандидаты раскладываются по корзинам. Берётся первая непустая, в ней — лучшая по потерям, +а при равных потерях — по кругу. + +``` + ┌───────────────────────────────┐ + 1 │ новая колония, HTTPS есть │ ← лучший вариант + ├───────────────────────────────┤ + 2 │ та же колония, что у соседнего│ ← другой адрес в той же колонии лучше никакого + │ туннеля, но другой адрес │ + ├───────────────────────────────┤ + 3 │ колония не узналась │ + ├───────────────────────────────┤ + 4 │ российская колония │ ← выход внутри страны, за ТСПУ + │ DME SVX LED KJA REN OVB KZN │ + │ AER VVO │ + ├───────────────────────────────┤ + 5 │ HTTPS через туннель не идёт │ ← последний запас + └───────────────────────────────┘ +``` + +Российская колония выводит трафик из Cloudflare внутри страны, и дальше он идёт через те же +ТСПУ, что и без туннеля. Поэтому через неё не снимается ни геоблок, ни остальные блокировки: +туннель в DME работает, но пользы от него почти нет. Если часть туннелей всё же оказалась в +российских колониях, журнал об этом предупреждает. + +### Живые туннели + +Туннель, у которого рукопожатие было меньше трёх минут назад, при следующем подборе или +«Применить» не пересканируется: это рвало бы соединения ради того же результата. Исключение — +**российская колония**. Адреса WARP общие для многих колоний (anycast): на один и тот же +адрес Cloudflare может со временем начать отвечать из другой колонии. На тестовом роутере +туннель, выбранный в Хельсинки, через некоторое время стал выходить в Москве (DME). Поэтому +колония живого туннеля каждый раз узнаётся заново, и российская разводится с нуля. +Принудительно развести все три заново можно кнопкой «Сменить точки входа». + +--- + +## 6. Списки сервисов + +Чтобы Steer знал, какой трафик вести в WARP, у каждого сервиса есть список доменов и подсетей. + +``` + каталог splify2-lists ──► ссылка на набор .srs издателя itdoginfo + (конкретная версия, одинаковая у всех роутеров) + │ + ▼ + Steer разбирает набор на: + ┌─────────────────┼──────────────────────────┐ + ▼ ▼ ▼ + домены подсети подсети с сужением + │ │ по протоколу и портам + ▼ ▼ │ + fakeip в ответ DNS по адресу назначения ▼ + голос Discord: в туннель идёт + только он, а не весь TCP к + подсетям Cloudflare +``` + +| Сервис | Набор | +|---|---| +| YouTube | youtube | +| Discord | discord (с сужением голоса) | +| Instagram, WhatsApp | meta (один набор на оба) | +| X | twitter | +| Telegram | telegram | +| GitHub, ИИ-сервисы | своих наборов для туннеля нет | + +Список скачивается сначала напрямую, потом через уже поднятый туннель: GitHub у многих +закрыт. Если не скачался вовсе, берётся список, встроенный в Zapret Manager. Он хуже +свежего, но лучше никакого. + +--- + +## 7. ИИ-сервисы + +ChatGPT, Claude, Gemini и похожие закрыты не провайдером, а самим сервисом: он смотрит, +откуда пришли. Ни стратегия zapret, ни WARP в российской колонии (выход там внутри страны) +это не снимают. Снимает +**DNS**, который на имя сервиса отдаёт адрес своего прокси за границей. + +``` + запрос имени от устройства + │ + ▼ + ┌────────────────────────┐ + │ DNS роутера (dnsmasq) │ + └───┬────────────────┬───┘ + │ домен из списка│ всё остальное + │ ИИ-сервисов │ + ▼ ▼ + ┌────────────────┐ ┌─────────────────────┐ + │ свой DoH-клиент│ │ как раньше, ничего │ + │ на порту 5359 │ │ не меняется │ + │ → выбранный │ └─────────────────────┘ + │ гео-резолвер│ + └────────────────┘ +``` + +- **Только для доменов списка.** Список публикует dns.malw.link (на момент написания — около + 17 тысяч доменов после свёртки поддоменов). Остальной DNS роутера не меняется. +- **Выбор резолвера.** Все гео-резолверы пула (на момент написания их 12) проверяются разом + настоящим запросом к chatgpt.com. Берётся самый быстрый из тех, у кого ответил выданный + прокси. +- **Свой экземпляр.** DoH-клиент для ИИ-доменов — отдельная служба. Чужую настройку + https-dns-proxy (страница DoH, свои резолверы) она не трогает. Если пакет ставил сам + автообход, а своей настройки до этого не было, служба пакета выключается: иначе она забрала + бы весь DNS роутера. +- **Сторож раз в 30 минут.** Проверяет, открываются ли ИИ-сервисы. Перестали — резолвер + подбирается заново. + +--- + +## 8. Telegram и мост stgws + +### Когда нужен мост + +Открытый сайт ещё не значит, что работает приложение: оно ходит к дата-центрам (ДЦ) Telegram +по своему протоколу MTProto, и режут именно его. Поэтому автообход шлёт пяти ДЦ настоящий +первый запрос протокола и ждёт ответа 5 секунд. + +``` + Telegram отмечен на странице Steer ──► через WARP + │ нет + ▼ + мост уже стоит и работает ──────────► через мост + │ нет + ▼ + сайт и все 5 ДЦ ответили ──────────► напрямую + │ нет + ▼ + ставится мост ──────────────────────► через мост +``` + +### Как мост выбирает путь + +Соединения устройств к адресам ДЦ Telegram роутер перехватывает и отдаёт мосту. Для каждого +соединения мост идёт по цепочке **от дешёвого к дорогому**: + +``` + ┌──────────────────────────────┐ + │ перехвачено — это MTProto? │ + └──────┬────────────────┬──────┘ + нет │ │ да + ▼ ▼ +┌────────────────────┐ ┌──────────────────────────────┐ +│ насквозь как есть │ │ ① напрямую к ДЦ без WARP │ +│ (через WARP, если │ │ если по замеру ДЦ открыт │ +│ он есть) │ └──────┬────────────────┬──────┘ +└────────────────────┘ ответил│ │ молчит / по замеру закрыт + ▼ ▼ + ┌──────────┐ ┌──────────────────────────────┐ + │ сессия │ │ ② напрямую к ДЦ через WARP │ + └──────────┘ └──────┬────────────────┬──────┘ + ответил│ │ молчит / нет WARP + ▼ ▼ + ┌──────────┐ ┌─────────────────────────┐ + │ сессия │ │ ③ веб-сокет через WARP │ + └──────────┘ └──────┬───────────┬──────┘ + поднялся│ │ нет / нет WARP + ▼ ▼ + ┌──────────┐ ┌────────────────────┐ + │ сессия │ │ ③ веб-сокет без │ + └──────────┘ │ WARP, мимо zapret │ + └──┬──────────┬──────┘ + поднялся│ │ ни один путь + ▼ ▼ + ┌──────────┐ ┌──────────────────┐ + │ сессия │ │ ④ насквозь к ДЦ │ + └──────────┘ │ как есть │ + └──────────────────┘ +``` + +- **«ДЦ ответил»** — прямые пути проверяются боем. Соединение по TCP ещё ничего не значит: + при блокировке по адресу TCP обычно устанавливается, а дальше тишина. Путь живой, только + если ДЦ заговорил в течение 4 секунд. +- **Молчание не ломает следующий шаг.** Пока ДЦ молчит, клиент успевает что-то отправить. + Следующий путь получает начало разговора вместе с этими байтами, и для ДЦ поток начинается + с начала. +- **Веб-сокет.** ДЦ2 и ДЦ4 идут на веб-сокет самого Telegram (web.telegram.org). ДЦ1, 3, 5 + и отдельный ДЦ203, где тоже лежат файлы, — на домены-посредники за Cloudflare, как у + tg-ws-proxy (Flowseal). На каждое соединение пробуется не больше трёх доменов, по две + точки у каждого. +- **Запас.** Мост держит до 8 поднятых веб-сокетов наготове, по 2 на ДЦ, каждый не старше + 40 секунд. Клиент получает соединение сразу, без рукопожатия. Запас пополняется только + минуту после последнего обращения клиента. +- **Мимо zapret.** Соединения моста наверх идут в обход zapret роутера. Стратегия, подобранная + под сайты, может портить TLS к Cloudflare: на тестовом роутере с одной из стратегий TCP к + доменам-посредникам поднимался, а на TLS не приходило ни байта, и не грузились картинки + из ДЦ1, 3, 5 и 203. Посредники для того и подобраны, чтобы открываться без ухищрений. +- **Туннели для моста.** Мост ходит через WARP сам, по списку туннелей, который пишет + Zapret Manager после подъёма туннелей. Российские колонии в список не попадают. Список + перечитывается, как только меняется, — мост перезапускать не нужно. + +### Отставки + +Чтобы не платить ожиданием на каждом соединении, неудачный путь на время уходит в сторону: + +| Что случилось | На сколько | +|---|---| +| ДЦ промолчал напрямую | 5 минут без шага ① для этого ДЦ | +| ДЦ промолчал через WARP | 5 минут без шага ② для этого ДЦ | +| к туннелю не дошло даже TCP | 30 секунд без WARP вовсе | +| домен-посредник отказал или не отдал данные | 1 минута без этого домена | +| web.telegram.org отказал | 20 секунд | +| клиент дважды за минуту ждал больше 3 секунд и ничего не получил | путь отставляется, как при отказе | + +Когда все посредники на паузе, пробуется один, а не три. Неудавшееся соединение закрывается +сразу, чтобы роутер не держал его минутами. + +--- + +## 9. Как потом ходит трафик + +### Имя → адрес + +``` + ┌──────────────────────────┐ + │ УСТРОЙСТВО В СЕТИ │ + └────────────┬─────────────┘ + │ запрос DNS + ▼ + ┌──────────────────────────┐ + │ у Steer есть сервисы │ + │ для WARP? │ + └──────┬────────────┬──────┘ + да │ │ нет + ▼ │ + ┌─────────────────────┐ │ + │ DNS-сервер Steer │ │ + └──┬──────────────┬───┘ │ + домен сервиса │ │ прочее│ + для WARP ▼ ▼ ▼ + ┌──────────────┐ ┌─────────────────────┐ + │ fakeip │ │ DNS роутера │ + │ → потом WARP │ └──┬───────────────┬──┘ + └──────────────┘ │ ИИ-домен │ прочее + ▼ ▼ + ┌────────────────────┐ ┌────────────────────┐ + │ свой DoH → │ │ обычный DNS │ + │ гео-резолвер │ │ │ + └────────────────────┘ └────────────────────┘ +``` + +### Соединения + +``` + ┌──────────────────────────┐ + │ УСТРОЙСТВО В СЕТИ │ + └────────────┬─────────────┘ + ▼ + ┌──────────────────────────┐ + │ куда идёт соединение? │ + └──┬───────────┬────────┬──┘ + адрес ДЦ Telegram, │ │ │ всё остальное + стоит мост │ fakeip или │ + │ подсеть сервиса │ + │ для WARP │ + ▼ ▼ ▼ + ┌─────────────┐ ┌───────┐ ┌──────────────┐ + │ мост stgws │ │ WARP │ │ zapret │ + │ (раздел 8) │ │ │ │ │ + └─────────────┘ └───┬───┘ └──────┬───────┘ + ▼ ▼ + ┌───────────────────────────┐ ┌────────────────────────────────┐ + │ самый быстрый живой │ │ устройство в исключениях или │ + │ туннель │ │ трафик помечен «мимо zapret»? │ + │ упал → следующий │ │ да → как есть │ + │ упали все → напрямую, │ │ нет → первая подходящая │ + │ без туннеля │ │ стратегия сверху: │ + └───────────────────────────┘ │ Yv — YouTube │ + │ Dv — голос Discord │ + │ v / Flowseal — остальное │ + └────────────────────────────────┘ +``` + +--- + +## 10. Ограничения и оговорки + +- **Слабые роутеры.** Каждая проверка — отдельный процесс на 3–4 МБ памяти. На роутере меньше + 256 МБ проверки идут по 4 разом, а не по 8, поэтому подбор там дольше. На 128 МБ, где рядом + работают Steer, мост Telegram и DNS со списком ИИ-доменов, восемь разом доводили до + нехватки памяти. +- **Путь моста через WARP ещё не выпущен.** Шаги ② и ③ через WARP из раздела 8 есть в новой + сборке моста, а в выпущенном tgws 0.2.9 их нет. Там мост ходит только веб-сокетом, мимо + zapret. +- **Фоновое сравнение различает немного.** На тестовом роутере итоги лучших близких + стратегий разошлись на единицы или совпали вовсе: 137 и 137, дальше 135. Такая разница + близка к шуму, поэтому переключение требует строго большего итога и перепроверки сервисов. +- **Внешние списки.** Общий список целей, стратегии Flowseal и Yv, узлы dpi-detector, домены + ИИ-сервисов и наборы .srs приходят из чужих репозиториев. Их состав и числа меняются без + нашего участия. +- **Проверка идёт с роутера.** Автообход открывает сервисы запросами самого роутера. Путь + устройства в сети может отличаться: например, у устройства из исключений zapret. +- **Российская колония — только запас.** Выход у неё внутри страны, за теми же ТСПУ, что и + без туннеля: через неё не снимается ни геоблок, ни остальные блокировки, и мост Telegram + через неё не ходит.