nftables dynamic set 是拦截分布式扫描最实用的内核级机制,通过 timeout 集合实现毫秒级自动封禁与过期,结合速率检测、tcp异常行为及http日志联动触发,支持/24聚合、hash优化与闭环反馈。

Nftables 的 Dynamic Set(带超时的动态集合)是拦截分布式黑客扫描最实用的内核级机制——它不依赖用户态轮询,添加即生效,毫秒级阻断,且自动过期,避免误封堆积。关键不是“建一个黑名单”,而是让集合成为行为响应的执行终点。
本文档主要讲述的是Android linux内核介绍;Android内核是基于Linux 2.6内核的(目前最新开发版本是2.6.31),它是一个增强内核版本,除了修改部分Bug外,它提供了用于支持Android平台的设备驱动,希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
用 timeout 集合承载临时封禁决策
Dynamic Set 的核心是 flags timeout,所有元素自带生存时间,到期自动移除,无需脚本清理:
- 创建 IPv4 动态黑名单:
nft add set ip filter scan_drop { type ipv4_addr; flags timeout; } - 在 input 链开头插入匹配规则(务必靠前,早于 ACCEPT):
nft add rule ip filter input ip saddr @scan_drop drop - 封禁某 IP 并设 10 分钟有效期:
nft add element ip filter scan_drop { 203.0.113.42 timeout 10m }
把扫描行为信号实时转为集合操作
单靠 nftables 无法识别“扫描”,必须由外部信号触发封禁。常见可靠信号源有三类:
-
连接速率突增:用
limit rate 15/second burst 30规则配合 counter + log,脚本每 5 秒检查计数器,对连续超限 IP 写入集合 -
异常 TCP 半开行为:匹配
tcp flags & (syn | ack) == syn ct state invalid,同一源 IP 3 秒内出现 5 次即封 -
HTTP 层联动日志:Nginx 中记录
404 /wp-admin/、400 /api/v1/login等路径,用fail2ban或自写 Python 脚本解析 access.log,提取remote_addr后批量写入集合
应对分布式扫描的关键设计细节
分布式扫描通常 IP 多、单 IP 请求少、端口轮换快,静态封单个 IP 效果差。需结合以下策略提升命中率:
- 封禁粒度从
/32提升到/24:若 198.51.100.10~198.51.100.35 在 1 分钟内各有 8 次 SYN 扫描,可脚本聚合为198.51.100.0/24写入集合(需 set 类型设为interval) - 使用
@hash映射替代纯 IP 列表:支持百万级条目,查找仍是 O(1),避免集合过大拖慢匹配 - 所有封禁动作加
log prefix "SCAN-AUTO:" level warn,确保每次写入集合都有日志回溯,方便验证是否误伤
闭环反馈:让封禁本身产生新防护依据
一次成功拦截不应是终点。可将被 @scan_drop 匹配的流量再导出分析:
- 添加第二条规则:
nft add rule ip filter input ip saddr @scan_drop log prefix "SCAN-HIT:" level notice counter - 用
journalctl -t kernel | grep SCAN-HIT统计各 IP 被拦截频次,高频者升级为长期黑名单(写入无 timeout 的静态 set) - 抽取
SCAN-HIT日志中的目的端口分布,若 90% 集中在 22/3389/5900,说明是弱口令爆破,可针对性加强 SSH 认证策略
本质上,Dynamic Set 不是“智能”,而是把判断逻辑交给更擅长的组件(日志分析器、速率统计器、威胁情报平台),nftables 只做一件事:接到指令就立刻丢包,且不拖泥带水。










