为什么此 iptables 文件行在 CentOS 6 中失败

为什么此 iptables 文件行在 CentOS 6 中失败

大家好,有人能帮我理解为什么我的 iptables 文件中的第 15 行会失败吗?我使用的是 CentOS 6。

当我尝试重新启动 iptables 服务时,得到以下信息:

[root@dbserver ~]# service iptables restart
iptables: Flushing firewall rules:                         [  OK  ]
iptables: Setting chains to policy ACCEPT: filter          [  OK  ]
iptables: Unloading modules:                               [  OK  ]
iptables: Applying firewall rules: iptables-restore: line 15 failed
                                                           [FAILED]

我的 iptables 文件如下所示:

# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
#-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 80 -j ACCEPT
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 53 -j ACCEPT
-A RH-Firewall-1-INPUT -m udp -p tcp --dport 53 -j ACCEPT
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 443 -j ACCEPT
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 25 -j ACCEPT
-A RH-Firewall-1-INPUT -s 192.168.1.1/254 -m state --state NEW -p tcp --dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -p tcp --dport 21 -j ACCEPT

我目前只是想允许从本地网络访问该机器。

任何帮助都将不胜感激。谢谢。

编辑:

根据第一个答案,已将 COMMIT 移至文件末尾,但仍然收到错误......

# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 80 -j ACCEPT
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 53 -j ACCEPT
-A RH-Firewall-1-INPUT -m udp -p tcp --dport 53 -j ACCEPT
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 443 -j ACCEPT
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 25 -j ACCEPT
-A RH-Firewall-1-INPUT -s 192.168.1.0/255 -m state --state NEW -p tcp --dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -p tcp --dport 21 -j ACCEPT
COMMIT

错误:

[root@dbserver ~]# service iptables restart
iptables: Flushing firewall rules:                         [  OK  ]
iptables: Setting chains to policy ACCEPT: filter          [  OK  ]
iptables: Unloading modules:                               [  OK  ]
iptables: Applying firewall rules: iptables-restore: line 13 failed
                                                           [FAILED]

答案1

很简单——您需要将 COMMIT 移至文件末尾。

COMMIT 告诉 iptables 您已完成声明并希望将配置发送到内核。它结束了您的声明。您告诉 iptables COMMIT,然后您给出了没有新声明的新规则,因此您犯了错误。

编辑以包括顺风评论的内容:

这是您的配置的更新且有效的版本(不一定是最佳的):http://gist.github.com/3818123。我总结一下其中的一些问题:

  1. 您的输入链 RH-Firewall-1-INPUT 不存在。您是否从其他地方复制粘贴了内容?
  2. 您的某些规则在默认拒绝规则之后失效。即使语法适用,规则也不会起作用。
  3. 192.168.1.1/254 根本就不是有效的 CIDR 寻址。您指的是 192.168.1.0/24 吗?
  4. 您有 -A RH-Firewall-1-INPUT -m udp -p tcp,这没有任何意义——我假设您的意思是 -A INPUT -m udp -p udp。

答案2

除了 jgoldschrafe 提到的 COMMIT 问题之外,您还尝试向不存在的规则中添加行(RH-Firewall-1-INPUT)。

您需要添加一行

:RH-Firewall-1-INPUT - [0:0]

紧接在下方

:OUTPUT ACCEPT [0:0]

这将声明链,从而允许您向其添加规则。但该链仍然不会产生任何效果,因为名称没有什么神奇之处,并且三个主链(INPUTOUTPUTFORWARD)中的任何内容都不会向其发送任何数据包。当然,您可以向链添加规则INPUT以将流量发送到您的新链,但是 - 请不要误解 - 我注意到它在该文件的顶部说

不建议手动定制此文件。

这是有原因的。无论如何,请忽略它并进行编辑,但在学习如何正确处理时,您可能会在系统的安全性或可用性方面造成相当大的漏洞。

编辑:我怀疑第 19 行的问题在于指定的地址范围为192.168.1.0/255,这无效。如果要指示192.168.1.0和之间的所有地址192.168.1.255,则需要192.168.1.0/24

我确实请求您的原谅,但您真的不像是一个对防火墙和网络了解很多的人,而且 - 假设这是您专业维护的服务器 - 它可能不是学习这些知识的最佳场所。

答案3

一般来说,最好通过 iptables 添加规则,然后使用 iptables-save 将它们转储到文件中,以防您想通过 iptables-restore 再次加载它们,例如当您的系统重新启动时,因为 iptables-save 比您更了解自己的先决条件。

答案4

是的,老兄,/24 ... 斜线符号。谷歌斜线符号转换。看到你的第一个示例表,我大吃一惊。

多年来,我多次被告知同样的事情,但你却无法理解。如何在不了解斜线符号的情况下手动编辑 iptables 规则?它几乎无处不在。

就像大家说的,不管重要与否,它都是一个服务器——不是玩耍的地方。如果安全性并不重要,而且它位于防火墙后面,不暴露在互联网上,请关闭 iptables(“#service iptables stop; #chkconfig iptables off”)...然后在家里玩。

这样,当东西不起作用时,您就不必想知道原因。

相关内容