大家好,有人能帮我理解为什么我的 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。我总结一下其中的一些问题:
- 您的输入链 RH-Firewall-1-INPUT 不存在。您是否从其他地方复制粘贴了内容?
- 您的某些规则在默认拒绝规则之后失效。即使语法适用,规则也不会起作用。
- 192.168.1.1/254 根本就不是有效的 CIDR 寻址。您指的是 192.168.1.0/24 吗?
- 您有 -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]
这将声明链,从而允许您向其添加规则。但该链仍然不会产生任何效果,因为名称没有什么神奇之处,并且三个主链(INPUT
、OUTPUT
和FORWARD
)中的任何内容都不会向其发送任何数据包。当然,您可以向链添加规则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”)...然后在家里玩。
这样,当东西不起作用时,您就不必想知道原因。