为什么这3条规则在iptables中对我造成问题? (COMMIT行错误)

我试图将我的规则从一台服务器导出到另一台服务器,但由于某种原因,它们在一台服务器上失败。 一个服务器是Xen和另一个OpenVZ(这个是造成麻烦的一个)。 他们都运行Ubuntu(尽pipe分别为8.04和10.10版本)以及不同版本的iptables(分别为1.3.8和1.4.4)。

我导出我的规则很好,但是当我运行他们,我得到一个错误的COMMIT行。 所以我一条一条的评论我的规则中的每一行,发现这三行是罪魁祸首:

-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -A INPUT -p tcp -m state --state NEW --dport 23 -j ACCEPT -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7 

这些线路有什么问题? 他们看起来不错,他们在我的Xen服务器上运行良好。

这是原始规则文件的内容:

 *filter # Allows all loopback (lo0) traffic and drop all traffic to 127/8 that doesn't use lo0 -A INPUT -i lo -j ACCEPT -A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT # Accepts all established inbound connections -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # Allows all outbound traffic # You can modify this to only allow certain traffic -A OUTPUT -j ACCEPT # Allows HTTP and HTTPS connections from anywhere (the normal ports for websites) -A INPUT -p tcp --dport 80 -j ACCEPT -A INPUT -p tcp --dport 443 -j ACCEPT # Allows Tomcat, sms, and newrelic -A INPUT -p tcp --dport 8080 -j ACCEPT #-A INPUT -p tcp --dport 8009 -j ACCEPT # Allows SSH connections # # THE -dport NUMBER IS THE SAME ONE YOU SET UP IN THE SSHD_CONFIG FILE # -A INPUT -p tcp -m state --state NEW --dport 23 -j ACCEPT # Allow ping -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT # log iptables denied calls -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7 # Reject all other inbound - default deny unless explicitly allowed policy -A INPUT -j REJECT -A FORWARD -j REJECT COMMIT 

更新:

好吧,看起来这三者之间唯一的共同之处就是选项“-m”,没有任何工作的规则具有这个选项…什么给了?

这些错误可能与您需要在执行某些选项之前加载相关的内核模块有关。 根据发行版的不同,其中一些会默认加载,而其他的会在使用某些选项时自动加载。 这似乎是在你的情况下,你可能需要手动加载一些,使用modprobe。

 -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT 

为了使用状态条件,您需要加载ip_conntrack模块。

 -A INPUT -p tcp -m state --state NEW --dport 23 -j ACCEPT 

这里同样的问题

 -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7 

不知道为什么这是造成问题。

我会build议阅读特定发行版的iptables的手册页,然后仔细检查哪些内核模块被加载,并可能在batch file的顶部添加一些行来加载所需的内核模块。

以下是我们的一个公共网关的相关输出,它使用类似的iptables规则。

 #> lsmod | grep ip iptable_mangle 11392 0 ipt_recent 16672 2 ipt_LOG 13828 4 iptable_nat 13840 0 nf_nat 25496 2 nf_nat_ftp,iptable_nat ipv6 287784 65 sit dm_multipath 23704 0 

复制/粘贴不是适当的方式

你应该使用

iptables-save> somefilename.rules

以符合iptables-restore期望的格式导出规则

接着

iptables-restore <somefilename.rules

继续恢复

另请参阅关于使iptables规则持久的相当不错的教程