快速改变 iptables 规则会引起问题吗?

快速改变 iptables 规则会引起问题吗?

我正在编写一个脚本来监控不同的指标(例如接口带宽使用情况)并iptables相应地更改规则。这些更改每秒至少发生 2 次,最多4 * number of interfaces每秒发生 1 次。

问题是,我不确定如何iptables处理规则更改。是否需要重新编译,脚本是否会严重占用 CPU?或者在规则更改期间仍在处理的数据包会发生什么情况;它们会被丢弃吗?这些都是问题。

快速改变 iptables 规则会引起问题吗?

编辑:对于我的具体应用,所有规则都已到位。它们更多的是启用或禁用(添加或删除)某些规则。换句话说,表格不会随着时间的推移而增长并变得非常大。

答案1

你如何改变规则?

iptables是否重复调用该命令?这将对性能产生重大影响,因为 iptables 的工作原理是:

  • 获取整个 netfilter 表/链
  • 根据要求执行一项更改
  • 将整个 netfilter 表/链加载回内核

这将发生在每一个 iptables调用。

问题是:你对规则所做的改变的性质是什么?

如果您要根据源和/或目标地址添加/删除规则,则应使用ipset

但是如果您要添加/删除规则,比如因为您正在动态更改其他参数(比如,更改rate以更频繁/更少地匹配,更改 QoS 标志等),那么可能ipset不适合您。

另一方面,如果你的脚本执行更改集体,也可以考虑这样做:

  • 获取整个 netfilter 表/链
    • 你可以使用iptables-save实用程序,或者根据你编写脚本的内容,也许有一个库可以为你做到这一点
  • 一次性完成您想要的所有更改
  • 将整个 netfilter 表/链加载(提交)回内核
    • 您可以使用iptables-restore实用程序,或者类似于步骤 1,使用可以为您执行此操作的库

编辑:

啊,因为规则已经在表中了,你可以使用条件匹配打开/关闭它们。

插入-m condition --condition $NAME到您的iptables规则中。

这将创建一个文件/proc/net/ipt_condition/$NAME。如果文件包含,则匹配成功1,否则如果文件包含0

(当然,您可以使用否定!来反转匹配。)

例如:

iptables -A INPUT -m condition --condition allow_880 -p tcp -m tcp --dport 880 -j ACCEPT

要启用规则:

echo 1 > /proc/net/ipt_condition/allow_880

禁用方法:

echo 0 > /proc/net/ipt_condition/allow_880

(您可以自由使用任何您想要的名称,我建议使它们易于识别。名称的最大长度是,但我不记得是多少。)

编辑1a:

如果您已经建好了表格,最简单的编辑方法是保存输出iptables-save,编辑它(添加需要的规则的条件匹配),然后使用iptables-restore或加载整个文件iptables-apply

请记住:1 个条件文件可以控制多条规则;您不需要每个规则都有 1 个文件,除非您确实想要这样。

编辑1b:

正如@AB 在评论中提到的(谢谢!),-m condition可能不是您的发行版内置 iptables 的标准功能;在这种情况下,您可能需要安装附加包,例如xtables-addons

(抱歉,我忘记了这一点,因为我使用的是 Gentoo,并且iptablesGentoo 上的包只是遵循内核 .config 的内容。)

答案2

在这种情况下,nftables 可能更适合。nftables 的设计比 iptables 更高效、更可扩展,尤其是在规则集复杂或修改频繁的情况下。由于它集成到 Linux 内核并采用精简的语法,因此性能更佳。

相关内容