我有一个使用“ip”和“iptables”工具维护 GRE 隧道和防火墙规则的脚本。设置数百个隧道和每个接口的地址运行良好。每个接口花费不到 0.1 秒,但是当我开始执行防火墙规则时,一切都变慢了,每次插入花费 >0.5 秒。
为什么运行速度这么慢?我该怎么做才能提高速度?
似乎我可以尝试使用 ipset,但我真的觉得内核或其他东西出了问题。有趣的是,前 10 条规则运行得很快,然后速度就变慢了。
mybox(root) foo# iptables -V
iptables v1.3.5
mybox(root) foo# uname -a
Linux foo 2.6.18-164.el5 #1 SMP Tue Aug 18 15:51:48 EDT 2009 x86_64 x86_64 x86_64 GNU/Linux
mybox(root) foo# cat test.sh
#!/bin/sh
for n in {1..100}
do
/sbin/iptables -A OUTPUT -s ${n} -j ACCEPT
/sbin/iptables -D OUTPUT -s ${n} -j ACCEPT
done
mybox(root) foo# time ./test.sh
real 1m38.839s
user 0m0.100s
sys 1m38.724s
感谢任何帮助。干杯!
答案1
第一:你的内核是非常过时了。你的 也一样iptables
。
第二:问题在于每一个调用iptables
,发生的事情是:
iptables
将整个表从内核拉到用户空间iptables
修改用户空间中的表iptables
将表推回到内核空间
iptables
相反,按照您想要的方式配置规则集,然后使用 保存它iptables-save > some_file_name
。所有的规则集将使用命令一次性恢复iptables-restore < some_file_name
。
(当然,用some_file_name
您想要保存规则集的文件的名称替换它。)