---
name: cehoproxy_overview
description: "CehoProxy — продукт КодоЦеха: выбранные приложения ходят в интернет только через VPN-туннель, остальная система не затронута; CLI + локальная веб-панель"
metadata: 
  node_type: memory
  type: project
  originSessionId: cf75944b-cc91-4988-aab6-28363391917a
  modified: 2026-08-07T10:20:20.287Z
---

**CehoProxy** (вырос из `~/Разработки/proxycage`) — изоляция ОТДЕЛЬНЫХ приложений в VPN-туннель на Windows. Ключевое требование владельца: **системный прокси включать нельзя** — на корп-серверах это запрещено, а смысл продукта именно в изоляции.

**Установка на тестовом ноуте (2026-08-07):** `C:\ProgramData\CehoProxy\` — `cehoproxy.exe` (self-contained .NET 8) + `sing-box.exe` + `config.json` + `singbox.json` (генерируемый). Автозапуск — задача планировщика `CehoProxy` (`-LogonType S4U -RunLevel Highest`, TUN требует админа). Ноут `192.168.0.101`, логин `Cebers_dev` без пароля, SSH по ключу.

**Архитектура:** `ProxyCage.Core` (кроссплатформенное ядро: парсинг подписки, `AppDetector`, `SingBoxConfigGenerator`, `TunCleanup`, `SingBoxProcess`, `WebServer`) + `ProxyCage.Cli` (`Ceho.cs` — ОДИН слой команд и для CLI, и для веб-панели, чтобы логика не разъехалась).

**Проверено живьём на Codex из Microsoft Store:** без защиты `verify` → 0 через туннель / 4 напрямую («ТЕЧЁТ»); с защитой → 7/0 («ИЗОЛИРОВАНО»). Одновременно: система на RU `5.18.232.68`, приложение через FI/DE/NL. `chatgpt.com` из туннеля 200, у системы 403.

**Изоляция по ПАПКЕ, а не по .exe** (решение владельца) — Electron/Chromium поднимает вспомогательные процессы с другими именами, правило по одному файлу их пропустит. `AppDetector` принимает и `.exe`, и папку: поднимается из служебных подпапок (`app`, `bin`, `resources`, `current`, `app-*`) к корню приложения и объясняет пользователю словами, что попадёт под правило.

**Ключевые решения по надёжности:**
- **Fail-closed:** трафик приложений идёт только в пул нод, `final: direct` только для ВСЕГО ОСТАЛЬНОГО. Нет живой ноды → соединения приложения рвутся, а не утекают напрямую.
- **Самолечение вместо graceful stop** — см. [[singbox_windows_tun_per_app]]. Корректного завершения может не случиться в принципе (краш, BSOD, питание), поэтому чистим призрачный WinTun ПЕРЕД стартом через `pnputil`.
- **Кэш подписки обновляется только годным ответом.** Страница-заглушка провайдера (бывает с кодом 200!) иначе затирает последнюю рабочую копию и продукт остаётся вообще без нод.
- **Версия MSIX в правило не попадает** — `OpenAI\.Codex_[^\\]*`, иначе после обновления приложения изоляция отвалится МОЛЧА.
- **`verify` доказывает изоляцию по живым соединениям приложения** (локальный адрес из подсети TUN), а не подкладыванием пробника: в `WindowsApps` писать нельзя, и пробник доказывал бы изоляцию пробника.

**Грабля: HttpClient с прокси на локальный mixed-инбаунд стабильно ловит таймаут** (и http-, и socks5-режим), при том что `curl.exe` тем же портом отвечает мгновенно. Не разбирались — пробы выхода и живости подписки делаются через `curl.exe` (есть во всех поддерживаемых Windows).

**Веб-панель** `http://127.0.0.1:<порт>` (порт настраивается, `cehoproxy set-port`). Режим **Operate**, не Persuade. Токены сняты с живого codoceh.ru: `--brand-ink #267354`/`#349f74`, `ok/warn/danger/info`, обе темы. Правила КодоЦеха соблюдены: теней нет, кикеров нет, цветного `border-left` нет, статусы токенами. **Работает без JavaScript** (формы POST+redirect) — панель управления сетью обязана открываться, когда что-то сломано. Скилл `taste` тут применён ЧАСТИЧНО и сознательно: он сам исключает админки/дашборды, взята только универсальная часть (типографика, цвет, dark mode, запрет em-dash и фейковых скриншотов).

**Ловушка UI, которую поймали:** индикатор горел красным во время ПЕРВОЙ пробы выхода — пользователь читает это как «сломано». Разведены состояния `wait` (жёлтый, проверяю) и `bad` (красный, ноды не отвечают) через флаг `Probed`.

**Протоколы (проверено конфигом, который принял `sing-box check`):** vless, vmess, trojan, shadowsocks, hysteria2, tuic. Парсер — `SubscriptionParser`, сборка outbound — `OutboundBuilder`. Гоча: **tuic несёт логин как `uuid:password`** в userinfo, без разделения sing-box падает на `invalid uuid`.

**Замер задержек врёт при поднятом TUN — и это не мелочь.** gvisor принимает TCP-соединение локально и рапортует успех, поэтому ЛЮБАЯ нода выглядит живой с задержкой 1-8 мс: NL показывался 5/5 живых, хотя нода, которую подписка сама метит «тех. работы», мертва (без TUN честно 4/5, задержки 12-127 мс). `NodeProbe.TunnelIsUp()` теперь блокирует замер и объясняет, что надо выключить защиту. У hysteria2/tuic задержка не меряется вовсе (они поверх UDP, TCP-проба соврёт) — помечаются «не измерено», а не «мертва».

