如何通过声明式规范配置nftables?
嘿,刚好我对这块门儿清,给你捋几个实用的路子,完全能满足你用JSON/YAML/TOML这类结构化声明式格式来配置nftables的需求:
用nftables原生的声明式配置+结构化转换工具
nftables本身支持.nft后缀的声明式配置文件,要是你偏爱JSON这类格式,可以用nft list ruleset -j把现有规则导出成JSON,修改后再用nft -j -f your-rules.json导入。举个简单的JSON规则例子:{ "ruleset": { "tables": [ { "name": "filter", "family": "inet", "chains": [ { "name": "input", "type": "filter", "hook": "input", "priority": 0, "policy": "accept", "rules": [ { "expr": [{"match": {"op": "==", "left": {"reg": 1}, "right": {"num": 22, "base": "dec"}}}, {"accept": null}] } ] } ] } ] } }导出的JSON格式会比较严谨,修改后直接用命令就能加载生效。
借助
nft-json工具简化操作
有个专门的工具叫nft-json,能帮你在JSON和nft规则之间无缝转换。你只需要用JSON写好规则结构,然后运行sudo nft-json import your-rules.json就能直接应用。它的语法比原生导出的JSON更简洁,适合手动编写。用配置管理工具实现声明式部署
如果你是在多台机器上配置,用Ansible这类工具简直绝了。Ansible的community.general.nftables模块支持直接用YAML定义规则,然后通过playbook批量应用。比如这个简单的playbook例子:- name: 配置nftables规则 hosts: all tasks: - name: 加载自定义nft规则 community.general.nftables: ruleset: | table inet filter { chain input { type filter hook input priority 0; policy accept; tcp dport 22 accept tcp dport 80 accept } } state: present你还可以把规则拆成YAML变量,用模板生成更灵活的配置,完全符合声明式的思路。
自己写个轻量转换脚本
要是上面的工具都不合你的胃口,写个简单的脚本也不难。比如用Python读取YAML格式的规则清单,然后自动生成对应的.nft配置文件,最后用sudo nft -f generated-rules.nft加载。举个YAML规则的例子:tables: - name: filter family: inet chains: - name: input hook: input priority: 0 policy: accept rules: - accept tcp dport 22 - accept tcp dport 443脚本逻辑也很简单,就是把YAML的结构转成nft的语法就行。
另外提一句,Firewalld现在默认底层用的就是nftables,它的配置也是声明式的(比如用XML文件或者firewall-cmd的持久化命令),不过如果想直接用JSON/YAML这类格式,还是上面的方法更直接。
最后提醒下:不管用哪种方法,先备份现有规则(nft list ruleset > backup.rules),测试的时候最好在本地或者测试机上先验证,避免不小心搞断网哦!
备注:内容来源于stack exchange,提问作者Corey

