nftables 不是 ids/ips,不内置攻击特征库,其核心作用是高效分流与预筛:优先放行可信流量、快速丢弃明显恶意包、用 map/set 实现高速黑白名单、精准导流至检测引擎,并避免 log/counter 拖慢主路径。

nftables 本身不内置攻击特征库(如 Snort 的 sig、Suricata 的规则集),它也不是 IDS/IPS 引擎,而是 Linux 内核的包过滤与转发框架。因此,“对网络攻击特征库匹配”这件事,不能直接靠 nftables 规则完成——但你可以通过结构化设计 + 协同机制,让特征匹配过程更高效、更可控、更低开销。
关键不是“让 nftables 去做深度特征匹配”,而是让它快速分流、预筛、卸载或触发外部检测系统,避免把所有流量都拖进高成本匹配路径。
1. 把特征匹配前的流量压缩到最小
攻击特征匹配(比如 HTTP URI 检查、TLS SNI 提取、payload 关键字扫描)通常由用户态工具(如 Suricata、Zeek)或 eBPF 程序完成,这些操作昂贵。nftables 的首要任务是:不让无关流量到达检测点。
-
优先放行可信流量:管理网段、内网服务、已建立连接(
ct state established,related accept)——这类包占实际流量 70%+,应第一条就放行,不参与后续任何判断。 -
提前丢弃明显恶意包:例如非法状态(
ct state invalid drop)、伪造源(ip saddr { 0.0.0.0/8, 127.0.0.0/8, 224.0.0.0/4 } drop)、异常协议组合(ip protocol icmp ip ihl != 5 drop)。 -
用
notrack绕过 conntrack:对纯探测类流量(如 ICMP ping、UDP DNS 查询、HTTP 健康探针),加ct state invalid drop后紧跟meta nfproto ipv4 meta pkttype host notrack,跳过连接跟踪开销,减少内核处理路径长度。
2. 用 map/set 实现高速黑白名单分流
特征库中大量规则依赖 IP、端口、ASN、GeoIP 等维度做初筛。硬编码规则链会线性扫描,性能随条目数下降;换成结构化对象可恒定时间匹配。
-
IP 黑名单 → map:
nft add map inet filter ip2drop { type ipv4_addr : verdict \; } nft add element inet filter ip2drop { 192.0.2.100 : drop, 203.0.113.42 : drop } nft add rule inet filter input ip saddr @ip2drop counter drop支持万级条目,查找耗时基本不变,比 100 条
ip saddr x.x.x.x drop快一个数量级。 -
端口/协议组合 → named set:
nft add set inet filter bad_ports { type inet_service \; } nft add element inet filter bad_ports { 6667, 6697, 7000-7005 } nft add rule inet filter input tcp dport @bad_ports ct state new counter drop -
子网级策略 → prefix set + limit:
针对扫描行为(如 /24 子网每秒新建连接超阈值),用ct mark标记后限速:nft add chain inet filter scan_mark { type filter hook input priority -100 \; } nft add rule inet filter scan_mark ip saddr 192.0.2.0/24 ct mark set 0x1 nft add rule inet filter input ct mark 0x1 tcp flags & (fin | syn) == syn \ limit rate 5/second burst 3 counter drop
3. 为特征检测引擎“减负”和“导流”
真正做 payload 匹配的组件(如 Suricata)应只处理经 nftables 初筛后的可疑流量,而非全量镜像。
-
用
queue或nflog精准导流:
不要用log全量打日志,而用queue num 0将特定流量送入用户态:nft add rule inet filter input tcp dport 80 ct state new \ @http_sig_match_counter counter queue num 0配合
nfqnl库,Suricata 可只监听队列 0,避免捕获无意义流量。 用
ct event触发联动:
结合nft monitor trace或ct helper,当检测到某类连接(如 TLS 握手失败频次高),动态更新@ip2drop,实现闭环响应。eBPF 辅助特征预判(进阶):
在prerouting链挂载轻量 eBPF 程序,提取 TCP 选项、TLS ClientHello 中的 SNI 或 JA3 指纹,若命中已知恶意指纹,直接drop或mark,绕过用户态检测延迟。
4. 避免拖慢主路径的“伪优化”
很多管理员误以为加 counter 或 log 是“可观测性”,实则是性能黑洞:
-
logtarget 在高并发下引发频繁软中断,CPU 花在写 ring buffer 和刷缓存上; -
counter每包原子更新,在千兆线速下易成瓶颈; -
正确做法:
- 仅调试时开
log prefix "ATTACK_TEST" limit rate 1/second; - 生产环境用
nft list chain filter input -a查看计数器,不实时轮询; - 长期统计改用
conntrack -S或 eBPF map(如bpftool map dump),完全脱离 netfilter 规则路径。
- 仅调试时开
不复杂但容易忽略











