如何获得所有 iptables 规则的确定性完整转储?

如何获得所有 iptables 规则的确定性完整转储?

如何获得所有 iptables 规则的确定性完整转储?

完整是指 iptables 的所有表。

确定性是指当命令多次运行而不修改任何 iptables 时,它应该始终输出相同的结果。

用例:重构防火墙脚本。例如,使用 for 循环,而不是多次编写类似的命令之类的东西。在重构前后运行 iptables-dump 命令来检查重构是否改变了任何实际的 iptables 规则。

按照回答经过吉尔斯,为了获得完整的输出,-v应该使用。

iptables控制五个不同的表:filternatmanglerawsecurity在给定的调用中,iptables仅显示或修改这些表之一,由选项的参数指定-t(默认为filter)。要查看防火墙的完整状态,您需要iptables依次调用每个表。

此外,为了获得规则的准确表示,您需要传递选项-v。否则,输出中会省略一些重要的标准,例如过滤规则中的接口(例如,“接受所有内容”的规则和“接受环回接口上的所有内容”的规则只能用 来区分-v)。

因此,要获得 netfilter 规则的完整演示,您需要

iptables -vL -t filter
iptables -vL -t nat
iptables -vL -t mangle
iptables -vL -t raw
iptables -vL -t security

或者,您可以调用该iptables-save程序,该程序以可解析的格式显示所有表中的所有规则iptables-restore。这种格式对于人类来说也是相当可读的(它非常类似于iptables对构建表的命令的一系列调用)。

但使用时-v,将添加包和字节计数器。从而使输出具有不确定性。

如何两全其美?如何获得所有 iptables 规则的确定性完整转储?

答案1

iptables-save命令有一个非常简单的输出。不同的部分位于规则后面的方括号中或注释中:

# Generated by iptables-save v1.4.21 on Sun Jan 10 16:02:30 2016
: INPUT ACCEPT [38:2132]

然后,它成为取消甚至删除这些实体的练习,从而产生完全确定性的输出,仍然可以使用以下命令重新读取iptables-restore

iptables-save | sed -e 's/\[[0-9:]*\]/[0,0]/' -e '/^#/d'
*filter
:INPUT ACCEPT [0,0]
....

相关内容