Полный продакшн-фикс: parity с old bash, drift-recovery, status/runtime и builder separation

This commit is contained in:
2026-05-10 17:09:39 +05:00
parent b8d2c4592b
commit 76c6b52f4e
14 changed files with 558 additions and 62 deletions
+9 -1
View File
@@ -46,8 +46,12 @@
- [ ] Повторный `apply-limits` не меняет healthy state без причины.
- [ ] Если удалить root qdisc на AWG/WG-интерфейсе, daemon восстанавливает topology.
- [ ] Если удалить ingress qdisc, daemon восстанавливает topology.
- [ ] Если удалить ingress redirect filter (`parent ffff:`), drift детектируется и topology восстанавливается.
- [ ] Если удалить `ifb0`, daemon восстанавливает topology.
- [ ] Если сделать `ifb0` DOWN, drift детектируется и topology восстанавливается.
- [ ] Если удалить один peer filter, daemon восстанавливает topology.
- [ ] Если изменить `rate/ceil` peer class, drift детектируется и topology восстанавливается.
- [ ] Если добавить stale peer class/filter, drift детектируется и topology восстанавливается.
- [ ] После удаления peer устаревшие class/filter исчезают через rebuild.
- [ ] После добавления peer появляются новые class/filter.
@@ -65,11 +69,14 @@
- [ ] `status` показывает desired peer limit из конфига, а не hardcoded 70.
- [ ] `status` показывает egress state.
- [ ] `status` показывает ingress/ifb state.
- [ ] `status` показывает WireGuard clients (online/offline, latest handshake, RX/TX, endpoint).
- [ ] `status` показывает missing/stale peer rules.
- [ ] `status` явно показывает partial/drift state.
- [ ] `status` показывает tc filter counters по peer или `filter statistics: unavailable`.
- [ ] Логи доступны через `journalctl -u awg2-harness`.
- [ ] Ошибка отсутствия `tc`/`ip`/`wg` логируется явно.
- [ ] Последний reconcile result виден в status или journal.
- [ ] `status` показывает последние события reconcile/firewall из `/run/awg2-harness/events.log`.
## G. Reboot scheduler
@@ -94,8 +101,9 @@
- [ ] Есть chain `forward_antitorrent` с hook `forward` и policy `accept`.
- [ ] Правило ограничивает `ip saddr <peer_ipv4_cidr>`, default `10.8.1.0/24`.
- [ ] Лимит считается per source VPN IP через meter/set, а не глобально по всей подсети.
- [ ] Порог совпадает с `anti_torrent.max_connections_per_peer`, default `200`.
- [ ] Порог совпадает с `anti_torrent.max_connections_per_peer`, default `100`.
- [ ] Drop counter виден в `status`.
- [ ] На first-run без table `awg2-harness apply-firewall` создаёт `table inet awg2_harness`, а не падает.
- [ ] При превышении порога новые flows дропаются, established flows ниже порога не ломаются.
- [ ] После restart контейнера nftables rule пересоздаётся в новом netns.
- [ ] При `anti_torrent.enabled = false` удаляется/отключается только AWG2-owned nftables state; Docker/Amnezia rules не flush-ятся.
+1 -1
View File
@@ -70,7 +70,7 @@ table inet awg2_harness {
```toml
[anti_torrent]
enabled = true
max_connections_per_peer = 200
max_connections_per_peer = 100
```
Практические варианты:
+3 -3
View File
@@ -13,8 +13,8 @@ peer_ipv4_cidr = "10.8.1.0/24"
[traffic]
enabled = true
peer_limit = "70mbit"
root_rate = "1000mbit"
peer_limit = "50mbit"
root_rate = "500mbit"
reconcile_interval_secs = 15
container_ready_timeout_secs = 120
class_start_id = 10
@@ -65,7 +65,7 @@ swappiness = 1
`anti_torrent.enabled` — включает nftables connection-count guard против high-peer-count P2P-нагрузки. Это новое расширение, не часть old bash.
`anti_torrent.max_connections_per_peer` — максимум одновременных conntrack flows на один VPN peer IP. Default `200`; `250` — более консервативный вариант.
`anti_torrent.max_connections_per_peer` — максимум одновременных conntrack flows на один VPN peer IP. Default `100`; `250` — более мягкий вариант.
`anti_torrent.peer_ipv4_cidr` — подсеть, на которую распространяется правило. Обычно должна совпадать с `amnezia.peer_ipv4_cidr`.
+4 -2
View File
@@ -59,8 +59,8 @@ install -d -m 0755 /etc/awg2-harness
install -m 0644 config.toml /etc/awg2-harness/config.toml
```
Важно: production-установка **не должна** автоматически копировать [`config.example.toml`](config.example.toml) как боевой конфиг.
Если используется [`tools/build.sh`](tools/build.sh), режим `--install` завершится ошибкой при отсутствии `/etc/awg2-harness/config.toml`.
Важно: production-установка **не должна** автоматически копировать [`config.example.toml`](../config.example.toml) как боевой конфиг.
Если используется [`tools/build.sh`](../tools/build.sh), режим `--install` завершится ошибкой при отсутствии `/etc/awg2-harness/config.toml`.
Режим `--install` копирует только бинарь и unit, выполняет `systemctl daemon-reload`, но не делает `systemctl enable --now`.
Сначала подготовьте осознанный production-конфиг вручную.
@@ -103,6 +103,8 @@ cat /proc/sys/vm/swappiness
`/etc/systemd/system/awg2-harness.service`:
Reference unit в репозитории: [`awg2-harness.service`](../awg2-harness.service).
```ini
[Unit]
Description=AWG2 Harness multi-orchestrator