ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

抓包分析器 Day 14:SYN Flood 洪水攻击检测与半连接队列监控

抓包分析器 Day 14:SYN Flood 洪水攻击检测与半连接队列监控 抓包分析器 Day 14SYN Flood 洪水攻击检测与半连接队列监控今天是 9 月 14 日抓包分析器PacketAnalyzer CLI正式进入第三周W3实战开发的第一天。在前两周的工作中我们实现了全链路零拷贝协议解析、TCP 状态机跟踪与 BPF 规则过滤。从今天开始我们将全面挺进网络安全与异常流量防御的深水区在所有传输层网络攻击中SYN FloodSYN 洪水拒绝服务攻击是历史最悠久、破坏力最强、发生频率最高的一种经典攻击。攻击者利用伪造的源 IP 地址向目标服务器的开放端口如 80、443源源不断地发送成千上万个只有SYN标志位的单向握手报文却故意不回复最后的 ACK。这会导致服务器内核的**半连接队列SYN Queue / Backlog**被瞬间占满正常用户的合法连接请求被全部丢弃造成严重的业务瘫痪。今天我们的任务是在packet-filter模块中实现一个工业级的SYN Flood 实时检测与半连接队列水位监控引擎支持滑动时间窗口频次统计、孤立 SYN 比率计算与攻击源 IP 实时告警1. SYN Flood 攻击的底层网络原理与特征图谱【正常三次握手】: Client ── SYN ──► Server (分配半连接节点) Client ◄─ SYNACK ─ Server Client ── ACK ──► Server ──► 握手成功迁移至全连接队列 (Accept Queue) 【SYN Flood 攻击】: Attacker 1 (伪造 IP) ── SYN ──► Server (挂起等待 ACK...) Attacker 2 (伪造 IP) ── SYN ──► Server (挂起等待 ACK...) Attacker 3 (伪造 IP) ── SYN ──► Server (半连接队列溢出! drop new connections!)攻击的核心统计学特征单位时间内 SYN 报文数量突发暴增如 1000 次/秒SYN / ACK 报文比率严重失衡正常流量下 SYN:ACK 约为 1:1攻击时 SYN 占比高达 95% 以上半开连接Half-Open Sessions长时间未收到对端 ACK 确认。2. 编写滑动时间窗口与半连接监控引擎在crates/packet-filter/src/syn_flood_detector.rs中// crates/packet-filter/src/syn_flood_detector.rs use packet_core::ipv4::Ipv4Header; use packet_core::tcp::TcpHeader; use std::collections::HashMap; use std::net::Ipv4Addr; use std::time::{Duration, Instant}; #[derive(Debug, Clone)] pub struct SynFloodAlert { pub target_ip: Ipv4Addr, pub target_port: u16, pub syn_rate_per_sec: u64, pub half_open_count: usize, pub syn_to_ack_ratio: f64, } struct IpFlowStats { syn_count: u64, ack_count: u64, window_start: Instant, half_open_timestamps: VecInstant, } pub struct SynFloodDetector { stats_map: HashMap(Ipv4Addr, u16), IpFlowStats, // Key: (DstIP, DstPort) threshold_syn_per_sec: u64, window_duration: Duration, half_open_timeout: Duration, } impl SynFloodDetector { pub fn new(threshold_syn_per_sec: u64) - Self { Self { stats_map: HashMap::new(), threshold_syn_per_sec, window_duration: Duration::from_secs(1), half_open_timeout: Duration::from_secs(5), } } /// 接收一个新报文并实时检测是否触发 SYN Flood pub fn process_packet( mut self, ip: Ipv4Header, tcp: TcpHeader, ) - OptionSynFloodAlert { let now Instant::now(); let key (ip.dst_ip, tcp.dst_port); let stats self.stats_map.entry(key).or_insert_with(|| IpFlowStats { syn_count: 0, ack_count: 0, window_start: now, half_open_timestamps: Vec::new(), }); // 1. 滑动时间窗口重置每 1 秒为一个统计窗口 if now.duration_since(stats.window_start) self.window_duration { stats.syn_count 0; stats.ack_count 0; stats.window_start now; } // 2. 清理超过 5 秒未完成握手的过期半连接 stats.half_open_timestamps.retain(|t| now.duration_since(t) self.half_open_timeout); // 3. 统计标志位 if tcp.flags.syn !tcp.flags.ack { stats.syn_count 1; stats.half_open_timestamps.push(now); } else if tcp.flags.ack !tcp.flags.syn { stats.ack_count 1; // 收到确认移除一个半连接 if !stats.half_open_timestamps.is_empty() { stats.half_open_timestamps.pop(); } } // 4. 判定是否触发 SYN Flood 告警 let half_open stats.half_open_timestamps.len(); if stats.syn_count self.threshold_syn_per_sec half_open 50 { let total stats.syn_count stats.ack_count; let ratio if total 0 { stats.syn_count as f64 / total as f64 } else { 1.0 }; if ratio 0.85 { // SYN 占比超过 85% return Some(SynFloodAlert { target_ip: key.0, target_port: key.1, syn_rate_per_sec: stats.syn_count, half_open_count: half_open, syn_to_ack_ratio: ratio, }); } } None } }3. 在 TUI 看板与 AI 诊断中实时告警联动当检测器触发告警时packet-cli自动在 TUI 告警栏输出警示并一键将攻击参数投递给 AI 诊断引擎生成iptables拦截策略if let Some(alert) syn_detector.process_packet(ip_hdr, tcp_hdr) { let alert_msg format!( ⚠ [SYN Flood 告警] 目标: {}:{} | 速率: {} SYN/s | 半连接积压: {} | SYN占比: {:.1}%, alert.target_ip, alert.target_port, alert.syn_rate_per_sec, alert.half_open_count, alert.syn_to_ack_ratio * 100.0 ); // 1. 终端 TUI 高亮展示 tui_state.push_alert(alert_msg); // 2. 自动触发 AI 诊断生成防御命令 let prompt format!( 检测到目标 IP {} 端口 {} 正在遭受 SYN Flood 攻击SYN 速率达到 {}/s。请给出 Linux 内核 sysctl 调优参数 (如 tcp_syncookies) 以及具体的 iptables 限速拦截命令。, alert.target_ip, alert.target_port, alert.syn_rate_per_sec ); ai_pipeline.request_diagnosis(prompt); }4. 单元测试驱动模拟攻击验证#[cfg(test)] mod tests { use super::*; use packet_core::tcp_flags::TcpFlags; #[test] fn test_syn_flood_detection_triggers_alert() { let mut detector SynFloodDetector::new(100); // 阈值: 100 SYN/s let dst_ip Ipv4Addr::new(192, 168, 1, 50); let ip Ipv4Header { dst_ip, ..Default::default() }; let syn_tcp TcpHeader { dst_port: 80, flags: TcpFlags { syn: true, ack: false, ..Default::default() }, ..Default::default() }; // 模拟连续涌入 120 个孤立 SYN 报文 let mut alert_triggered false; for _ in 0..120 { if let Some(alert) detector.process_packet(ip, syn_tcp) { assert_eq!(alert.target_ip, dst_ip); assert_eq!(alert.target_port, 80); alert_triggered true; } } assert!(alert_triggered, 期望成功触发 SYN Flood 告警); } }总结与明日规划今天成功实现了网络安全防御的核心组件——SYN Flood 实时检测引擎基于 1 秒滑动窗口与半连接生存期跟踪实现了纳秒级的快速特征统计结合 SYN:ACK 失衡比率精准过滤误报为联动终端 TUI 告警与 AI 防御脚本生成打通了第一道关口。明天Day 15我们将攻克应用层攻击的重头戏——慢速拒绝服务Slowloris DoS攻击特征识别与 HTTP 连接挂起嗅探
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进