我正在编写一个脚本来监控不同的指标(例如接口带宽使用情况)并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,并且iptables
Gentoo 上的包只是遵循内核 .config 的内容。)
答案2
在这种情况下,nftables 可能更适合。nftables 的设计比 iptables 更高效、更可扩展,尤其是在规则集复杂或修改频繁的情况下。由于它集成到 Linux 内核并采用精简的语法,因此性能更佳。