mirkwood — центральная RU-нода, выпускает клиентский трафик через 3 EU exit-сервера по policy routing (fwmark → ip rule → table).
Клиенты VPN (10.9.0.0/21)
│
│ AWG awg1 (порт 51830)
▼
┌─────────────────────┐
│ mirkwood (RU) │
│ 94.25.50.91 │
│ awg0 → nugush │ inter-server
│ awg2 → syun │ network 10.10.0.0/24
│ awg3 → sakmara │ (sakmara: 10.10.1.x)
└──┬─────────┬────┬───┘
│ │ │
Xray/gRPC│ Прямой │ │ Прямой UDP
VLESS+ │ UDP │ │ (52840↔52840)
Reality │ │ │
▼ ▼ ▼
┌────────────┐ ┌────────┐ ┌──────────────┐
│ nugush │ │ syun │ │ sakmara │
│134.209.197 │ │194.247.│ │162.120.19.187│
│ .76 │ │ 182.197│ │ │
│ 10.10.0.2 │ │10.10.0.│ │ 10.10.1.6 │
│ EU (DO) │ │ 3 │ │ EU │
└────────────┘ │EU(RUDC)│ └──────────────┘
└────────┘
| Имя | IP | DC / провайдер | Inter-server addr | Транспорт | Порт |
|---|---|---|---|---|---|
| mirkwood (RU central) | 94.25.50.91 | proxmox/zilim | 10.10.0.1, 10.10.1.5 | — | — |
| nugush (EU exit) | 134.209.197.76 | DigitalOcean EU | 10.10.0.2 | Xray VLESS+Reality | mirkwood:8443 |
| syun (EU exit) | 194.247.182.197 | RU DC | 10.10.0.3 | Прямой UDP | syun:52822 |
| sakmara (EU exit) | 162.120.19.187 | (бюджетный DC) | 10.10.1.6 | Прямой UDP | sakmara:52840 |
| Интерфейс | Address | Listen Port | Назначение | Peer |
|---|---|---|---|---|
awg1 |
10.9.0.1/21 | 51830 | Клиентский (~140 peers) | dep816.ru users + forGain admins (10.9.0.191-198) |
awg0 |
10.10.0.1/32 | 52820 | inter-server → nugush | через Xray на 127.0.0.1:59010 (см. ниже) |
awg2 |
10.10.0.1/32 | 52830 | inter-server → syun | прямой UDP 194.247.182.197:52822 |
awg3 |
10.10.1.5/32 | 52840 | inter-server → sakmara | прямой UDP 162.120.19.187:52840 |
Table = off на всех inter-server — иначе awg-quick добавит default через AllowedIPs и сломает policy routing.
ТСПУ дропает прямой UDP к DigitalOcean при пиках. Поверх awg0 поставлен Xray-туннель, маскирующий трафик под HTTPS к google.com.
8443 (TLS 1.3 Reality → www.google.com)d0e55f10-5b59-41c6-a194-bf3019c09a57www.google.comxray.servicedokodemo-door UDP 127.0.0.1:5901094.25.50.91:8443127.0.0.1:59010 — Xray локально перехватывает и шлёт через TLS| Транспорт | Upload | Download | Ping | CPU | DPI устойчивость |
|---|---|---|---|---|---|
| Прямой UDP | 904 | 833 | 58 ms | — | ❌ блокируется ТСПУ |
| udp2tcp | ~195 | ~126 | 55 ms | 5% | ✅ |
| udp2raw FakeTCP | 150 | 128 | 48 ms | 65% | ✅ |
| Xray gRPC+Reality | 215 | 180 | 41 ms | ~0% | ✅✅ TLS 1.3 |
История миграции (2026-03-24): udp2tcp → Phantun (не заработал, ядро перехватывает SYN до raw socket) → udp2raw → Xray (текущее решение).
sakmara и syun — прямой UDP, без Xray. Cap 300/150 Mbps через HTB достаточно для ТСПУ-policer (см. QoS).
| route_rule | fwmark | table | device | gateway/exit |
|---|---|---|---|---|
| direct (RU) | 0x1 |
201 | eth0/ens18.1124 |
94.25.50.65 |
| nugush (EU) | 0x2 |
202 | awg0 |
через Xray |
| syun (EU) | 0x3 |
203 | awg2 |
прямой UDP |
| sakmara (EU) | 0x4 |
204 | awg3 |
прямой UDP |
Дефолт по EU — nugush (awg_clients_route_eu_default: nugush в host_vars).
ipset russian_nets — country-ip-blocks для RU. Используется в правилах: RU-трафик forced direct (fwmark 0x1).
На каждом exit-сервере MASQUERADE для:
10.10.0.0/24 — inter-server сеть (для маршрутизации между нодами)10.9.0.0/21 — VPN-клиентов mirkwood (выход в интернет под IP exit-сервера)Особый кейс: VPS 94.25.50.89 (другой клиент в той же /27) использует mirkwood как gateway. Его исходящий трафик нужно гнать через nugush, но ответы на входящие должны идти прямым default route — иначе клиент получит ответ с другого IP.
Различение по TCP flags в mangle PREROUTING:
См. подробно: docs/03-routing-89.md в AmneziaWGServer репо.
Деплой и конфигурация всех серверов (mirkwood + exit'ы) живёт в отдельном Ansible-проекте:
/Users/v.tatarnikov/Projects/AmneziaWGServeransible/inventory/hosts.yml (mirkwood/lojump, nugush, syun, sakmara — но sakmara может быть в отдельном inventory)ansible/inventory/host_vars/<host>.yml — секреты (private keys, Xray UUID), конфиги туннелейansible/roles/cloud/ — bootstrap (OS, software, time, security), service-amneziawg.yml, service-amneziawg-clients.yml, service-server-pinger.yml, service-udp2tcp.ymlВажно: application-side Ansible (gunicorn
awg-web, биллинг, healthcheck, DNS-parser, и т.д.) живёт в отдельной ролиcentral-serverв репоAmneziaWGStatistic(contrib/ansible/). Не путать.
cd /Users/v.tatarnikov/Projects/AmneziaWGServer
ansible-playbook -i ansible/inventory/hosts.yml ansible/playbooks/000-bootstrap-cloud-basic.yml
Использует ansible_user=root, ключ ~/.ssh/id_rsa. Для VPN-only хостов (firefly и т.п.) — через ProxyJump (см. forGain claude-guide).
server-pinger.timer (на mirkwood, 30 сек) пингует all exit-серверов через tunnel_ip и direct_ip одновременно — пишет в memcached с TTL 300 сек (больше чем server_unreachable_threshold=180, иначе ложные алерты).
Цели в host_vars mirkwood:
server_pinger_targets:
- {name: nugush, tunnel_ip: 10.10.0.2, direct_ip: 134.209.197.76}
- {name: syun, tunnel_ip: 10.10.0.3, direct_ip: 194.247.182.197}
- {name: sakmara, tunnel_ip: 10.10.1.6, direct_ip: 162.120.19.187}
При добавлении sakmara (2026-03-27) в роль exit-server:
10.9.0.0/21Тогда же поймали баги, которые есть в любой новой инсталляции:
Table = off в inter-server конфиге awg-quick добавляет 0.0.0.0/0 в main table → ломает policy routing.ip route replace default via <addr> table N не работал — для P2P достаточно dev <iface> без via.awg_connmark chain не подключалась к POSTROUTING mangle → fwmark не сохранялся в conntrack → return traffic с неправильной меткой.route.conf восстанавливает default в table 20X после restartlojump.4gain.pro встречается в Ansible inventory AmneziaWGServer. После миграции 2026-03 на новую VM IP 94.25.50.91 остался, hostname сменился на mirkwood. В forGain inventory и в WhiteBox memory — везде mirkwood.Changelog