我收到了同样的错误信息。我在 firewalld 上启用了详细调试并跟踪日志以进行更深入的研究。在我的情况下,异常最初发生在“361”行的“nftables.py”中。
例外:
2022-01-23 14:00:23 DEBUG3: : 使用 JSON blob 调用 python-nftables: {"nftables": [{"metainfo": {"json_schema_version ": 1}}, {"add": {"chain": {"family": "inet", "table": "firewalld", "name": "filter_IN_policy_allow-host-ipv6"}}}]}
2022-01-23 14:00:23 DEBUG1:回溯(最近一次通话最后):
文件“/usr/lib/python3.6/site-packages/firewall/core/fw.py”,第 888 行,在规则中
backend.set_rule(规则,self._log_denied)
文件“/usr/lib/python3.6/site-packages/firewall/core/nftables.py”,第 390 行,在 set_rule
self.set_rules([rule], log_denied)
文件“/usr/lib/python3.6/site-packages/firewall/core/nftables.py”,第 361 行,在 set_rules
raise ValueError("'%s' failed: %s\nJSON blob:\n%s" % ("python-nftables", error, json.dumps(json_blob)))
ValueError:'python-nftables'失败:内部:0:0-0:错误:无法处理规则:数值结果超出范围
“nftables.py”中的第 361 行:
self._loader(config.FIREWALLD_POLICIES, "policy")
为什么会出现这个问题:
基本上 nftables 是一个后端服务,而 firewalld 是一个前端服务。它们相互依赖才能发挥作用。每次重新启动 firewalld 时,它都必须协调后端,在这种情况下是 nftables。在协调过程中的某个时刻,python 代码中发生了冲突。这是不幸的,因为唯一真正的解决方案可能必须来自 nftables 的代码改进,即它如何能够将策略填充到链和表中。
解决方法:
好消息是,如果你和我一样,你不使用 ipv6,在这种情况下,我们只是禁用策略而不是解决问题。我将把解决步骤放在下面。
解决步骤:
删除策略的正确方法是使用命令 "firewall-cmd --delete-policy=allow-host- ipv6 --permanent" 但我在尝试执行此操作时在 python 中遇到了其他错误和异常。由于我不关心 ipv6,我从配置中手动删除了 XML 并重新启动了 firewalld 服务。
rm /usr/lib/firewalld/policies/allow-host-ipv6.xml
rm /etc/firewalld/policies/allow-host-ipv6.xml
systemctl 重启防火墙
旁注:
一旦我解决了这个冲突,我在 nftables/iptables/fail2ban 之间也有一些额外的冲突,必须清除。为此,我只是使用命令“fail2ban-client unban --all”来让fail2ban擦除它添加到iptables的所有链。