给定处于未知配置状态的主机,我想知道是否有一种有效的方法可以非交互式地确定现有的防火墙规则集是否由iptables
或管理nftables
。
听起来很简单,我已经考虑了很多,但还没有得到一个有意义的答案来编写脚本......
答案1
这个问题的一个变体最近在 Kubernetes 中得到了解决,所以值得看看那里做了什么。 (变体是是否使用iptables-legacy
oriptables-nft
及其 IPv6 变体来驱动主机的规则。)
Kubernetes 中采取的方法是查看各个“保存”命令输出的行数、iptables-legacy-save
和iptables-nft-save
(及其 IPv6 变体)。如果前者产生十行或更多的输出,或者产生比后者更多的输出,则假设应该iptables-legacy
使用;否则,iptables-nft
应该使用它。
在您的情况下,决策树可能如下:
- 如果
iptables
未安装,请使用nft
; - 如果
nft
未安装,请使用iptables
; - 如果
iptables-save
不产生任何规则定义输出,请使用nft
; - 如果
nft list tables
并且nft list ruleset
不产生任何输出,请使用iptables
.
如果iptables-save
和nft list ...
都产生输出,并且iptables
不产生输出iptables-nft
,我不确定自动化过程可以决定。
答案2
通过查看 的输出,您可以快速判断iptables
或是否正在使用。不是 100% 最佳,因为它仍然需要一些输出解析,但非常简单。nftables
iptables -V
红帽有一个博客文章从 2020 年 8 月开始,相关指导也适用于 Ubuntu。
该命令的两个变体
iptables
是:
legacy
:通常称为iptables-legacy
。nf_tables
:通常称为iptables-nft
。较新的
iptables-nft
命令提供了通往 nftables 内核 API 和基础设施的桥梁。
您可以通过查找 iptables 版本来了解正在使用哪个变体。
Ubuntu 22.04(nftables)
对于
iptables-nft
,变体将显示在版本号后面的括号中,表示为 nf_tables:
# iptables -V
iptables v1.8.7 (nf_tables)
Ubuntu 20.04(iptables)
对于
iptables-legacy
,变体要么不存在,要么在括号中显示旧版:
# iptables -V
iptables v1.8.4 (legacy)
测试
因此,用 grep 进行一个简单的测试来确定我们是否是 nftables:
iptables -V | grep -E ' \(nf_tables\) *$'
...将来可能iptables
不再默认分发,因此更面向未来的测试将如下所示:
if command -v iptables; then
if iptables -V | grep -E ' \(nf_tables\) *$'; then
echo "nft"
else
echo "iptables"
fi
elif command -v nft; then
echo "nft";
fi