直接解析 nft list ruleset json 比文本 grep 更可靠,因其结构化特性可精准提取表、链、规则、匹配条件和动作,适用于自动化巡检;关键字段包括 family、name、type、hook、expr 和 verdict;jq 命令可快速定位 drop 规则、未限源 IP 的 SSH 规则及统计链规则数;对接巡检系统时需定时采集 JSON、用 Python 遍历校验合规性并生成结构化报告;注意内核版本兼容性与字段稳定性。

直接解析 nft list ruleset json 输出比用文本 grep 更可靠,因为 JSON 是结构化格式,能准确提取表、链、规则、匹配条件和目标动作,适合集成进自动化巡检脚本。
理解核心字段层级
JSON 输出是嵌套对象数组,顶层为 ruleset,内含 table;每个 table 包含 chain;每个 chain 包含 rule;每条 rule 有 expr(匹配表达式)和 verdict(执行动作)。关键字段包括:
-
family:地址族,如
"inet"表示 IPv4/IPv6 双栈 -
name:表名(如
"global")、链名(如"input") -
type 和 hook:链类型(
"filter")与挂载点("input") -
expr 中的
match对象含left/right,例如{"op":"==","left":{"payload":{"protocol":"tcp","field":"dport"}},"right":22} -
verdict 如
{"accept":null}或{"drop":null}
用 jq 快速提取巡检关注项
无需写完整程序,一条 jq 命令就能定位风险配置。例如:
- 查所有显式
drop规则:nft list ruleset json | jq -r '.ruleset[].table[].chain[].rule[] | select(.verdict.drop) | "\(.table.name)/\(.chain.name) drop port \(.expr[].match?.right // "unknown")" - 找未限制源 IP 的 SSH 入站规则:
nft list ruleset json | jq -r '.ruleset[].table[].chain[].rule[] | select(.verdict.accept and (.expr[].match?.left.payload?.field == "dport" and .expr[].match?.right == 22)) | select(length == 1 or (.expr[].match?.left.meta?.key != "saddr")) | "WARNING: SSH open to all" - 统计各链规则数:
nft list ruleset json | jq '.ruleset[].table[].chain | {name:.name, rule_count:(.rule | length)}
对接巡检系统的典型流程
将 JSON 解析嵌入巡检主逻辑,可实现策略合规性自动打分:
- 定时执行
nft list ruleset json > /tmp/nft_rules.json - 用 Python 的
json.load()读取,遍历每条 rule,检查是否满足基线要求(如 INPUT 链默认策略为 drop、SSH 仅允许可信网段、无裸露的accept无条件规则) - 发现异常时记录
table.chain.rule.handle(如有)和具体匹配字段,便于快速定位修复 - 输出结构化报告(如 JSON 或 Markdown),供 FusionCare 或自建平台拉取展示
注意兼容性与稳定性
nftables 的 JSON Schema 在不同版本中基本稳定,但建议在目标环境先验证输出结构:
- 运行
nft list ruleset json | head -20确认顶层键为ruleset - 若使用较老内核(如 5.4 以下),可能不支持
json输出,需降级为nft list ruleset -a+ 正则解析 - 避免依赖未文档化的字段名,优先用
jq的安全导航操作符(如.expr[]?)防止解析失败











