Полный продакшн-фикс: parity с old bash, drift-recovery, status/runtime и builder separation
This commit is contained in:
@@ -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-ятся.
|
||||
|
||||
@@ -70,7 +70,7 @@ table inet awg2_harness {
|
||||
```toml
|
||||
[anti_torrent]
|
||||
enabled = true
|
||||
max_connections_per_peer = 200
|
||||
max_connections_per_peer = 100
|
||||
```
|
||||
|
||||
Практические варианты:
|
||||
|
||||
@@ -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`.
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user