Files
AuraVPN/docs/deployment.md
T
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

18 KiB
Raw Blame History

Развёртывание Aura VPN

Этот документ — пошаговое руководство, по которому вы поднимаете сервер Aura на удалённой машине, провижините на нём сертификат для клиента и подключаете клиент (десктоп) к этому серверу. Все команды и поля конфигов взяты из фактического кода и поставляемых примеров в config/.

Полезные сопутствующие документы: protocol.md (wire-протокол), pki.md (CA и сертификаты), split-tunnel.md (правила маршрутизации), sing-box.md (интеграция с sing-box, план).


1. Обзор схемы

Сервер Aura на удалённой машине провижинит сертификат для клиента (десктопа или, в будущем, телефона через sing-box), отдаёт клиенту бандл сертификатов и трастового якоря, и клиент подключается к серверу по протоколу AuraVPN.

На проводе по умолчанию используется собственный UDP-транспорт Aura с пост-квантовой криптографией (без QUIC и без внешнего TLS на основном пути); fallback'и — это TCP/443 и QUIC. Всё рукопожатие пост-квантовое: гибридное X25519 + ML-KEM-768 с взаимной X.509-аутентификацией. Для данных используется AEAD ChaCha20-Poly1305 с explicit-nonce. Обфускация — это паддинг датаграмм до «корзин» размера, характерных для HTTPS.

       [клиент-десктоп]                         [удалённый сервер aura]
   client.toml + PEM-бандл           server.toml + PKI (CA + server leaf)
            |                                       |
            |  UDP (основной) / TCP/443 / QUIC      |
            |  гибридное PQ-рукопожатие             |
            |  ChaCha20-Poly1305                    |
            +--------------------------------------->
                          AuraVPN

2. Сервер (удалённый хост)

2.1. Установка бинаря

В корне репозитория:

cargo build --release
# -> target/release/aura

Скопируйте получившийся бинарь target/release/aura на сервер (например в /usr/local/bin/aura) либо соберите его прямо на сервере (требуется Rust toolchain).

2.2. Поднять PKI

Эти три команды создают CA и выпускают листовые сертификаты для сервера и клиента. Все они проверены против реализации в crates/aura-pki/src/{ca,cert,store}.rs и crates/aura-cli/src/pki.rs.

# 1) Создать CA Aura.
aura pki init --ca-name "Aura Root CA" --out /etc/aura/pki
#   -> /etc/aura/pki/ca.crt
#   -> /etc/aura/pki/ca.key   # секрет, защищайте правами файловой системы

# 2) Выпустить сертификат сервера. --domain должен совпадать с тем именем,
# которое клиент будет ожидать в [client] sni (это же имя проверяется по SAN).
aura pki issue-server \
    --domain vpn.example.com \
    --out   /etc/aura/pki/server \
    --ca    /etc/aura/pki
#   -> /etc/aura/pki/server/server.crt
#   -> /etc/aura/pki/server/server.key   # секрет

# 3) Выпустить сертификат клиента (по одному на устройство).
# --id становится Common Name'ом и проверенным peer_id, который видит сервер.
aura pki issue-client \
    --id  phone-1 \
    --out /etc/aura/clients/phone-1 \
    --ca  /etc/aura/pki
#   -> /etc/aura/clients/phone-1/client.crt
#   -> /etc/aura/clients/phone-1/client.key   # секрет

Подробности (включая aura pki revoke / list) — см. pki.md.

2.3. server.toml

Раскладка ниже взята из config/server.toml.example и поставляемых serde-структур (crates/aura-cli/src/config.rs). Скопируйте пример и поправьте под себя.

[server]
# Человекочитаемое имя (также внутренняя identity сервера в рукопожатии).
name = "aura-edge-1"
# UDP/TCP listen-сокет. ":443" мимикрирует под HTTPS; для его биндинга нужны привилегии.
# IP отсюда переиспользуется как listen-IP для каждого включённого транспорта.
listen = "0.0.0.0:443"
# Число accept-воркеров (в v1 носит совещательный характер).
workers = 4

[pki]
# Trust anchor (Aura CA) и листовая пара сервера, все PEM.
ca_cert = "/etc/aura/pki/ca.crt"
cert    = "/etc/aura/pki/server/server.crt"
key     = "/etc/aura/pki/server/server.key"

