You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过声明式规范配置nftables?

如何通过声明式规范配置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 08:32:49