用 nftables 实现多协议统一审计的关键是基于 inet 表、连接跟踪与条件日志,单规则覆盖 tcp/udp/icmp/icmpv6,通过 prefix 分类、counter 计数和动态集合实现可追溯、可聚合、可防御的闭环审计。

用 nftables 实现多协议流量的统一安全审计与记录,关键在于**不按协议拆链、不重复写日志规则**,而是依托 inet 地址簇、连接跟踪(ct)和统一日志表达式,在单条规则中覆盖 TCP/UDP/ICMP/ICMPv6 等主流协议,并确保每类关键事件可追溯、可分类、可聚合。
用 inet 表统一处理 IPv4 和 IPv6 流量
避免为 ip 和 ip6 分别建表写两套规则。直接使用 inet 表,一条规则同时匹配双栈流量:
- 创建统一审计表:
nft add table inet audit - 在 INPUT/FORWARD 链中启用连接状态识别:
nft add chain inet audit input { type filter hook input priority -100; } - 所有后续规则都基于此链编写,无需区分 ipv4_addr 或 ipv6_addr ——
ip saddr和ip6 saddr在 inet 表中由inet saddr自动兼容
对不同协议采用差异化但统一的日志标记
不是给每个协议单独加 log,而是用 条件日志 + prefix 分类,让日志本身携带协议语义:
- TCP 连接尝试:
nft add rule inet audit input tcp flags & (fin | syn | rst | ack) != 0 log prefix "TCP-SCAN: " level warn counter drop - UDP 非服务端口访问:
nft add rule inet audit input udp dport != { 53, 67, 68, 123 } log prefix "UDP-PROBE: " level info counter accept - ICMP 异常请求(如时间戳、地址掩码):
nft add rule inet audit input ip protocol icmp icmptype { timestamp-request, address-mask-request } log prefix "ICMP-LEGACY: " level notice drop - ICMPv6 非必需类型(如 MLD 报告以外的):
nft add rule inet audit input icmpv6 type != { nd-neighbor-solicit, nd-neighbor-advert, nd-router-advert, mld-listener-report } log prefix "ICMPv6-UNWANTED: " level info counter accept
用计数器 + 日志组合实现可审计的流量基线
单纯打日志易被刷屏淹没,必须绑定 counter 并配合定期导出,才能形成审计依据:
- 每条审计规则末尾都加
counter,例如:log prefix "SSH-BRUTE: " level alert counter - 用
nft list ruleset -a查看带 handle 的规则,再通过nft get counter inet audit input handle XXX提取精确包/字节计数 - 写个简单脚本每小时 dump 一次关键计数器值到 CSV,字段含:时间、规则前缀、packet_count、byte_count —— 这就是你的原始审计数据源
- 不要依赖 syslog 实时解析做分析;先落盘计数,再离线聚合,更稳定可靠
把“可疑行为”转为动态集合自动封禁
审计不只是看,还要闭环。把高频异常行为自动转入黑名单集,实现“记录即防御”:
- 建动态 IP 集:
nft add set inet audit bad_actors { type ipv4_addr; flags dynamic; timeout 1h; } - 对 5 分钟内触发 3 次以上 ICMP 异常或 UDP 探测的源 IP,自动加入集合:
nft add rule inet audit input ip protocol icmp icmptype { timestamp-request } ct count over 3 add @bad_actors { ip saddr } drop - 后续在 INPUT 链头部加拦截规则:
nft add rule inet audit input ip saddr @bad_actors log prefix "BLOCKED-BY-AUDIT: " drop - 这样,审计日志里出现的每一行 “BLOCKED-BY-AUDIT”,都对应一条可回溯的原始触发记录










