6.2 KiB
6.2 KiB
date, type, tags
| date | type | tags | ||||||
|---|---|---|---|---|---|---|---|---|
| 2026-06-23 | decision |
|
Amnezia Web Panel — control-plane VPN-нод на home lab (LXC 143)
Контекст
Олег арендует HOSTKEY Finland (151.241.234.241, Ubuntu 22.04, 2 vCPU/3.9 GB) как основной VPN-хаб для всех проектов, старый финский VPS — горячий резерв. Управлять нодами решено через Amnezia-Web-Panel (FastAPI/Python, paramiko-SSH; рулит AmneziaWG/WG/Xray-Reality/MTProxy на удалённых Ubuntu).
Решение: панель — ДОМА, не на VPS
Панель = control-plane с SSH-ключами ко всем нодам сразу. Держим её на home lab (LXC 143), VPS оставляем чистым data-plane.
Почему не на VPS:
- Безопасность. Финский VPS уже ломали через RCE в amnezia-panel (XorDDoS, чистили 2026-04-24). Панель на публичной коробке = ключи ко всему контуру под ударом.
- Никакого публичного
:5000+ дефолтadmin/admin+ открытый Swagger/docs. - Переживает пересборку VPS —
data.json(вся клиентская база) живёт дома. - Один пульт на все ноды (Finland + Paris/Singapore + будущие).
Что развёрнуто (LXC 143, 10.0.0.143)
- Debian 12, unprivileged + nesting/keyctl, rootfs на
work(local-lvm забит на 94%), ns 1.1.1.1. - Docker 29.6 + compose, контейнер
prvtpro/amnezia-panel:1.4.4,-p 5000:5000, restart=unless-stopped, onboot=1. - NetBird
100.70.9.163/amnezia-panel.netbird.cloud(группа Claude-Diag, ключ1558712D-…,--disable-dns). - Доступ: LAN
10.0.0.143:5000+ NetBird100.70.9.163:5000. Без NPM, без проброса портов — не публично. - Логин
admin/AmnPanel!2026-fi(дефолт сменён; проверено: old→401, new→200).
Грабли
- Персистентность (важно). Upstream
docker-compose.ymlмонтируетamnezia_data:/app/data, но приложение пишет в/app/data.jsonи/app/tunnels_state.json(в WORKDIR/app). Т.е. дефолтный volume — пустышка, при пересоздании контейнера терялась бы вся база. Починено bind-mount'ом конкретных файлов в/opt/amnezia-panel/. - Базовый Debian-шаблон без
curl— ставить перед get.docker.com. - Хеш пароля:
pbkdf2_hmac('sha256', pwd, salt_hex16, 100000)→ форматsalt$hex. Смена пароля скриптом — воспроизвести этот алгоритм (/opt/amnezia-panel/setpw.py).
Финский VPS заведён в панель (2026-06-23)
Олег сам поднял сервер через официальное приложение AmneziaVPN (он = владелец/первый админ), затем сервер добавлен в панель — она адаптировала существующую установку:
- Протокол AmneziaWG 2.0 → контейнер
amnezia-awg2, UDP 41624, subnet10.8.1.0/24. /api/servers/0/check→awg2 running,clients_count: 1.- Клиент Олега
Admin [macOS Tahoe (26.5.1)]виден в панели (читается из/opt/amnezia/awg/clientsTable). - Вывод подтверждён в коде + вживую:
get_clients()читаетclientsTableс сервера и доп. парсит[Peer](«pick up peers created via native Amnezia app»). Панель = центральное управление поверх app-установки, не конфликтует. - ⚠️ root-пароль VPS хранится в
data.jsonпанели в открытом виде (так устроен SSH-доступ панели). При смене пароля VPS — обновить в карточке сервера (Servers → edit).
Хардинг VPS сделан (2026-06-23)
- SSH key-only: ed25519
~/.ssh/awg_fi_key(Mac, алиасssh awg-fi), pubkey в/root/.ssh/authorized_keys. Пароль по SSH отключён (PasswordAuthentication noв00-hardening.conf— перебивает cloud-init50-cloud-init.conf, читается первым).PermitRootLogin prohibit-password. Бэкап/root/sshd_config.bak.*. - Панель переведена на тот же ключ (
/api/servers/0/editсprivate_key, пароль очищен; edit проверяет SSH до сохранения — не залочит). Проверено:check 200по ключу. - ufw: наружу только
22/tcp+41624/udp. (Docker публикует 41624 в обход ufw — это ок, порт нужен открытым; ufw защищает хостовые службы.) - fail2ban: jail
sshd,backend=systemd(на минимальной Ubuntu нет/var/log/auth.log→ дефолтный backend падал). - Грабля cloud-init:
/etc/ssh/sshd_config.d/50-cloud-init.confдержалPasswordAuthentication yes— перебито00-hardening.conf+ закомментировано sed'ом. - Пароль
v_6hH9JuH_остаётся валиден только для веб-консоли HOSTKEY (recovery).
Дальше (TODO)
- Резервный финский VPS: переустановить ОС начисто перед использованием, подцепить к панели.
- Решить failover (AWG сам не переключается): второй endpoint в конфигах клиентов либо переключение через панель/DNS.
- Проверить лимит трафика HOSTKEY (3 TB/мес) — под «все проекты» может быть тесно.
- Бэкап
/opt/amnezia-panel/data.json(вся клиентская база).