lightweight-server/agents/codex/done/2026-10-23-home-de-egress.md
ochenstarik c213a89c13
All checks were successful
Bash syntax / syntax (push) Successful in 23s
Bash syntax / syntax (pull_request) Successful in 19s
docs: record home DE egress, failover and protected switch
2026-10-23 11:24:46 +00:00

130 lines
11 KiB
Markdown
Raw 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.

# Домашняя машина → 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).