From 278bcced956e3bda0d4bfa08e63c6b8f37e717d2 Mon Sep 17 00:00:00 2001 From: xah30 Date: Wed, 27 May 2026 11:11:07 +0300 Subject: [PATCH] =?UTF-8?q?docs(deployment):=20reflect=20v2=20state=20?= =?UTF-8?q?=E2=80=94=20resolved=20limitations=20+=20remaining=20ones?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit §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 --- docs/deployment.md | 76 +++++++++++++++++++++++++++++++++------------- 1 file changed, 55 insertions(+), 21 deletions(-) diff --git a/docs/deployment.md b/docs/deployment.md index 652fbe3..1b759b4 100644 --- a/docs/deployment.md +++ b/docs/deployment.md @@ -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`, читает с 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).