firewalld-没有那个文件或目录

firewalld-没有那个文件或目录

从 Ubuntu 20.04 升级到 20.10 后,我想最终开始使用 Firewalld,而不是旧的手动 iptables 方法,但我从该服务中获得的只是以下内容,这也会破坏与 Docker 的任何网络集成:

Feb 13 13:28:20 myhost firewalld[36390]: ERROR: 'python-nftables' failed: internal:0:0-0: Error: Could not process rule: No such file or directory

该错误消息实际上没有什么帮助,因为它没有说明无法找到“什么”。

我还尝试直接使用命令执行 JSON blob(来自journalctl --unit firewalld --no-pagernft,但结果只给出了相同的错误消息,实际上多次出现。所以错误消息是来自的libnftables1

答案1

在查看了一些 Python 代码之后这里这里很明显,我需要反汇编这个大 JSON blob,看看究竟是哪些指令失败了,这导致我得到以下结果(将 JSON blob 存储到之后~/nftables.json):

jq '.nftables | length' ~/nftables.json

...获取条目数(在我的情况下是 225),然后:

for i in $(seq 1 224); do \
    jq --argjson index "$i" '{"nftables": [.nftables[0], .nftables[$index]]}' ~/nftables.json | tee nft.json; \
    sudo nft --json --file nft.json || break; \
done

...仅第一次输入就失败了:

{
  "nftables": [
    {
      "metainfo": {
        "json_schema_version": 1
      }
    },
    {
      "add": {
        "chain": {
          "family": "inet",
          "table": "firewalld",
          "name": "raw_PREROUTING",
          "type": "filter",
          "hook": "prerouting",
          "prio": -290
        }
      }
    }
  ]
}
internal:0:0-0: Error: No such file or directory

由于这只是添加一个链,所以这里唯一可能出错的是缺少一个表,这已得到证实:

$ sudo nft list tables
table bridge filter
table bridge nat

...所以我们需要添加它:

sudo nft add table inet firewalld

在经历了更多类似的失败之后,我最终只能手动添加以下表格:

table inet firewalld
table ip firewalld
table ip6 firewalld

相关内容