如何获得所有 iptables 规则的确定性完整转储?
完整是指 iptables 的所有表。
确定性是指当命令多次运行而不修改任何 iptables 时,它应该始终输出相同的结果。
用例:重构防火墙脚本。例如,使用 for 循环,而不是多次编写类似的命令之类的东西。在重构前后运行 iptables-dump 命令来检查重构是否改变了任何实际的 iptables 规则。
iptables
控制五个不同的表:filter
、nat
、mangle
和raw
。security
在给定的调用中,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]
....