我们有一台 Linux 服务器 (CentOS 6.3),其中所有端口似乎都可以从内部访问(从服务器尝试时),但只有 SSH 可以从外部访问。我想允许一些其他端口,例如 1521 (Oracle),但我无法让它工作。
我尝试了以下操作:
iptables -A INPUT -m state --state NEW -p tcp --dport 1521 -j ACCEPT
service iptables save
service iptables restart
但是当我从另一台机器执行“telnet 192.168.97.1 1521”时,仍然会出现“连接超时”的情况,而我可以使用相同的命令从服务器连接。
这是我在 /etc/sysconfig/iptables 中的内容:
# Generated by iptables-save v1.4.7 on Fri Mar 15 12:13:41 2013
*nat
:PREROUTING ACCEPT [6:1136]
:POSTROUTING ACCEPT [14:878]
:OUTPUT ACCEPT [15:986]
-A POSTROUTING -o em1 -j MASQUERADE
COMMIT
# Completed on Fri Mar 15 12:13:41 2013
# Generated by iptables-save v1.4.7 on Fri Mar 15 12:13:41 2013
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [45:3812]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A INPUT -p tcp -m state --state NEW -m tcp --dport 1521 -j ACCEPT
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
# Completed on Fri Mar 15 12:13:41 2013
(之所以有 -A POSTROUTING -o em1 -j MASQUERADE 这一行,是因为之前我也尝试安装了一个 PPTP 服务器,如下所述这里)
答案1
指令出现的顺序很重要。第一个匹配的获胜。
所以你的问题是:
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A INPUT -p tcp -m state --state NEW -m tcp --dport 1521 -j ACCEPT
因此您永远不会允许流量到端口 1521。
要修复此问题,只需反转两行即可。
答案2
您可以使用以下 2 个选项:(我假设您使用 Red Hat 或 CentOS Linux)。
选项1:
在 root shell 中执行以下命令:
iptables -L --line-numbers
这将向您显示链以及每个链中应用的规则(带有行号)。例如,在我的其中一台服务器中,输出为:
iptables -L --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 RH-Firewall-1-INPUT all -- anywhere anywhere
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
1 RH-Firewall-1-INPUT all -- anywhere anywhere
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
Chain RH-Firewall-1-INPUT (2 references)
num target prot opt source destination
1 ACCEPT all -- anywhere anywhere
2 ACCEPT icmp -- anywhere anywhere icmp any
3 ACCEPT esp -- anywhere anywhere
4 ACCEPT ah -- anywhere anywhere
5 ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
6 ACCEPT udp -- anywhere anywhere state NEW udp dpt:snmp
....
14 DROP all -- anywhere anywhere
因此,为了设置您的规则,我将执行以下命令:
iptables -I 7 INPUT -m state --state NEW -p tcp --dport 1521 -j ACCEPT
service iptables save
service iptables restart
使用-I 7而不是 -AI 指示 iptables 在第 7 行添加新规则,并下推所有其他规则。请注意,在我的例子中,我可以使用 7-14 之间的任何行号。
选项 2:
编辑文件/etc/sysconfig/iptables,找到“DROP”之前的最后一个条目并在那里添加规则,保存文件并重新加载 iptables。