**CLI — разговор, а не справочник (07.08.2026).** `chp` без аргументов показывает состояние в пять строк и спрашивает о том, чего не хватает; подписку проверяет сразу и печатает разбивку по странам; программы предлагает из найденных на машине, выбор номером. Команде без обязательного аргумента (`add-app`, `sub-remove`, `country`, `wrap`) можно не подсказывать — покажет список. Полный список команд — `chp help`. В скриптах и в службе (`Console.IsInputRedirected`) вопросов нет: прежний отказ и код возврата. Мастер — пять вопросов; порты ушли в умолчания, пароль спрашивается через «этим компьютером пользуется кто-то ещё?». Любое изменение настроек само пересобирает правила — помнить про `apply` больше не надо. Установка одной командой: `curl … | sudo sh` и `irm … | iex`, клавиатура берётся из `/dev/tty` (через трубу stdin занят).

**Ротация проверена живьём (2026-08-07).** Схема теста: активной ставится подписка с нодой на `203.0.113.7` (TEST-NET-3, RFC 5737 — маршрута туда нет by design), рядом живая. Демон поднимает туннель, проба выхода возвращает пусто, в логе `активная подписка переключена на <vlessi>`, туннель перезапускается и выход становится реальным (DE 103.75.127.102). Проверять надо именно так — сломанным выходом, а не подменой URL.

**hysteria2 проверен реальным трафиком**, не только `sing-box check`: нода нашего US VPS (`107.173.143.101:443`, sni `www.bing.com`, самоподписанный сертификат → `insecure=1`) отдала выход US/Buffalo/HostPapa. Параметры hy2-ноды лежат в `~/Services/singbox-google-tun/config.json` на mini.

**Продукт поставляется БЕЗ подписок** (требование владельца). Проверено: при пустом `CEHOPROXY_HOME` списки подписок и приложений пусты, папка не создаётся до первой настройки, захардкоженных ссылок в исходниках нет. Имя нашего провайдера утекало в плейсхолдер поля панели — убрано, там нейтральное «короткое имя». При правках следить, чтобы внутренние адреса не попадали в поставляемый UI.

**Подписка `subs.eu-fffast.com` (была в конфигах mini) мертва** — отдаёт 302 сама на себя при любом User-Agent.

**Продукт универсальный, без привязки к Codex.** Проверка живости подписки и решение о ротации шли по захардкоженному `chatgpt.com` — это неверно: «подписка жива» означает «доходит до того, что нужно ИМЕННО пользователю». Вынесено в `CehoConfig.CheckUrl` (дефолт `https://www.gstatic.com/generate_204`), настраивается в панели и переживает смену задачи. В коде Codex/OpenAI больше нет, в примерах комментариев — обезличенные `Publisher.App_1.2.3.4_x64__hash`.

**Предстартовая проверка `Preflight`** (требование владельца: никаких тупиков и невнятных ошибок). Смотрит права администратора, наличие `sing-box.exe` и `curl.exe`, запись в папку настроек, свободен ли порт панели, есть ли подписка и приложение. Каждая проблема — с готовым решением человеческим языком. Команда `cehoproxy doctor`, тот же блок в панели, и демон отказывается стартовать молча. Проверено на пустой установке: 3 блокера с подсказками; на занятом порту подсказывает готовую команду со следующим номером.
- **Гоча, поймана живьём:** проверка порта запускалась ПОСЛЕ того, как панель сама его занимала, видела собственный слушатель и блокировала запуск туннеля — классический тупик. Preflight теперь идёт ДО `web.Start()`, а панель не показывает свой же порт как проблему.
- Ветка «прав администратора нет» проверена только чтением кода: SSH-сессия на тестовой машине всегда elevated, `runas /trustlevel` не поддерживает перенаправление вывода, задача планировщика с `RunLevel Limited` вывода не дала.

**Состояние:** кроссплатформенно (см. [[cehoproxy_crossplatform_plan]]), опубликовано на GitHub (см. [[cehoproxy_github_publish]]). Непроверенным остаётся только TUN на macOS — нужен sudo владельца.

**Лицензия и публикация (итог на 08.08.2026):** исходники ОТКРЫТЫ, Apache 2.0, один публичный репозиторий `CodoCeh/CehoProxy` (историю опубликовали одним коммитом, приватный `CehoProxy-source` заброшен). Промежуточный вариант с закрытым исходником и собственным соглашением отменён владельцем. Подробности — [[cehoproxy_two_repos]].

**Аудит 08.08.2026, версия 1.1.3.** Главное найденное: подписку качали браузерным User-Agent, и панель подписки отдавала веб-страницу вместо нод — отсюда жалоба «ссылка рабочая, а софт говорит, нод нет», разбор в [[cehoproxy_subscription_user_agent]]. Ещё: защита на старте ждала загрузки подписки до минуты (теперь поднимается на кэше), демон молчал о том, включилась ли защита, и не замечал ушедший движок. Проверено на чистой lima-машине: установка одной командой из релиза, DNS машины цел, неизолированный процесс идёт напрямую, изолированный без нод остаётся без сети, удаление не оставляет следов.

Связано: [[cehoproxy_subscription_formats]], [[cehoproxy_country_detection]], [[cehoproxy_alias_process_name]], [[singbox_windows_tun_per_app]], [[openai_403_needs_browser_headers]], [[proxycage_overview]], [[kodoceh_semantic_state_palette]].