[tunnel]
# Адресный пул для клиентов; в v1 на сервере один общий TUN в этой сети.
pool_cidr = "10.7.0.0/24"
# MTU TUN-устройства (запас под QUIC + framing Aura).
mtu = 1420
# DNS, анонсируемый клиентам (в v1 информационно).
dns = "10.7.0.1"

[mimicry]
# Hostname, под который мимикрирует внешний TLS-слой (для QUIC).
sni = "cdn.example.com"
# Паддинг для размытия размеров пакетов под «корзины» HTTPS.
padding = true

[transport]
# Набор и порядок транспортов, биндящихся одновременно. UDP — основной; TCP/443 и
# QUIC (мимикрия H3) — fallback'и. При отсутствии всей секции включаются udp/tcp/quic
# на 443/443/444.
order = ["udp", "tcp", "quic"]
# UDP-транспорт и QUIC оба используют UDP, поэтому udp_port и quic_port ДОЛЖНЫ
# различаться. TCP может занимать тот же номер порта (другой протокол).
udp_port  = 443
tcp_port  = 443
quic_port = 444
# UDP: дополнять датаграммы до «корзин» размера HTTPS, чтобы размыть распределение размеров.
obfuscate = true
# TCP: добавлять минимальный HTTP/1.1-преамбулу (Host = [mimicry] sni), чтобы открытие
# выглядело как обычный HTTP.
masquerade = true

Пути могут начинаться с ~ (раскрывается в домашнюю директорию).

2.4. Сеть на сервере

Файрвол

Откройте те порты, которые перечислены у вас в [transport]. С приведённой выше конфигурацией:

  • UDP 443 — основной транспорт Aura.
  • TCP 443 — fallback Aura поверх TCP.
  • UDP 444 — fallback Aura поверх QUIC.

Важно: UDP-транспорт и QUIC — это оба UDP, поэтому их порты обязательно должны различаться (в примере: udp_port=443, quic_port=444). Конфиг-валидатор transport.modes() отвергает совпадение.

IP-форвардинг и NAT (для выхода клиентов в интернет)

В v1 настройка egress на стороне сервера — обязательный ручной шаг. На Linux:

# 1) Включить IP-форвардинг.
sudo sysctl -w net.ipv4.ip_forward=1
# (для постоянства добавьте в /etc/sysctl.conf или /etc/sysctl.d/*)

# 2) MASQUERADE для исходящего трафика клиентов на интернет-интерфейсе (например eth0).
sudo iptables -t nat -A POSTROUTING \
    -s 10.7.0.0/24 \
    -o eth0 \
    -j MASQUERADE

Подставьте свой pool_cidr и имя интернет-интерфейса.

2.5. Запуск сервера

sudo aura server --config /etc/aura/server.toml

sudo нужен для создания TUN-устройства и для биндинга привилегированных портов (:443).

Можно опционально указать путь admin-сокета:

sudo aura server \
    --config       /etc/aura/server.toml \
    --admin-socket /var/run/aura-admin.sock

По умолчанию admin-сокет — /tmp/aura-admin.sock.


3. Что вы получаете для клиента (бандл)

Отдайте клиенту три PEM-файла:

  • ca.crt (из /etc/aura/pki/ca.crt) — trust anchor;
  • client.crt (из /etc/aura/clients/<id>/client.crt) — листовой сертификат клиента;
  • client.key (из /etc/aura/clients/<id>/client.key) — секрет, приватный ключ клиента.

И сообщите ему два параметра:

  • Адрес сервера (например 203.0.113.10).
  • sni — то DNS-имя, которое вы указали в aura pki issue-server --domain. Оно же ожидается в SAN серверного сертификата и проверяется в verify_server_cert.

Эти три файла плюс два параметра — это всё, что нужно клиенту для подключения.


4. Клиент (десктоп)

Путь для телефона — через sing-box; пока нативного клиента нет, см. раздел 6 ниже.

4.1. client.toml

Раскладка взята из config/client.toml.example и crates/aura-cli/src/config.rs.

[client]
# Человекочитаемое имя/id клиента.
name = "laptop"
# UDP-сокет сервера. IP отсюда переиспользуется как server-IP для каждого транспорта.
server_addr = "203.0.113.10:443"
# Внешний TLS-SNI (hostname-камуфляж), предъявляемый серверу. Он же проверяется
# внутри рукопожатия Aura против SAN серверного сертификата.
sni = "cdn.example.com"

