diff --git a/docs/ACCEPTANCE_CHECKLIST.md b/docs/ACCEPTANCE_CHECKLIST.md index 160db89..51ca181 100644 --- a/docs/ACCEPTANCE_CHECKLIST.md +++ b/docs/ACCEPTANCE_CHECKLIST.md @@ -128,6 +128,7 @@ - [ ] При невалидном `host_firewall.amnezia_protocols` (`icmp`, `foo`, дубли) `validate-config` завершается ошибкой. - [ ] После `docker restart` anti-torrent правила продолжают восстанавливаться корректно и не ломаются host firewall логикой. - [ ] Проверено, где реально проходит VPN-трафик в вашей Docker-схеме (`INPUT` vs `FORWARD`) и это отражено в эксплуатационной заметке. +- [ ] Для release-кандидата зафиксирован итог проверки `INPUT` vs `FORWARD` на реальном сервере (команды/логи/вывод) и подтверждено, что текущие правила firewall покрывают реальный путь трафика. ## K. Packaging / release diff --git a/traffic_core/src/firewall.rs b/traffic_core/src/firewall.rs index edf998c..dfe3fb2 100644 --- a/traffic_core/src/firewall.rs +++ b/traffic_core/src/firewall.rs @@ -121,12 +121,21 @@ fn apply_host_firewall(cfg: &Config) -> anyhow::Result<()> { return Ok(()); } + if host_firewall_drift_reason(cfg)?.is_none() { + return Ok(()); + } + let policy = cfg .host_firewall .default_input_policy .trim() .to_ascii_lowercase(); + run_allow_notfound( + transport.as_ref(), + &["nft", "delete", "table", "inet", HOST_FW_TABLE], + )?; + apply_host_firewall_batch(cfg, &policy)?; if let Some(reason) = host_firewall_drift_reason(cfg)? { @@ -136,8 +145,12 @@ fn apply_host_firewall(cfg: &Config) -> anyhow::Result<()> { } fn apply_host_firewall_batch(cfg: &Config, policy: &str) -> anyhow::Result<()> { + let batch = build_host_firewall_batch_script(cfg, policy); + run_nft_batch(&batch) +} + +fn build_host_firewall_batch_script(cfg: &Config, policy: &str) -> String { let mut batch = String::new(); - batch.push_str(&format!("delete table inet {HOST_FW_TABLE}\n")); batch.push_str(&format!("add table inet {HOST_FW_TABLE}\n")); batch.push_str(&format!( "add chain inet {HOST_FW_TABLE} input {{ type filter hook input priority filter; policy accept; }}\n" @@ -170,7 +183,7 @@ fn apply_host_firewall_batch(cfg: &Config, policy: &str) -> anyhow::Result<()> { batch.push_str(&format!( "set chain inet {HOST_FW_TABLE} input {{ policy {policy}; }}\n" )); - run_nft_batch(&batch) + batch } fn run_nft_batch(script: &str) -> anyhow::Result<()> { @@ -296,7 +309,10 @@ fn host_firewall_drift_reason_from_text(nt: &str, cfg: &Config) -> Option