测试

测试

给定处于未知配置状态的主机,我想知道是否有一种有效的方法可以非交互式地确定现有的防火墙规则集是否由iptables或管理nftables

听起来很简单,我已经考虑了很多,但还没有得到一个有意义的答案来编写脚本......

答案1

这个问题的一个变体最近在 Kubernetes 中得到了解决,所以值得看看那里做了什么。 (变体是是否使用iptables-legacyoriptables-nft及其 IPv6 变体来驱动主机的规则。)

Kubernetes 中采取的方法是查看各个“保存”命令输出的行数iptables-legacy-saveiptables-nft-save(及其 IPv6 变体)。如果前者产生十行或更多的输出,或者产生比后者更多的输出,则假设应该iptables-legacy使用;否则,iptables-nft应该使用它。

在您的情况下,决策树可能如下:

  • 如果iptables未安装,请使用nft;
  • 如果nft未安装,请使用iptables;
  • 如果iptables-save不产生任何规则定义输出,请使用nft;
  • 如果nft list tables并且nft list ruleset不产生任何输出,请使用iptables.

如果iptables-savenft list ...都产生输出,并且iptables不产生输出iptables-nft,我不确定自动化过程可以决定。

答案2

通过查看 的输出,您可以快速判断iptables或是否正在使用。不是 100% 最佳,因为它仍然需要一些输出解析,但非常简单。nftablesiptables -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

相关内容