nftables 实现秒级僵尸网络扫描过滤的核心是结合连接跟踪、速率限制、动态黑名单与自动化响应;通过 @hash 和 limit 在内核态统计连接速率,配合 ct 状态识别异常行为,脚本监听日志自动更新带 ttl 的黑名单,并联动威胁情报,所有规则需配 counter 和 log 以便验证。

用 nftables 实现对大规模僵尸网络扫描的秒级自动过滤,核心不在于“单条规则多快”,而在于结合连接跟踪、速率限制、动态黑名单和自动化响应机制,让系统在毫秒到秒级内识别异常扫描行为并阻断后续流量。纯靠静态规则无法应对新型或分布式扫描,必须引入状态感知与实时决策逻辑。
基于连接速率的实时扫描识别
nftables 的 @hash 和 limit 语句可直接在内核态完成每秒连接数统计,避免用户态轮询开销。例如,对单一目标端口(如 22、80、443)来自同一源 IP 的新建连接,超过 10 次/秒即标记为可疑:
nft add rule inet filter input tcp dport { 22, 80, 443 } ct state new limit rate 10/second burst 20 packets counter name ssh_http_scan
配合 ct state invalid drop 和 ip saddr @badhosts drop,可立即拦截已标记 IP 的后续包。关键点是使用 burst 容忍短暂合法峰值,同时确保限速粒度足够细(如按 /32 源 IP 统计),防止扫描器轮换端口绕过。
自动构建并更新动态黑名单
将 nftables 的匿名映射(anonymous map)作为运行时黑名单载体,通过脚本监听日志或 nft 计数器触发添加:
- 用
nft list counters或nftrace+ulogd2捕获高频连接事件 - Python/Bash 脚本解析后执行:
nft add element inet filter badhosts { 192.0.2.100 } - 设置 TTL(如 300 秒)自动过期:
nft add element inet filter badhosts { 192.0.2.100 timeout 5m }
无需重启规则,新增 IP 立即生效。建议搭配 ipset 兼容模式或用 @badhosts 哈希表,支持百万级条目且查找复杂度 O(1)。
利用 conntrack 状态做上下文过滤
僵尸网络扫描常表现为大量 SYN 包无 ACK 回应(SYN 扫描)或快速完成 TCP 握手但无应用层交互(全连接扫描)。nftables 可结合 conntrack 状态与超时行为识别:
- 丢弃短生命周期连接:
ct state established,related ct expiration 30s drop - 限制新连接并发数:
ip saddr . ip daddr @conn_limit ct state new limit rate 50/minute - 对 3 秒内建立又关闭的连接记录源 IP 并加入黑名单
这类规则依赖内核 conntrack 表的实时状态,比仅看五元组更准确,能区分真实业务连接与扫描试探。
与外部威胁情报联动(可选增强)
定期拉取公开 IOC(如 AbuseIPDB、Emerging Threats),用脚本转换为 nftables 元素批量导入:
curl -s "https://api.abuseipdb.com/api/v2/blacklist?confidenceMinimum=90" \
-H "Key: YOUR_KEY" | jq -r '.data[].ipAddress' | \
xargs -I{} nft add element inet filter badhosts { {} }
注意控制同步频率(如每小时一次),避免频繁写入影响性能;生产环境建议先写入临时表,再原子替换主表(nft rename set ...),保证规则连续性。
不复杂但容易忽略的是:所有自动过滤动作必须带明确计数器和日志标记(counter log prefix "SCAN_BLOCK:"),否则无法验证效果或调试误杀。真正实现“秒级”响应,靠的是内核态规则匹配 + 用户态轻量脚本 + 合理的过期策略,而不是追求单次检测速度。










