Files
singbox_glue/docs/architecture.md
T

3.6 KiB
Raw Blame History

Архитектура

Границы ответственности

Hysteria2 URI содержит переносимые реквизиты: auth, hostname/ports, SNI, insecure, тип obfs и obfs password. Production HY2XS выдаёт Gecko URI.

policy.json хранит локальную инфраструктуру: eth0, eth1, TUN CIDR и MTU, route exclusions, таблицу 2022, marks, NFQUEUE, DNS, bandwidth и healthcheck. Renderer никогда не патчит старый JSON, а строит полный deterministic config из typed model.

Поток применения

URI + policy
    │
    ├─ strict validation
    ├─ exact 1.14.0 + build-tag gate
    ├─ renderer_1_14_0
    └─ sing-box check на private candidate
             │
      unchanged ───── changed
          │               │
          ▼               ├─ проверка provenance текущего config
       state.json         ├─ versioned last-good backup
                          ├─ atomic replace
                          ├─ systemctl restart
                          └─ bounded healthcheck

Первое применение после чистой установки не создаёт last-good: предыдущего управляемого конфига нет. При следующих изменениях backup разрешён только если SHA установленного config совпадает со state этого же релиза и sing-box 1.14.0.

Gecko и DNS

Renderer добавляет для Gecko min_packet_size=512 и max_packet_size=1200. Эти параметры являются частью локального HY2XS compatibility profile и не читаются из URI.

В sing-box 1.14.0 TUN по умолчанию использует dns_mode=hijack, что меняет настройки интерфейса и platform-level interception. Проект явно задаёт dns_mode=disabled и сохраняет собственное route action port 53 -> hijack-dns. Bootstrap UDP DNS привязан к eth0; remote DoH использует detour hy2-out.

Endpoint routing

Hysteria outbound хранит hostname и bind_interface=eth0, а его domain_resolver указывает на bootstrap DNS через eth0. Публичный IP сервера не добавляется в route_exclude_address; смена A-записи не требует изменения policy.

Файловая модель

/etc/vpn-egress/             root:root 0700
├── policy.json               root:root 0600
└── hysteria2.uri             root:root 0600

/var/lib/vpn-egress/         root:root 0700
├── state.json                без секретов, 0600
├── last-good.json            содержит secrets, 0600
├── last-good.meta.json       версия и SHA-256, 0600
└── backups/                  config + соседний .meta, 0700/0600

/etc/sing-box/config.json     root:root 0600

Metadata не обеспечивает доверие от root-компрометации. Её задача — исключить случайное смешивание релизов и повреждённых backup-файлов.

Граница установки

0.2.0 не содержит кода миграции 0.1.0. debian/preinst отклоняет in-place upgrade, а postinst отклоняет legacy policy/state или unmanaged /etc/sing-box/config.json. Same-release reinstall допускается, если state и config согласованы.