我有非常复杂和长的iptables脚本。 通过手动插入/replace或删除,不可能在现有的iptablesconfiguration上进行操作。 我有一个脚本,只需刷新所有规则和自定义链,然后重新从零开始加载所有内容。 这种方法在一定程度上运作良好。
我有很多敏感的stream量,比如封装在IP数据包中的E1线路等等。 我不能放弃所有规则并重新插入,因为这太慢了。 如果没有超过50ms的规则,许多东西就会中断。 除此之外,一些高吞吐量的stream量会进入部分恢复的防火墙,最后导致非常不好的conntrack条目,这需要手动干预来恢复function。
解决办法是在当前的末尾添加新的规则,然后删除旧的规则,这在理论上可以导致连续的规则集。 问题是,具有自定义链,ipset等的脚本变得非常复杂和容易出错。
问题是 – 你知道任何现有的解决scheme(在iptables之上的额外层),处理我在这里提到的问题?
提前致谢。
你有没有试过用iptables-restore命令加载你的新规则? 这在理论上是一个primefaces操作,可能会照顾你的大部分问题。 这确实需要你以iptables-save使用的格式编写你的规则。
如果你使用链条,这应该很容易。
创build一个或两个链,并添加所有的规则。 所有你需要做的就是刷新,删除和重新创build链(s),当你需要重新申请你的规则。
因此,在更新过程中,您可以在顶部插入一个允许build立连接的规则(也许您希望这是一个始终启用且从未触摸的规则),刷新链,然后将新规则添加到链中。 这假定你正在使用有状态的规则。
我不认为有像你这样的极端情况下的解决scheme。 然而,好消息是,编写Python脚本将会非常容易,它将replace在旧脚本之上插入规则,然后删除旧脚本。
orchidea 10.0.0.1 /etc/exim % iptables -L -n --line-numbers Chain RH-Firewall-1-INPUT (2 references) num target prot opt source destination 1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 2 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 3 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 icmp type 255 4 ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:53
只是parsing输出上面的链和规则号,说4,做iptables -I链4新规则,然后iptables -D链5。
我build议适应脚本,以便它使用同一链中的两个名称之一(有意义使用前缀),这取决于它是如何调用的。 所以,而不是一个连锁dropthis会有set0_dropthis或set1_dropthis。
这样,您可以创build新的规则集,而不会干扰stream量。 之后,默认链将被刷新,并以新的集合作为目标重新创build。 最佳的做法是在每个默认链中只有一条规则,这个规则只是将stream量引导到旧的或新的集合。 更换这个规则会很快(甚至在iptables -A; iptables -D ... 1也是安全的)。 之后旧套链将被刷新并删除。
包装脚本将检测哪个集合当前处于活动状态,并用相应的参数调用真实脚本。
要做到这一点,唯一可行的方法是重写现有脚本以使用iptables-restore格式,或者修改现有脚本以将命令转储到stdout而不是执行它们,然后生成第二个脚本将其转换为iptables-restore格式。
iptables-restore被保证是primefaces的,因此是做无缝规则replace的唯一可靠的方法。
对于获得iptables-restore格式,我的build议是在虚拟机上运行你的脚本,或者在实时计算机上的一个单独的networking命名空间中运行脚本,然后使用iptables-save来抓取它。