从 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-pager
)nft
,但结果只给出了相同的错误消息,实际上多次出现。所以错误消息是来自的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