帮助iptables无法连接到Web服务器

我最近为我的IT组织build立了一个Fedora Corenetworking服务器,我是一个linux新手,甚至更多的是iptables的新手。 现在,我需要允许外部用户访问端口80上的Web服务器,启用端口3306上的MySQL连接,并允许ssh连接。 现在我不需要严格限制连接的来源,所以我只需要一些通用的宽松规则就可以实现。 我testing了内部试图从我的电脑连接到新的服务器与下面的规则,我根本无法连接iptables开始。 一旦我停止iptables,我能够到服务器,所以我知道我的iptablesconfiguration有什么问题 – 我只是太多的新手想出来。 有人可以帮忙吗? 🙂

:INPUT ACCEPT [0:0]<br> :FORWARD ACCEPT [0:0]<br> :OUTPUT ACCEPT [0:0]<br> -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT<br> -A INPUT -p icmp -j ACCEPT<br> -A INPUT -i lo -j ACCEPT<br> -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT<br> -A INPUT -j REJECT --reject-with icmp-host-prohibited<br> -A FORWARD -j REJECT --reject-with icmp-host-prohibited<br> -A INPUT -p tcp --dport 80 -i eth0 -j ACCEPT<br> -A INPUT -p tcp -m tcp --dport 3306 -j ACCEPT<br> COMMIT<br> 

====================
UPDATE!

我改变了我的iptables规则…

 :INPUT ACCEPT [0:0]<br> :FORWARD ACCEPT [0:0]<br> :OUTPUT ACCEPT [0:0]<br> -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT<br> -A INPUT -p icmp -j ACCEPT<br> -A INPUT -i lo -j ACCEPT<br> -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT<br> -A INPUT -j REJECT --reject-with icmp-host-prohibited<br> -A FORWARD -j REJECT --reject-with icmp-host-prohibited<br> -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT<br> -A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT<br> COMMIT<br><br> 

重新启动iptables后,我testing,我仍然无法连接到服务器。

我运行iptables -L我得到这个…

 Chain INPUT (policy ACCEPT)<br> target prot opt source destination<br> ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED<br> ACCEPT icmp -- anywhere anywhere<br> ACCEPT all -- anywhere anywhere<br> ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh<br> REJECT all -- anywhere anywhere reject-with icmp-host-prohibited<br> ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:http<br> ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:mysql<br><br> Chain FORWARD (policy ACCEPT)<br> target prot opt source destination<br> REJECT all -- anywhere anywhere reject-with icmp-host-prohibited<br><br> Chain OUTPUT (policy ACCEPT)<br> target prot opt source destination<br><br> 

再次,如果我停止iptables,然后再尝试连接,然后我能够连接。 所以它似乎仍然是一个iptables的问题(不联网的问题)。 我很困惑,所以任何其他的帮助将不胜感激!

我认为这个问题是这个规则:

 -A INPUT -j REJECT --reject-with icmp-host-prohibited 

这就告诉IPTables拒绝进入INPUT链的所有东西,即所有进入的数据包。 而且由于IPTables自上而下地读取(并应用)其规则,对于在端口80和3306上进入的新数据包,这是匹配的第一个规则。 所以他们都被拒绝了 唯一不被该规则拒绝的数据包是进入端口22的数据包,因为上面的规则表示接受它们。

要修复它,只需将该规则移动到文件的末尾。 这样,IPTables将会首先遇到在端口80和3306上接受数据包的规则。

在一个稍微相关的说明中,我已经在我的网站上写了一个IPTables教程 ,可能会为您提供一些有用的信息。

最简单的解决scheme就是在文件的相同位置重复以下步骤:

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

但将目标端口更改为您要接受的端口。

而不是通过你的清单中的一半REJECT ,我会在input和前向链上有一个拒绝的政策。 所以

 :INPUT REJECT [0:0] :FORWARD REJECT [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 -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT COMMIT 

这样,您可以附加更多的规则(如果您正在编辑文件,则在COMMIT之前),而不必在拒绝之前插入额外的规则。

如果你需要的只是简单的改变,你不需要在Fedora的这个级别上使用iptables。 它被locking,但它有一个简单的防火墙工具 ,可以让你打开端口(就像点击一个button一样简单)。 你应该在你还在学习的时候使用它。

此外,基本的,默认的防火墙规则有一些额外的function(我认为)像顺stream泛滥保护等,你的规则集丢失。 你总是可以看到规则是什么。