diff --git a/agents/codex/done/2026-10-23-home-de-egress.md b/agents/codex/done/2026-10-23-home-de-egress.md new file mode 100644 index 0000000..8096f73 --- /dev/null +++ b/agents/codex/done/2026-10-23-home-de-egress.md @@ -0,0 +1,130 @@ +# Домашняя машина → DE:443: проверка и переключение + +Дата: 23.10.2026, Asia/Novosibirsk. Задание: актуальная редакция +`CODEX-home-xray-via-ru.md`, основной выход напрямую DE, семья через RU отдельно. + +**Операционная приёмка: PASS.** Рабочий `xray-vpn` использует `de-direct`, существующий +выход сохранён резервом. Переключение на резерв и возврат на DE проверены настоящей +60-секундной блокировкой транспорта DE. Этот PR содержит только отчёт; его CI и +разрешённое независимое ревью нужны отдельно и не заменяются операционной проверкой. + +## Сохранённая конфигурация + +- Все три исходных inbound сохранены побайтно эквивалентными JSON-значениями: + локальные SOCKS 10818, HTTP 10819 и transparent 12345. Исходный DNS не изменён; + отдельных правил маршрутизации до работы не было. +- Добавлены `de-direct` и балансировщик `home-de-primary`: `leastPing` выбирает + наблюдаемый DE, `fallbackTag` указывает на `home-reserve-current`. Это исходный + единственный VLESS outbound с прежними настройками и socket mark 255. Другие + несуществующие в исходном конфиге DK/FI профили не создавались. +- Первый loopback outbound возвращает запрос в routing под отдельным inbound tag; + только этот tag направлен в балансировщик. Observatory проверяет DE и резерв + через HTTPS generate_204, интервал 5 секунд. Конфиг проверен установленным + Xray 26.3.27; бинарник не обновлялся. +- В активный `bypass4` добавлен DE, тот же элемент записан в startup script. + Финальная проверка подтвердила, что единственная разница startup script — это + добавление DE. Прежние элементы, включая RU, сохранены. Адрес существующего + резервного outbound в bypass не входил; его прежний socket mark 255 сохранён, + обход перехвата и работоспособность подтверждены испытанием резерва. Других + изменений общего firewall или маршрутов не делалось. +- Приватные адреса, UUID, Reality keys и URI в отчёт не включены. Серверы FI/DK + не посещались и не менялись; на DE выполнена только проверка состояния клиента + и отсутствия лимитов. Серверная конфигурация этой задачей не изменена. + +## Устранение нестабильности перед переключением + +Прямые TCP-соединения к DE:443 проходили 8/8 через физический интерфейс. При этом +временный VLESS-клиент с Chrome fingerprint давал таймауты, особенно при семи +одновременных HTTPS-запросах; балансировщик мог уходить на резерв. В сравнительном +тесте Firefox fingerprint выполнил те же запросы без таймаутов. Firefox оставлен +только в новом локальном outbound. Настройки серверного клиента и исходный файл +с URI не переписывались. + +Это подтверждённое различие поведения TLS-профилей в текущей сети; конкретное +сетевое устройство или механизм, вызвавший таймаут Chrome, не локализован. +С Firefox до переключения прошли три полных цикла через временный балансировщик, +каждый с внешним выходом DE. Старый системный Xray при этих тестах продолжал работать. + +## Проверки доступности + +Все строки ниже: curl exit 0, обычная проверка TLS включена. Системные проверки +выполнялись без переменных proxy и без SSH-туннеля. + +| Сервис | Старый системный путь | Временный DE, 3 цикла | Новый системный DE | Резерв при блокировке | После возврата DE | +|---|---:|---:|---:|---:|---:| +| api.anthropic.com/v1/models | 401 | 401 | 401 | 401 | 401 | +| api.openai.com/v1/models | 401 | 401 | 401 | 401 | 401 | +| chatgpt.com | 403 | 403 | 403 | 403 | 403 | +| github.com | 200 | 200 | 200 | 200 | 200 | +| git.ochenstarik.ru | 200 | 200 | 200 | 200 | 200 | +| api.telegram.org | 302 | 302 | 302 | 302 | 302 | +| Yandex Internet IP API | 200 | 200 | 200 | 200 | 200 | + +401 — ожидаемый ответ API без ключа, не проверка авторизованного inference. +ChatGPT вернул тот же HTTP 403, что до изменения; признаков country-block в +ответе не обнаружено. Успешный вход или работа веб-сессии ChatGPT этим тестом +не подтверждаются. Telegram проверен HTTP-запросом, сообщения/OTP не отправлялись. + +Внешний IP нового системного пути совпал с DE; сохранённые SOCKS и HTTP также +дали DE. Настоящий `git ls-remote` от владельца к lightweight-server завершился +успешно. Оба сервиса active и enabled. Текущая сессия Codex продолжила работу. + +## Откат и реальный отказ + +Перед заменой конфига сохранена root-only копия и включён независимый +`systemd-run --on-active=3min`, восстанавливающий исходный конфиг и перезапускающий +Xray, если приёмка не подтверждена. Подтверждение и callback синхронизированы +блокировкой; принятый конфиг проверяется по SHA перед отменой таймера. + +Первая попытка вернула старый конфиг: проверка синтаксиса собственного nft fault +script не прошла. Также выявлено, что обычный restart требуемого Xray вызывает +перезапуск зависимого xray-transparent. Это фактическое отклонение первой попытки, +а не утверждение о неизменности сервиса на протяжении всей работы. Оба сервиса +восстановились. Затем синтаксис nft был проверен до переключения; применён +административный restart с `--job-mode=ignore-dependencies`, без изменения unit-файлов. +В финальной попытке timestamp активации transparent остался прежним. + +После положительных системных проверок независимый 60-секундный таймер удаления +был включён до добавления отдельной nft-таблицы. Правило блокировало только +исходящий TCP443 к DE, то есть VPN transport; SSH-порты не блокировались. +Внешний выход совпал с сохранённым исходным резервным выходом, вся матрица ответила. +Таблица автоматически исчезла, затем внешний выход снова совпал с DE и матрица +повторно прошла. Финальная попытка заняла 74,4 секунды. Только после этого отменён +трёхминутный откат. Финальный аудит не нашёл ни одной fault-таблицы; собственные +таймеры остановлены, новых мониторов не создано. + +## Права и доказательства + +| Файл в /etc/xray | Владелец | Режим после работы | +|---|---|---| +| config.json | root:root | 0600 | +| config.json.bak-fi-20261016 | root:root | 0600 | +| config.json.pre-transparent | root:root | 0600 | + +Каталог резервных копий `/root/codex-home-de-20261023` имеет 0700, все файлы внутри +0600. Там хранятся исходный конфиг, startup script, nft snapshot и закрытые журналы. +Хэш итогового конфига: +`251ee155b45b262c5a1daff2186d78278bf23244520bee1faacdd292d89fc316`. + +Санитизированные доказательства владельца: +`/home/ochenstarik/.codex/reports/home-de-20261023/`. +Финальный `final-proof.json` SHA256: +`122499e03f818e48a48d8f49505f480101f26cc44d03611de7c729c19686a750`. +Включает матрицы, приёмку, откат, резерв, failback, stat и проверки инвариантов. +Дополнительные файлы сохраняют неуспешные промежуточные проверки, не подменяя их PASS. + +## При ближайшей перезагрузке владельцем + +Машина этой задачей не перезагружалась. + +1. Проверить active/enabled у xray-vpn и xray-transparent. +2. Проверить наличие DE и прежнего RU в bypass4; не публиковать значения. +3. Проверить внешний выход DE системным запросом и через оба прежних proxy-входа. +4. Проверить Forgejo/git и используемые API; убедиться, что конфиги остались root:root 0600. +5. При проблеме при владельце и через pkexec восстановить root-only original.json, + перезапустить только xray-vpn с ignore-dependencies и проверить старый выход. + +Основания схемы: [Xray routing](https://xtls.github.io/en/config/routing.html), +[loopback](https://xtls.github.io/en/config/outbounds/loopback.html), +[observatory](https://xtls.github.io/en/config/observatory.html), +[systemctl job mode](https://www.freedesktop.org/software/systemd/man/latest/systemctl.html).