До 2026-04-30 межсерверная связь шла через 3 SSH-туннеля (autossh-duck, autossh-longfw, bgbilling-tunnel). После миграции — единый mesh, ноды видят друг друга по 10.9.0.x, без туннелей и host-ssh-keys в контейнерах.
AWG-сервер крутится на отдельном VPS mirkwood.4gain.pro (94.25.50.91:51830) — это «ядро» mesh forGain. Firefly — обычный peer (10.9.0.191), как и LoPlus-хосты, и подключается к mirkwood снаружи. Это уточнение от forGain — раньше топология ошибочно показывала firefly как server.
mirkwood.4gain.pro (AWG core)
94.25.50.91:51830/udp
PubKey: tjEO3VdD0XG…
▲
│ AmneziaWG (obfuscated)
│
┌────────────┬─────┴─────┬────────────┐
│ │ │ │
firefly LoNGFW BGBilling DPI
10.9.0.191 10.9.0.196 10.9.0.197 10.9.0.198
(forGain (LoPlus (LoPlus (LoPlus,
swarm-mgr) core) billing) VEOS 8)
Mesh-адресация — 10.9.0.0/21, общая для forGain (191 firefly, 192 annalium — VM-хранилка, тоннель ещё не поднят: kernel 6.12 incompat) и LoPlus (196, 197, 198). Все peer'ы — на интерфейсе awg1 mirkwood, видят друг друга через него.
Сетевое железо (ESR/OLT/CSW) — вне AWG, доступ как было (SSH/SNMP/telnet через poller).
forGain VPS nugush, syun, sakmara — это отдельные VPN exit-нодам для обхода РКН, не в AWG mesh forGain/LoPlus. См. Серверы LoPlus → Внешние VPS forGain.
| Хост | mirkwood.4gain.pro (отдельный VPS, не firefly) |
| Public IP | 94.25.50.91 |
| Port | 51830/udp |
| AWG server PublicKey | tjEO3VdD0XGdoaXajG/vbgPGIRCOCH4lzGu2uadhFHE= |
| MTU | 1420 |
| Доп. | хостит dep816.ru |
⚠️ Регистрация новых peer'ов и ротация ключей — на mirkwood, на интерфейсе awg1 (awg set awg1 peer …), не на firefly. На mirkwood есть автогенерация — awg-sync.timer создаёт конфиги клиентов из БД (см. WhiteBox/amneziawg-stats).
Обфускация (одинаковая для всех клиентов):
Jc=7, Jmin=50, Jmax=1000
S1=108, S2=99
H1=748818505, H2=428238027, H3=1819733425, H4=1828077873
| Peer (host) | AWG IP | PublicKey клиента | Где конфиг |
|---|---|---|---|
| LoNGFW core (10.0.0.13) | 10.9.0.196/32 |
(см. на хосте) |
/etc/amnezia/amneziawg/awg0.conf |
| BGBilling (10.0.0.3) | 10.9.0.197/32 |
UNE3EL9EoXKTMZ64myxKbCSi7tm3cmtsD/9YQqmLQh4= |
/etc/amnezia/amneziawg/awg0.conf |
| DPI (10.0.0.6) | 10.9.0.198/32 |
5PTDm1xl4d8A8OWZEsVSbHUEMwtGLVAREnTfP5QRl3I= |
/etc/amnezia/amneziawg/awg0.conf |
⚠️ Приватные ключи peer'ов только на самих хостах, не дублируются в wiki/git. При компрометации — ротация: на mirkwood awg set awg1 peer <new_pub> preshared-key <new_psk> allowed-ips <ip>/32.
# 1. Бинари (взять из docker-image на 10.0.0.13)
ssh root@10.0.0.13 'tar czf /tmp/awg.tgz -C /tmp/awg-bins .'
scp root@10.0.0.13:/tmp/awg.tgz /tmp/
scp /tmp/awg.tgz root@<new_host>:/tmp/
ssh root@<new_host> '
cd /tmp && tar xzf awg.tgz
install -m755 amneziawg-go awg awg-quick /usr/local/bin/
apt-get install -y -qq iproute2 iptables openresolv
mkdir -p /etc/amnezia/amneziawg && chmod 700 /etc/amnezia/amneziawg
'
Бинари не работают с glibc 2.28 — пересобрать в Rocky 8 builder:
ssh root@10.0.0.13 '
docker run --rm -v /tmp/awg-rhel8:/out rockylinux:8 bash -c "
dnf install -y -q git make gcc bash
curl -L -o /tmp/go.tgz https://go.dev/dl/go1.22.7.linux-amd64.tar.gz
tar -C /usr/local -xzf /tmp/go.tgz
export PATH=/usr/local/go/bin:\$PATH
cd /tmp && git clone --depth 1 https://github.com/amnezia-vpn/amneziawg-go awg-go
cd awg-go && make && install -m755 amneziawg-go /out/
cd /tmp && git clone --depth 1 https://github.com/amnezia-vpn/amneziawg-tools awg-tools
cd awg-tools/src && make
install -m755 wg /out/awg
install -m755 wg-quick/linux.bash /out/awg-quick
"'
Затем те же шаги что выше, но из /tmp/awg-rhel8/.
/etc/amnezia/amneziawg/awg0.conf:
[Interface]
PrivateKey = <peer-private-key>
Address = 10.9.0.<N>/32
Jc = 7
Jmin = 50
Jmax = 1000
S1 = 108
S2 = 99
H1 = 748818505
H2 = 428238027
H3 = 1819733425
H4 = 1828077873
[Peer]
PublicKey = tjEO3VdD0XGdoaXajG/vbgPGIRCOCH4lzGu2uadhFHE=
PresharedKey = <peer-psk>
Endpoint = 94.25.50.91:51830
AllowedIPs = 10.9.0.0/21
PersistentKeepalive = 25
⚠️ Не копируй DNS=... из получаемого peer-конфига — перезатрёт системный resolv.conf через openresolv. И не оставляй ::/0 в AllowedIPs если нет нативного IPv6 — это маршрутизирует весь IPv6 в туннель.
chmod 600 /etc/amnezia/amneziawg/awg0.conf
awg-quick up awg0
ping 10.9.0.191 # должен пинговаться
# systemd unit
cat > /etc/systemd/system/awg-quick@.service << 'EOF'
[Unit]
Description=AmneziaWG via awg-quick(8) for %I
After=network-online.target nss-lookup.target
Wants=network-online.target nss-lookup.target
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/local/bin/awg-quick up %i
ExecStop=/usr/local/bin/awg-quick down %i
Environment=WG_ENDPOINT_RESOLUTION_RETRIES=infinity
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable awg-quick@awg0.service
# на mirkwood (94.25.50.91), не на firefly
ssh root@mirkwood.4gain.pro
awg set awg1 peer <pub_key_new_peer> preshared-key <psk_new> allowed-ips 10.9.0.<N>/32
awg-quick save awg1 # если хотим persist
Без этого handshake пройдёт, но трафик дропается (allowed-ips не пропускает).
awg show awg0 # latest handshake, transfer
awg show awg0 latest-handshakes # только timestamps
ping -c 3 10.9.0.191 # firefly доступен?
ip route get 10.9.0.197 # должно показать `dev awg0`
journalctl -u awg-quick@awg0 --since "1h"
Типичные проблемы:
Never → endpoint недоступен (firewall на mirkwood:51830/udp или промежуточный РКН)transfer: 0 received → peer не зарегистрирован на mirkwood (awg show на mirkwood должен показать новый PublicKey)ip route get 10.9.0.X показывает default-gw вместо awg0 → AllowedIPs не включает нужную подсеть| Туннель (был) | Стало |
|---|---|
autossh-duck (10.0.0.13:8080 → duck:8080) |
удалён (был мёртв — llama-swap на 8089) |
autossh-longfw (10.0.0.13 → duck:18080 reverse) |
bot ходит на 10.9.0.196:8080 напрямую |
bgbilling-tunnel sidecar (LoNGFW → 10.0.0.3:3306) |
DSN на @10.9.0.197/bgbilling |
| LoShaper → DPI (10.0.0.6 SSH с host-keys) | SSH на 10.9.0.198 (host-keys пока для SSH-auth, не туннеля) |
Changelog