fix: harden production topology and runtime state
This commit is contained in:
@@ -350,9 +350,9 @@ awg2-harness --config /etc/awg2-harness/config.toml <command>
|
||||
|
||||
`apply-firewall` делает два reconcile: host INPUT firewall в изолированных `iptables`/`ip6tables` A/B-цепочках и nftables anti-torrent guard в выбранном namespace. Команда не меняет policy встроенного `INPUT`, Docker NAT или host `FORWARD`.
|
||||
|
||||
`apply-limits` находит Amnezia container, заходит в его network namespace, читает peers через container-side `awg`/`wg`, строит per-peer HTB/fq_codel классы на AWG/WG интерфейсе и IFB ingress path. Peer filters создаются classifier-ом `flower` с единым `pref 10`; legacy peer-фильтры `u32` считаются drift и мигрируют через controlled rebuild. Перед удалением проверяются qdisc handles и alias IFB `awg2-harness:traffic`; чужой объект с тем же именем является ошибкой. Healthy state не печатает сообщение на каждом цикле daemon.
|
||||
`apply-limits` находит Amnezia container, заходит в его network namespace, читает peers через container-side `awg`/`wg` и до mutation проверяет строгий server-side контракт: один IPv4 `/32` внутри `amnezia.peer_ipv4_cidr` на peer; `(none)` допустим. IPv6, смешанные или множественные маршруты, другая маска и адрес вне подсети дают явную ошибку unsupported topology. После проверки команда строит per-peer HTB/fq_codel классы на AWG/WG интерфейсе и IFB ingress path. Peer filters создаются classifier-ом `flower` с единым `pref 10`; legacy peer-фильтры `u32` считаются drift и мигрируют через controlled rebuild. Перед удалением проверяются qdisc handles и alias IFB `awg2-harness:traffic`; чужой объект с тем же именем является ошибкой. Healthy state не печатает сообщение на каждом цикле daemon.
|
||||
|
||||
`status` печатает фактическую диагностику: сервис, контейнер, netns, интерфейс, peers, WireGuard runtime, traffic desired/actual, host firewall drift, Docker/Amnezia port path, anti-torrent counters, swap state, conntrack, recent events и planned reboot.
|
||||
`status` печатает фактическую диагностику: сервис, контейнер, netns, интерфейс, peers, WireGuard runtime, traffic desired/actual, host firewall drift, Docker/Amnezia port path со всеми UDP `HostIp:HostPort` bindings, anti-torrent counters, swap state, conntrack, recent events и planned reboot.
|
||||
|
||||
`daemon` — режим для systemd. На старте делает startup reconcile, затем слушает Docker events и периодически сверяет traffic/swap/firewall. Вручную обычно не запускается, кроме отладки.
|
||||
|
||||
@@ -364,7 +364,9 @@ Traffic shaping реализован через `tc` в network namespace кон
|
||||
|
||||
Peer discovery берётся из WireGuard/AmneziaWG allowed IPs, а не из handshake state. Поэтому offline peer с `allowed ips: 10.8.1.1/32` тоже получает лимит заранее.
|
||||
|
||||
Host firewall владеет только помеченным переходом из встроенного `INPUT` и двумя A/B-цепочками `AWG2H_A`/`AWG2H_B` отдельно для IPv4 и IPv6. Цепочка разрешает loopback, established/related, SSH-порт из конфига и optionally ICMP/ICMPv6, затем применяет configured verdict. Новая цепочка полностью проверяется до переключения; ошибка IPv6 после переключения IPv4 запускает rollback. Published Amnezia UDP port здесь намеренно не открывается: Docker bridge publish обслуживается через Docker-managed `FORWARD`/NAT path.
|
||||
Ограничение относится только к адресации peers внутри server-side AWG topology. Клиентский маршрут `::/0` и внешний IPv6 Docker publish не означают IPv6 peer addressing: Docker может одновременно публиковать тот же UDP port на `0.0.0.0` и `[::]`, и status показывает оба binding.
|
||||
|
||||
Host firewall владеет только помеченным переходом из встроенного `INPUT` и двумя A/B-цепочками `AWG2H_A`/`AWG2H_B` отдельно для IPv4 и IPv6. Цепочка разрешает loopback, established/related, SSH-порт из конфига и optionally ICMP/ICMPv6, затем применяет configured verdict. Новая цепочка полностью проверяется до переключения; новый jump вставляется первым, а старый удаляется только после успеха обеих IP-family по точной rule specification. Numeric replace/delete не применяется, поэтому чужое правило не затрагивается при конкурентном изменении `INPUT`. Ошибка IPv6 удаляет только новый IPv4 jump и оставляет прежний рабочим. Published Amnezia UDP port здесь намеренно не открывается: Docker bridge publish обслуживается через Docker-managed `FORWARD`/NAT path.
|
||||
|
||||
Anti-torrent guard — отдельная AWG2-owned таблица `inet awg2_harness` обычно внутри Amnezia netns. Правило ограничивает число новых conntrack flows per source VPN IP. Это не DPI и не распознавание BitTorrent-протокола; это грубый, дешёвый guard против сотен одновременных P2P-соединений.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user