docs(deployment): reflect v2 state — resolved limitations + remaining ones

§5: TCP/443 fallback now described as real outer TLS-443 (was the lighter
HTTP/1.1 masquerade in v1).

§6 rewritten "Честные ограничения v1" -> "v2 — что устранено и что остаётся":
- Resolved: UDP multi-client demux, server IP pool + per-client routing,
  OS-level split-tunnel (no more send_direct stub), real TLS-443, auto-NAT,
  privilege drop, Windows admin named pipe, daily protocol-mask rotation
  at 05:00 MSK.
- Remaining honest limits: TUN creation still needs root (privilege drop
  shrinks the window), IPv6 in OS routes / iptables not yet, Windows OS
  routes stubbed, CRL still out-of-band (in-band push deferred), native
  phone client via sing-box still a plan, no auto-detect of egress iface.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
xah30
2026-05-27 11:11:07 +03:00
parent 65b26b555d
commit 278bcced95
+55 -21
View File
@@ -337,8 +337,9 @@ aura status
- `0x01` HS — рукопожатие с надёжным DTLS-подобным слоем поверх (повторы, ack, упорядочивание);
- `0x02` DATA — датаграммы данных с explicit-nonce AEAD; обфускация = паддинг до «корзин»
HTTPS (`[64, 128, 256, 512, 1024, 1280, 1460]`).
- **Fallback TCP/443**: то же рукопожатие поверх TCP. Опциональная HTTP/1.1-преамбула как лёгкая
маскировка (`masquerade = true`).
- **Fallback TCP/443**: настоящий **outer TLS-443** (rustls) поверх TCP — на проводе неотличимо
от валидного HTTPS, ALPN `[h2, http/1.1]`. Внутри TLS — тот же Aura-handshake. Клиент
использует `AcceptAnyServerCert` (security гарантирует только внутренний Aura-handshake).
- **Fallback QUIC**: внешний TLS-камуфляж под HTTP/3 + внутреннее Aura-рукопожатие.
- Клиент пробует транспорты по `order`, переключается при отказе или таймауте подключения
(по умолчанию 8 с). Сервер слушает все включённые транспорты одновременно (`MultiServer`).
@@ -347,23 +348,56 @@ aura status
---
## 6. Честные ограничения v1
## 6. v2 — что устранено и что остаётся
- **TUN требует root.** И клиент, и сервер создают TUN; на macOS имя интерфейса (`utunN`)
назначается системой.
- **NAT/IP-форвардинг на сервере настраивается вручную.** Бинарь Aura сам ничего не правит в
netfilter/sysctl.
- **Сервер v1 — это один общий TUN.** UDP-транспорт обслуживает **одного пира на `accept`**: первый
HS-датаграмма фиксирует адрес источника, и дальнейшая сессия привязывается к нему. Для нескольких
клиентов одновременно лучше использовать TCP или QUIC (`MultiServer` принимает соединения из
любого включённого транспорта).
- **`send_direct` — заглушка.** Пакеты с действием `DIRECT` пишутся в trace-лог и отбрасываются;
настоящего raw-socket egress в v1 нет (см. [`split-tunnel.md`](split-tunnel.md)).
- **TCP-маскировка лёгкая.** Это минимальная HTTP/1.1-преамбула, а не полноценный TLS-443
(полноценный план — в дорожной карте).
- **Нативного Go-модуля sing-box ещё нет.** В качестве моста — Option A из
[`sing-box.md`](sing-box.md) (process bridge через `aura client`). Нативный Go-outbound
(Option B) — план.
- **CRL не подписан** (плоское множество идентификаторов на диске) и распространяется вне
протокола; автоматической ротации листов нет (срок действия 365 дней, см. [`pki.md`](pki.md)).
- **Admin-сокет — только под Unix.** На Windows — `cfg`-заглушка.
### Устранено в v2 (по сравнению с v1)
- **Мульти-клиент UDP-сервер.** `UdpServer` теперь демультиплексирует датаграммы по адресу
пира: один сокет обслуживает много клиентов параллельно, каждый со своим `ReliableHsAdapter` и
своим `UdpConnection`. `MultiServer::accept` выдаёт по соединению на каждого нового клиента
(в любом из включённых транспортов).
-**IP-пул + per-client маршрутизация на сервере.** Новая секция `[server.pool]`
(`cidr`, `strategy`, `static`) выдаёт каждому клиенту IP при accept; `ServerRouter` держит
карту `client_ip → Arc<dyn PacketConnection>`, читает с TUN, диспатчит пакеты по `dst_ip` в
нужное подключение, а параллельные per-conn-задачи пишут входящий трафик обратно в TUN.
- **`send_direct` устранён.** Новое `[tunnel.os_routes]` (по умолчанию `enabled = true`)
программирует **системную таблицу маршрутов**: DIRECT-цели идут мимо TUN через изначальный
default-gateway, через TUN попадает только VPN-трафик. RAII-guard откатывает все добавленные
маршруты при остановке клиента.
-**Настоящий TLS-443 в TCP-транспорте.** Вместо лёгкой HTTP/1.1-преамбулы — полный outer
rustls handshake (ALPN `[h2, http/1.1]`); клиент с `AcceptAnyServerCert`, поэтому SNI на
внешнем слое не верифицируется (это камуфляж), а вся реальная аутентификация — внутри
Aura-рукопожатия. На проводе неотличимо от валидного HTTPS.
-**Авто-NAT на сервере.** `[server.nat] {auto, egress_iface, dry_run}` поднимает
IP-форвардинг + MASQUERADE на старте (Linux: `sysctl ip_forward` + `iptables -t nat
MASQUERADE`; macOS: `sysctl ip.forwarding` + `pfctl`). RAII-guard откатывает изменения при
остановке. Опциональный `dry_run = true` логирует команды без выполнения — для отладки.
-**Privilege drop.** `[server]/[client] run_as = "nobody"` — после поднятия TUN и
привилегированных портов euid/gid сбрасываются в нерутового пользователя (Linux:
`setresuid/setresgid`; macOS: `setgid` + `setuid` permanent drop). Минимизирует время
процесса под root.
-**Admin-сокет на Windows.** Cfg-gated транспорт: на Unix — Unix socket
(`/tmp/aura-admin.sock`), на Windows — Tokio named pipe (`\\.\pipe\aura-admin`).
JSON-протокол и команды (`route add/list/remove`, `status`) идентичны.
-**НОВОЕ: ежедневная ротация масок в 05:00 МСК.** Внешний фингерпринт (SNI/UA/Server-
header/UDP padding-профиль) детерминированно меняется раз в сутки. И сервер, и клиент
выводят одинаковый `MaskSet` из общего seed (SHA-256 от CA-сертификата) + UTC-даты через
HKDF-SHA256, без сетевой координации. Конфиг: `[transport.masks] enabled = true` (по
умолчанию). Новые подключения берут текущую маску; уже установленные остаются на своих.
Палитры: 16 SNI, 10 User-Agent, 5 Server-headers, 4 padding-профиля; профиль 0 байт-в-байт
совместим с v1-паддингом (бэк-совместимость).
### Остающиеся честные ограничения v2
- **TUN всё ещё требует root** для **создания** интерфейса (это OS-уровень). Privilege drop
минимизирует окно работы под root, но саму операцию обойти нельзя.
- **IPv6 в OS-маршрутах и iptables MASQUERADE** не реализован — только IPv4 (план v3).
- **Windows OS-маршруты** — заглушка с лог-warning (план v3). Windows admin pipe **работает**.
- **CRL** пока распространяется out-of-band (плоский файл `revoked.crl` на сервере и клиенте);
in-band пуш сервером → клиенту запланирован (отдельная v2-задача, не реализована в этом
раунде).
- **Нативного Go-клиента для телефона нет** — через sing-box (Option B нативный Go-outbound,
по `protocol.md` + KAT из Rust, см. [`sing-box.md`](sing-box.md)). Сейчас доступен только
десктоп-клиент / process-bridge.
- **Автоопределение egress-интерфейса** для NAT не реализовано: `[server.nat] egress_iface`
обязательно задавать вручную, если `auto = true` (план v3).