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

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

我最近为我的 IT 组织设置了一个 Fedora Core Web 服务器,我是 Linux 新手,更是 iptables 新手。现在,我需要允许外部用户访问端口 80 上的 Web 服务器,启用端口 3306 上的 mysql 连接,并允许 ssh 连接。现在我不需要真正限制连接的来源,所以我只需要一些通用的宽松规则来让事情顺利进行。我内部测试了尝试使用以下规则从我的计算机连接到新服务器,但在启动 iptables 的情况下根本无法连接。一旦我停止 iptables,我就可以访问服务器,所以我知道我的 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 -p tcp --dport 80 -i eth0 -j ACCEPT<br>
-A INPUT -p tcp -m tcp --dport 3306 -j ACCEPT<br>
COMMIT<br>

====================
更新!!!

我将 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之后测试,仍然无法连接服务器。

我跑了,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 的问题(而不是网络问题)。我很困惑,所以如果能得到任何其他帮助,我将不胜感激!!!

答案1

我认为问题在于这条规则:

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

这告诉 IPTables 拒绝 INPUT 链上的所有传入数据包。由于 IPTables 按照从上到下的顺序读取(并应用)其规则,因此对于从端口 80 和 3306 传入的新数据包,这是第一个匹配的规则。因此它们都会被拒绝。唯一不会被该规则拒绝的数据包是进入端口 22 的数据包,因为其上方的规则要求接受它们。

要修复此问题,只需将该规则移至文件末尾。这样,IPTables 将首先遇到要求接受端口 80 和 3306 上的数据包的规则。

稍微相关的是,我写了一篇IPTables 教程我的网站上可能会有一些对您有用的信息。

答案2

最简单的解决方案就是在文件的同一位置重复以下命令:

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

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

答案3

我不会只处理列表的一半,而是REJECT在 INPUT 和 FORWARD 链上采用 REJECT 策略。因此

: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

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

答案4

如果你只需要进行简单的更改,则无需在 Fedora 上为此级别使用 iptables。它已锁定,但具有一个简单的防火墙工具这将允许您打开端口(只需单击按钮即可)。您应该在学习期间使用它。

此外,基本默认防火墙规则有一些额外的功能(我认为),例如 syn 洪水保护等,而您的规则集缺少这些功能。您可以随时查看规则是什么。

相关内容