我想保持一些iptables
规则的持久性,所以我只是手动添加规则:
/sbin/iptables -I OUTPUT -p tcp --sport 80 -j QUEUE
我确信该命令有效,因为我可以在执行后看到它iptables -vnL
。不幸的是,我发现它在大约一小时后消失而没有重新启动或重新启动,因为我稍后iptables
执行后看不到它。iptables -vnL
首先,我确信没有人执行类似这样的命令iptables -F
。我还在中找到一个相关行/var/log/message
:
Dec 18 10:10:50 zt_21_23 kernel: ip_tables: (C) 2000-2006 Netfilter Core Team
经过Google,我发现这完全是内核行为。有人说iptables
会重建规则,但是没说触发条件。我查看了iptables配置文件(/etc/sysconfig/iptables-config
),也没找到可以iptables
重建规则的配置项。
如果我想保持其持久性,我必须使用 crontab 按照设定的时间间隔添加规则。
总结:
- 如何阻止 iptables 恢复我添加的规则?
- 何时
iptables
重建其规则,触发条件是什么? - iptables 重建时会重新加载哪些规则以及这些规则保存在哪里?
PS. 修改/etc/sysconfig/iptables
,或者使用iptables-save
和iptables-restore
都可以,但是规则仍然会在一小时左右后消失。
我正在使用 Linux(2.6.18-308.24.1.el5 x86_64)。
答案1
某些东西或某些人正在删除您的规则或重新启动 iptables 服务。内核不会自动执行此操作。要阻止它,您首先需要弄清楚是什么在做这件事。我首先要检查是否有东西正在重新启动 iptables 服务。要弄清楚这一点,请将以下内容添加到 /etc/init.d/iptables:
date >> /tmp/iptables-service.log
ps -f $PPID >> /tmp/iptables-service.log
然后,在您的规则“消失”后检查/tmp/iptables-service.log
文件以查看谁/什么运行了 iptables 服务脚本。
如果您没有看到/tmp/iptables-service.log
文件,则表示有程序/sbin/iptables
直接运行了该命令。要查找正在运行此命令的程序,请将其重命名/sbin/iptables
为/sbin/iptables.real
,然后创建以下脚本并将其另存为/sbin/iptables
:
#!/bin/bash
date >> /tmp/iptables-cmd.log
ps -f $PPID >> /tmp/iptables-cmd.log
/sbin/iptables $*
不要忘记将脚本设置为可执行文件:chmod a+x /sbin/iptables
。另请注意,您的实际 iptables 命令可能实际上类似于,/sbin/iptables-multi-1.4.7
具体取决于您的alternatives
配置方式。
然后像以前一样,查看/tmp/iptables-cmd.log
文件以查看谁/什么正在运行该命令。一旦您知道原因,您就应该能够阻止它。