我最近为我的 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 洪水保护等,而您的规则集缺少这些功能。您可以随时查看规则是什么。