From a4bb7adb4f226933fdf83ee4436ddcc2cdf22df8 Mon Sep 17 00:00:00 2001 From: Crimson Date: Sun, 10 May 2026 18:07:05 +0500 Subject: [PATCH] =?UTF-8?q?Traffic:=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D1=82=D1=8C=20=D0=B4=D0=B5=D1=82=D0=B5=D0=BA=D1=82=20ing?= =?UTF-8?q?ress=20redirect=20=D0=B4=D0=BB=D1=8F=20=D1=80=D0=B5=D0=B0=D0=BB?= =?UTF-8?q?=D1=8C=D0=BD=D0=BE=D0=B3=D0=BE=20=D0=B2=D1=8B=D0=B2=D0=BE=D0=B4?= =?UTF-8?q?=D0=B0=20tc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit has_ingress_redirect_to_ifb переведён на case-insensitive разбор и поддержку обоих вариантов: dev и device . Добавлены тесты на lowercase dev-формат и отрицательный кейс с другим ifb. Также синхронизирован docs/ANTI_TORRENT.md: единая шкала threshold (100 default, 150 мягче, 200/250 permissive, 70 агрессивный), и антипример over 200 явно помечен как non-default/non-production. --- docs/ANTI_TORRENT.md | 10 +++++----- traffic_core/src/traffic.rs | 27 +++++++++++++++++++++++---- 2 files changed, 28 insertions(+), 9 deletions(-) diff --git a/docs/ANTI_TORRENT.md b/docs/ANTI_TORRENT.md index f26a040..dabb900 100644 --- a/docs/ANTI_TORRENT.md +++ b/docs/ANTI_TORRENT.md @@ -10,7 +10,7 @@ ## 2. Важное исправление к простой команде -Не использовать такую форму как production rule: +Не использовать такую форму как production rule (это антипример; `200` здесь не default и не production-рекомендация): ```nft nft add rule inet filter forward ip saddr 10.8.1.0/24 ct count over 200 drop @@ -75,10 +75,10 @@ max_connections_per_peer = 100 Практические варианты: -- `150` — агрессивнее, больше риск задеть редкие легитимные сценарии. -- `100` — production default. -- `150` — мягче и более permissive при редких жалобах. -- `200/250` — ещё более permissive варианты, если нужно дополнительно снизить риск false positives. +- `100` — production default, более строгий режим. +- `150` — мягче, если есть жалобы на false positives. +- `200/250` — ещё более permissive варианты. +- `70` — агрессивный режим только после наблюдения реального трафика. ## 5. Почему это должно быть в orchestrator diff --git a/traffic_core/src/traffic.rs b/traffic_core/src/traffic.rs index d90baa5..f52b020 100644 --- a/traffic_core/src/traffic.rs +++ b/traffic_core/src/traffic.rs @@ -575,11 +575,16 @@ fn has_fq_codel_for_parent(raw_qdisc: &str, parent_class: &str) -> bool { } fn has_ingress_redirect_to_ifb(output: &str, ifb_name: &str) -> bool { + let ifb_lower = ifb_name.to_ascii_lowercase(); + let needle_dev = format!("dev {ifb_lower}"); + let needle_device = format!("device {ifb_lower}"); + output.lines().any(|line| { - line.contains("mirred") - && line.contains("redirect") - && line.contains(&format!("dev {ifb_name}")) - }) || output.contains(&format!("redirect dev {ifb_name}")) + let l = line.to_ascii_lowercase(); + l.contains("mirred") + && l.contains("redirect") + && (l.contains(&needle_dev) || l.contains(&needle_device)) + }) } fn link_is_up(output: &str) -> bool { @@ -1030,6 +1035,20 @@ mod tests { assert!(has_ingress_redirect_to_ifb(raw, "ifb0")); } + #[test] + fn detects_ingress_redirect_to_ifb_dev_format_lowercase() { + let raw = + "filter parent ffff: protocol all pref 1 u32\n action order 1: mirred egress redirect dev ifb0"; + assert!(has_ingress_redirect_to_ifb(raw, "ifb0")); + } + + #[test] + fn does_not_match_redirect_to_other_ifb() { + let raw = + "filter parent ffff: protocol all pref 1 u32\n action order 1: mirred (Egress Redirect to device ifb1) stolen"; + assert!(!has_ingress_redirect_to_ifb(raw, "ifb0")); + } + #[test] fn detects_ifb_up_state() { assert!(link_is_up(