我最近一直在使用该iptables-save
命令(与 结合使用iptables-restore
),并注意到一些我不明白的不一致行为。我确信这不是一个错误,因为它是一个太流行的命令,不可能被忽视,这意味着我自己的理解存在缺陷。我查看了手册页和各种文档来源,但找不到任何可以解释我所观察到的内容。
问题是,当我运行命令时iptables-save
,我希望看到filter
表转储到 stdout(根据文档)。但实际上我看到的什么都没有,例如:
[root@rhel9 ~]# iptables --list
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
[root@rhel9 ~]#
...
[root@rhel9 ~]# iptables-save
[root@rhel9 ~]#
stdout
如您所见,命令没有任何输出。同样,如果我运行命令并尝试重定向输出或传递-f <output file>
选项,输出仍然是空白的。
如果我指定了我想要查看的表,我会得到输出,例如:
[root@rhel9 ~]# iptables-save -t filter
# Generated by iptables-save v1.8.8 (nf_tables) on Wed Jan 8 16:43:11 2025
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT
# Completed on Wed Jan 8 16:43:11 2025
如果我将此输出保存到文件,ipv4backup
然后调用iptables-restore
该文件,则行为iptables-save
会有所不同:
[root@rhel9 ~]# iptables-restore ipv4backup
[root@rhel9 ~]#
[root@rhel9 ~]# iptables --list
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
[root@rhel9 ~]#
[root@rhel9 ~]# iptables-save
# Generated by iptables-save v1.8.8 (nf_tables) on Wed Jan 8 16:44:03 2025
*filter
:INPUT ACCEPT [5:305]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [5:914]
COMMIT
# Completed on Wed Jan 8 16:44:03 2025
iptables-save
上面的示例中的表包含相同的内容,但是根据是否iptables-restore
事先调用,其行为有所不同。
我在 RHEL9 和 Ubuntu 22.04 上对此进行了测试,两者都表现出相同的行为。在 SuSE 15 上,该命令运行并生成所有表的输出,无论iptables-restore
之前是否运行过。等效ip6tables...
命令表现出相同的行为。
所以,问题是(基于上面观察到的行为),为什么iptables-save
当表为空时不产生输出,但是如果我们恢复空表并再次调用该命令,我们会得到预期的输出(即空表)?