083c441e4c
- docs/protocol.md, pki.md, split-tunnel.md, sing-box.md переведены на русский и сверены с текущим кодом (транспорт v2: свой UDP + TCP/443 + QUIC fallback, handover; PKI; split-tunnel; sing-box-план). - docs/deployment.md (новый, 369 строк): пошаговое руководство для удалённого сервера — сборка, PKI init/issue-server/issue-client (проверено бинарём), server.toml/client.toml на основе фактических config/*.example, firewall + NAT/IP-форвардинг, sudo-запуск, бандл клиента (ca.crt + client.crt + client.key + server addr/sni), на каком транспорте идёт трафик, ограничения v1. - README.md (новый, корень): краткий обзор + таблица крейтов + быстрый старт. Всё на русском (проза); команды/идентификаторы/конфиги — как есть. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
81 lines
6.9 KiB
Markdown
81 lines
6.9 KiB
Markdown
# Интеграция AuraVPN с sing-box (план)
|
||
|
||
Цель: дать клиенту на телефоне, работающему под **sing-box**, возможность подключиться к серверу
|
||
Aura по протоколу **AuraVPN** (это собственное туннелирование Aura, не сторонний протокол). Это
|
||
короткая заметка о том, *как* это сделать; сам wire-протокол, который должна повторять реализация,
|
||
полностью описан в [`protocol.md`](protocol.md).
|
||
|
||
sing-box написан на Go, и в нём нет универсального плагина «загрузить произвольный внешний wire-
|
||
протокол», поэтому интеграция означает дать sing-box Go-реализацию (или мост) протокола Aura. Три
|
||
реалистичных пути, от самого дешёвого:
|
||
|
||
## Option A — Process bridge (быстрее всего, для десктопа/сервера)
|
||
|
||
Запустить существующий Rust-клиент `aura` как локальный процесс и выставить локальный
|
||
прокси/TUN, а затем направить sing-box на него:
|
||
|
||
- `aura client` уже создаёт TUN и направляет туда трафик через туннель Aura; sing-box может
|
||
заворачивать выбранный трафик в этот интерфейс, **или**
|
||
- добавить в `aura-cli` локальный **SOCKS5 inbound** (небольшое дополнение) и настроить в
|
||
sing-box `socks` outbound на `127.0.0.1:<port>`.
|
||
|
||
Плюсы: переиспользует прошедшую аудит Rust-сердцевину дословно; нет переписывания криптографии.
|
||
Минусы: два процесса; плохо ложится на мобильные платформы (мобильные приложения sing-box
|
||
встраивают ядро и не умеют легко запускать вспомогательные процессы).
|
||
|
||
## Option B — Нативный Go-outbound/inbound (целевой путь для телефонов)
|
||
|
||
Реализовать протокол AuraVPN на Go нативно и зарегистрировать его как sing-box **outbound**
|
||
(клиент) и **inbound** (сервер), чтобы встроенное в телефон ядро sing-box само говорило на
|
||
AuraVPN. Это чистый, производительный и mobile-friendly путь. Криптография чисто ложится на
|
||
существующие Go-библиотеки:
|
||
|
||
| Компонент Aura | Rust-крейт | Эквивалент в Go |
|
||
|--------------------------------|---------------------|---------------------------------------------------------|
|
||
| X25519 ECDH | `x25519-dalek` | `crypto/ecdh` (stdlib) |
|
||
| ML-KEM-768 (FIPS 203) | `ml-kem` | `crypto/mlkem` (Go 1.24+) или `cloudflare/circl` |
|
||
| ChaCha20-Poly1305 | `chacha20poly1305` | `golang.org/x/crypto/chacha20poly1305` |
|
||
| HKDF-SHA256 | `hkdf` | `golang.org/x/crypto/hkdf` |
|
||
| HMAC-SHA256 (Finished) | `hmac` | `crypto/hmac` + `crypto/sha256` |
|
||
| ECDSA P-256 signatures (cert) | `ring` | `crypto/ecdsa` + `crypto/x509` |
|
||
| X.509 verify + CRL | `rustls-webpki` | `crypto/x509` |
|
||
|
||
Что Go-код должен повторить **в точности** (см. `protocol.md`):
|
||
|
||
- 5-байтный заголовок кадра: `msg_type(1) || len(u24 BE) || version=0x01`.
|
||
- Порядок рукопожатия `CH → SH → ServerAuth → ClientAuth → Finished(c→s) → Finished(s→c)`;
|
||
транскрипт = `SHA-256(ClientHello_frame || ServerHello_frame)`; подпись ECDSA-P256/SHA-256 по
|
||
транскрипту; Finished — HMAC-SHA256.
|
||
- Гибридный общий секрет = `x25519_ss || mlkem_ss`; salt HKDF = `client_nonce || server_nonce`,
|
||
info = `b"aura-v1-session"`.
|
||
- Запись данных (datagram/UDP) = `seq(8 BE) || ChaCha20Poly1305(frame, aad = seq)`, nonce =
|
||
`LE(seq) || 0x00000000`; окно anti-replay — 64. (Stream/TCP-запись дополнительно включает
|
||
5-байтный заголовок в AAD.)
|
||
- Выбор транспорта: UDP (тип-байт `0x01` HS / `0x02` DATA) как основной; TCP/443 и QUIC как
|
||
fallback.
|
||
|
||
Чтобы снизить риск порта в Go, экспортируйте со стороны Rust **known-answer test vectors**
|
||
(захваченный транскрипт рукопожатия + производные ключи + запечатанная запись данных) и
|
||
утверждайте, что Go-реализация воспроизводит их побайтово. KAT для ML-KEM уже лежит в
|
||
`aura-crypto/tests/kat_kyber.rs`.
|
||
|
||
## Option C — Rust core через cgo (`cdylib`)
|
||
|
||
Скомпилировать Rust-сердцевину Aura в C-ABI shared library и вызывать её из тонкого Go-shim'а
|
||
sing-box через cgo. Переиспользует прошедшую аудит крипто/рукопожатие без Go-переписывания, но
|
||
cgo плюс упаковка под каждую платформу (Android/iOS) — занудно и усложняет чисто-Go-сборку
|
||
sing-box.
|
||
|
||
## Рекомендация
|
||
|
||
- **Сейчас:** Option A (process bridge) для валидации на десктопе/сервере — минимум работы,
|
||
настоящий протокол.
|
||
- **Для телефона:** Option B (нативный Go-outbound), написанный по `protocol.md` + по
|
||
экспортированным из Rust тест-векторам. Это единственный вариант, который хорошо ложится на
|
||
встроенное мобильное ядро sing-box.
|
||
- Держите `protocol.md` единственным источником истины и версионируйте wire-протокол (заголовок
|
||
уже несёт `version = 0x01`), чтобы Rust- и Go-реализации шли в ногу.
|
||
|
||
> Статус: это проектная заметка. Go-кода и sing-box-модуля пока **нет** — это отдельный
|
||
> deliverable, поставленный в план после стабилизации Rust-транспорта.
|