7.0 KiB
7.0 KiB
Acceptance checklist перед production-выкладкой
A. Базовая установка
- Хост — Debian 13 amd64.
- Сервер выделенный, без соседних сервисов.
- AmneziaWG/AWG 2.0 установлена официальным способом.
- Контейнер
amnezia-awg2илиamnezia-awgзапущен. docker psвидит контейнер.- Можно получить PID контейнера.
/proc/<pid>/ns/netсуществует.- На хосте доступны
ip,tc,wg,nsenter,modprobe. awg2-harness validate-configпроходит без ошибок.
B. Peer discovery
awg2-harness statusпоказывает найденный контейнер.awg2-harness statusпоказывает PID/netns контейнера.awg2-harness statusпоказывает найденный интерфейс.- Количество peers совпадает с
wg show all allowed-ips. - Offline peers с allowed IP тоже попадают в список shaping.
- IP вне
amnezia.peer_ipv4_cidrне попадают в traffic shaping.
C. Traffic topology parity with old bash
awg2-harness apply-limitsуспешно завершается.- На AWG/WG-интерфейсе есть root qdisc
1: htb. - На AWG/WG-интерфейсе есть root class
1:1сtraffic.root_rate. - Для каждого peer есть class
1:<id>сtraffic.peer_limit. - Для каждого peer есть
fq_codelпод1:<id>. - Для каждого peer есть egress filter
dst peer_ip -> 1:<id>. - Есть ingress qdisc
ffff:на AWG/WG-интерфейсе. - Есть ingress redirect через
mirred ... redirect dev ifb0. ifb0существует и находится в UP state.- На
ifb0есть root qdisc2: htb. - На
ifb0есть root class2:1сtraffic.root_rate. - Для каждого peer есть class
2:<id>сtraffic.peer_limit. - Для каждого peer есть
fq_codelпод2:<id>. - Для каждого peer есть ingress filter
src peer_ip -> 2:<id>. - Class ids начинаются с
traffic.class_start_id, default10. - Peer IP → class id mapping сохраняет bash parity: IP сортируются лексикографически как строки, не numeric IPv4.
D. Idempotency and drift recovery
- Повторный
apply-limitsне создаёт дубли. - Повторный
apply-limitsне меняет healthy state без причины. - Если удалить root qdisc на AWG/WG-интерфейсе, daemon восстанавливает topology.
- Если удалить ingress qdisc, daemon восстанавливает topology.
- Если удалить
ifb0, daemon восстанавливает topology. - Если удалить один peer filter, daemon восстанавливает topology.
- После удаления peer устаревшие class/filter исчезают через rebuild.
- После добавления peer появляются новые class/filter.
E. Auto-healing lifecycle
docker restart amnezia-awg2→ лимиты восстанавливаются автоматически.systemctl restart docker→ после возвращения контейнера лимиты восстанавливаются автоматически.systemctl restart awg2-harness→ сервис сам находит контейнер и применяет/проверяет лимиты.- Reboot хоста → сервис стартует и восстанавливает лимиты.
- Изменение имени интерфейса на допустимое fallback-имя не ломает detector.
- Если контейнер временно отсутствует, daemon логирует ожидание и продолжает работу.
F. Status and observability
statusпоказывает desired peer limit из конфига, а не hardcoded 70.statusпоказывает egress state.statusпоказывает ingress/ifb state.statusпоказывает missing/stale peer rules.statusявно показывает partial/drift state.- Логи доступны через
journalctl -u awg2-harness. - Ошибка отсутствия
tc/ip/wgлогируется явно. - Последний reconcile result виден в status или journal.
G. Reboot scheduler
- Если
reboot.enabled = false, сервис не планирует reboot. - Если
reboot.enabled = true, в journal видна запланированная перезагрузка. - Время попадает в окно
window_start_utc–window_end_utc. - Вызов reboot выполняется через
systemctl --no-block reboot.
H. Swap
ensure-swapсоздаёт/swapfileразмером 2048 MB.- Права
/swapfile—0600. swapon --showпоказывает активный swap.- В
/etc/fstabнет дублей. vm.swappiness = 1применён.- Повторный
ensure-swapне пересоздаёт корректный swap. - Несовместимый существующий swap не удаляется молча.
I. Anti-torrent nftables guard
- Если
anti_torrent.enabled = true, в Amnezia netns естьtable inet awg2_harness. - Есть chain
forward_antitorrentс hookforwardи policyaccept. - Правило ограничивает
ip saddr <peer_ipv4_cidr>, default10.8.1.0/24. - Лимит считается per source VPN IP через meter/set, а не глобально по всей подсети.
- Порог совпадает с
anti_torrent.max_connections_per_peer, default200. - Drop counter виден в
status. - При превышении порога новые flows дропаются, established flows ниже порога не ломаются.
- После restart контейнера nftables rule пересоздаётся в новом netns.
- При
anti_torrent.enabled = falseудаляется/отключается только AWG2-owned nftables state; Docker/Amnezia rules не flush-ятся. statusпоказываетnf_conntrack_count/nf_conntrack_max, если sysctl доступны.
J. Rollback
- Старые bash-файлы сохранены до завершения миграции.
- Известно, как остановить
awg2-harness.service. - Известно, как вернуть
amnezia-tc.serviceиamnezia-tc-watcher.service. - Rollback проверен на тестовом сервере.