Files
xah30 083c441e4c docs: rewrite all documentation in Russian + add deployment guide
- 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>
2026-05-26 10:42:08 +03:00

81 lines
6.9 KiB
Markdown
Raw Permalink 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.
# Интеграция 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-транспорта.