install.sh now defaults to AWG_GEN=3.1: an incompatible module or kernel fails with diagnostics instead of silently falling back to 2.0 and handing out a server with weaker obfuscation. AWG_GEN=auto keeps the old fallback for old kernels, AWG_GEN=2.0 still forces 2.0. Servers already installed on 2.0 no longer need a reinstall: POST /awg/upgrade (button in the users tab) backs up awg1.conf, rewrites [Interface] with HeaderProtectionKey and the 3.1 block install.sh writes, raises any S1-S4 below 12 (header protection needs a 12-byte nonce and the module only reports "Invalid argument"), restarts the interface and reissues every vpn:// key. Bringing the interface up is the only real proof the kernel accepted the params, so a failure restores the previous conf and brings 2.0 back up. Reissue is not optional: 2.0-era keys stop working the moment the generation changes. restartAwg() now re-reads the obfuscation params, generation and keepalive from awg1.conf before syncing peers. The conf can change while the interface is down, and a stale CONFIG.gen meant new keys were built on the old params. README: install from git.ma7neko.ru (Gitea) instead of raw.githubusercontent, and document the 3.1 default with the AWG_GEN=auto escape hatch.
92 lines
5.6 KiB
Markdown
92 lines
5.6 KiB
Markdown
# Forgetting
|
||
Панель управления и API для VPN на базе [AmneziaWG](https://github.com/amnezia-vpn/amneziawg-linux-kernel-module)
|
||
> [!WARNING]
|
||
> Данный проект предназначен только для использования в законных целях.
|
||
## Архитектура
|
||
|
||
Три компонента, устанавливаются в `/opt/awg-control/`:
|
||
|
||
| Компонент | Роль |
|
||
|---|---|
|
||
| **awg-ctrl** | Привилегированный REST-бэкенд. Управляет пирами через `awg`/`awg-quick`, ведёт SQLite-базу, генерирует `vpn://` ключи. Слушает только loopback. |
|
||
| **awg-ui** | Express + React. Веб-панель, аутентификация (JWT), интеграция с API MA7, прокси к awg-ctrl. Единственный сервис, доступный по сети. |
|
||
| **cli** | Менеджер процессов: `start`/`stop`/`restart`/`status`, смена логина/пароля панели, интерактивное TUI-меню. |
|
||
|
||
Внутренняя связь awg-ui → awg-ctrl подписывается асимметрично (Ed25519): приватный ключ только у awg-ui, awg-ctrl проверяет подпись публичным.
|
||
|
||
## Требования
|
||
- **ОС**: Ubuntu 24.04+ (Тесты проходили на Ubuntu 24.04.4 LTS)
|
||
- **Права**: root.
|
||
- **Ядро**: kvm (не OpenVZ/LXC/Docker/WSL — нужен загружаемый kernel-модуль AmneziaWG).
|
||
- **Заголовки ядра** под текущее ядро (для сборки DKMS-модуля).
|
||
- **Node.js 20.x** (ставится установщиком автоматически).
|
||
|
||
Совместимость установщик проверяет сам перед любыми изменениями.
|
||
|
||
## Установка
|
||
|
||
На сервере, от root:
|
||
|
||
```bash
|
||
bash <(curl -Ls https://git.ma7neko.ru/maeneko/forgetting/raw/branch/main/install.sh)
|
||
```
|
||
|
||
Установщик по умолчанию ставит сервер на AmneziaWG 3.1. Если модуль в ядре
|
||
старше 3.x или ядро старше 5.5, установка остановится с диагностикой — поставить
|
||
на 2.0 можно так:
|
||
|
||
```bash
|
||
AWG_GEN=auto bash <(curl -Ls https://git.ma7neko.ru/maeneko/forgetting/raw/branch/main/install.sh)
|
||
```
|
||
|
||
Перевести такой сервер на 3.1 позже можно кнопкой «Перейти на AWG 3.1» в панели —
|
||
переустановка не нужна, пользователи сохраняются, ключи перевыпускаются
|
||
автоматически.
|
||
## Управление
|
||
|
||
```bash
|
||
awg-ctrl
|
||
```
|
||
|
||
Через systemd (автозапуск на загрузке):
|
||
|
||
```bash
|
||
systemctl start|stop|restart awg-control
|
||
```
|
||
|
||
## Интеграция с MA7
|
||
|
||
Этот сервер персональный — принадлежит одному абоненту MA7 (сервиса
|
||
VPN-подписки). Панель ничем не управляет в MA7 и не отдаёт наружу свой API:
|
||
вкладка «Профиль» только читает баланс своего владельца. Секрет MA7 живёт
|
||
только в `awg-ui` (`cli.env`) и в браузер не попадает — фронт ходит на свой
|
||
бэкенд, тот читает MA7.
|
||
|
||
Нужные переменные (задаются при установке или руками в `cli.env`):
|
||
|
||
| Переменная | Назначение |
|
||
|---|---|
|
||
| `MA7_API_BASE_URL` | адрес API MA7, например `https://amnesia.ma7neko.ru` |
|
||
| `MA7_JWT_SECRET` | секрет, которым панель сама подписывает `X-Bot-Token` (эндпоинта, выдающего токен, в MA7 нет) |
|
||
| `MA7_LOGIN` | логин владельца этого сервера в MA7 (`ma7_xxxxxx`) |
|
||
|
||
Вкладка «Профиль» просто показывает текущий баланс `MA7_LOGIN`. При установке
|
||
`MA7_LOGIN` заодно предлагается как логин панели (`UI_USER`) — сервер
|
||
персональный, и заказчик входит тем же именем, что знает по MA7; при желании
|
||
логин панели можно задать свой. Это разные переменные: `UI_USER` решает, кого
|
||
пускать в панель, `MA7_LOGIN` — чей баланс показывать.
|
||
|
||
`MA7_LOGIN` задаётся один раз при установке и **не редактируется из панели**: у панели
|
||
один общий пароль (`UI_USER`/`UI_PASS`) без отдельного клиентского входа, а
|
||
`MA7_JWT_SECRET` умеет искать в MA7 любого абонента — редактируемый в браузере
|
||
логин превратил бы личный баланс в инструмент подглядывания за чужими.
|
||
|
||
> [!WARNING]
|
||
> `MA7_JWT_SECRET` — мастер-ключ ко всему MA7: с ним можно читать данные любых
|
||
> пользователей MA7, не только этого сервера. Токены MA7 без срока действия,
|
||
> отзыва нет — «отобрать доступ» значит одновременно сменить `MA7_JWT_SECRET`
|
||
> во всех сервисах MA7 и здесь, в `cli.env`.
|
||
|
||
## Лицензия
|
||
[MIT](LICENSE) © 2026 Ivan Vasilev
|