[pki]
# Trust anchor (Aura CA) и листовая пара клиента, все PEM.
ca_cert = "~/.aura/ca.crt"
cert    = "~/.aura/client.crt"
key     = "~/.aura/client.key"

[tunnel]
# Запрошенное имя TUN-интерфейса (на macOS совещательно — ядро назначает utunN).
tun_name = "aura0"
# Локальный адрес для TUN и длина префикса.
local_ip = "10.7.0.2"
prefix   = 24
# MTU TUN.
mtu = 1420
# DNS, используемый туннельным резолвером (в v1 информационно; реально используется
# системный резолвер).
dns = "10.7.0.1"

# Split-tunnel: действие по умолчанию плюс точечные правила.
[tunnel.split]
default = "VPN"

[[tunnel.split.direct]]
cidr = "192.168.0.0/16"

[[tunnel.split.direct]]
cidr = "10.0.0.0/8"

[[tunnel.split.direct]]
domain = "intranet.example.com"

# Более узкий префикс возвращает поддиапазон обратно в VPN (longest-prefix бьёт /8).
[[tunnel.split.vpn]]
cidr = "10.7.0.0/24"

[mimicry]
padding = false

[transport]
# Порядок fallback'а (handover), пробуется слева направо: первый удавшийся побеждает.
# При отсутствии всей секции — ["udp","tcp","quic"] на 443/443/444.
order = ["udp", "tcp", "quic"]
udp_port  = 443
tcp_port  = 443
quic_port = 444
obfuscate = true
masquerade = true

Подробности про [tunnel.split] — в split-tunnel.md.

4.2. Запуск клиента

sudo aura client --config client.toml

sudo нужен для поднятия TUN-устройства. Клиент:

  1. Загружает PEM-файлы из [pki] и строит aura_proto::ClientConfig.
  2. Строит таблицу маршрутизации из [tunnel.split].
  3. Дозванивается до сервера, перебирая транспорты в [transport] order (handover UDP → TCP → QUIC); первый, который удался, побеждает.
  4. Разрезолвит доменные правила split-tunnel'а в host-маршруты (best-effort).
  5. Создаёт TUN, передаёт его маршрутизатору и начинает гонять трафик.

В логе при успехе вы увидите строку с выбранным транспортом:

INFO connected and authenticated to server peer=Some("cdn.example.com") mode=udp

mode принимает значения udp, tcp или quic.

4.3. Управление на лету

После запуска клиента (или сервера) admin-сокет позволяет менять правила и смотреть статус без перезапуска:

# Добавить CIDR на лету.
aura route add --cidr 8.8.8.0/24 --action direct

# Завернуть домен через VPN.
aura route add --domain example.com --action vpn

# Перечислить правила.
aura route list

# Удалить CIDR-правило.
aura route remove --cidr 8.8.8.0/24

# Статус и счётчики.
aura status
# Aura tunnel status
#   peer:       cdn.example.com
#   default:    vpn
#   rules:      2
#   rx packets: 0
#   tx packets: 0

Если сокет лежит не там, добавьте --admin-socket <PATH> к каждой команде. Полная спецификация команд и wire-протокола admin'а — в split-tunnel.md.


5. Что идёт по проводу (резюме)

  • Основной: собственный UDP-транспорт Aura (в примере — 443/udp). Один UDP-сокет несёт обе фазы, различимые по первому байту:
    • 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 QUIC: внешний TLS-камуфляж под HTTP/3 + внутреннее Aura-рукопожатие.
  • Клиент пробует транспорты по order, переключается при отказе или таймауте подключения (по умолчанию 8 с). Сервер слушает все включённые транспорты одновременно (MultiServer).

Подробный wire-протокол — в protocol.md.


6. Честные ограничения v1

  • 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).
  • TCP-маскировка лёгкая. Это минимальная HTTP/1.1-преамбула, а не полноценный TLS-443 (полноценный план — в дорожной карте).
  • Нативного Go-модуля sing-box ещё нет. В качестве моста — Option A из sing-box.md (process bridge через aura client). Нативный Go-outbound (Option B) — план.
  • CRL не подписан (плоское множество идентификаторов на диске) и распространяется вне протокола; автоматической ротации листов нет (срок действия 365 дней, см. pki.md).
  • Admin-сокет — только под Unix. На Windows — cfg-заглушка.