我的问题:如何添加自定义 iptables 规则以接受某个端口上的连接?
我尝试在我的服务器上打开端口 3500,但失败了。我首先使用这个命令:(从http://wiki.centos.org/HowTos/Network/IPTables)
iptables -A INPUT -p tcp --dport 3500 -j ACCEPT
但是当我运行的时候,iptables -L
我仍然没有看到列出的新规则:(我的假设它应该在输出中包含 3500)
Chain INPUT (policy ACCEPT)
target prot opt source destination
RH-Firewall-1-INPUT all -- anywhere anywhere
ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
ACCEPT tcp -- anywhere anywhere tcp dpt:rtmp-port
Chain FORWARD (policy ACCEPT)
target prot opt source destination
RH-Firewall-1-INPUT all -- anywhere anywhere
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain RH-Firewall-1-INPUT (2 references)
target prot opt source destination
ACCEPT all -- anywhere anywhere
ACCEPT icmp -- anywhere anywhere icmp any
ACCEPT esp -- anywhere anywhere
ACCEPT ah -- anywhere anywhere
ACCEPT udp -- anywhere 224.0.0.251 udp dpt:mdns
ACCEPT udp -- anywhere anywhere udp dpt:ipp
ACCEPT tcp -- anywhere anywhere tcp dpt:ipp
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT udp -- anywhere anywhere state NEW udp dpt:snmp
ACCEPT udp -- anywhere anywhere state NEW udp dpt:snmptrap
ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh
ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:http
ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ftp
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
编辑 因此我尝试将 ACCEPT 规则插入到 INPUT 链中,我的 iptables 现在如下所示:
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:3500
RH-Firewall-1-INPUT all -- 0.0.0.0/0 0.0.0.0/0
但它不允许我从外部连接到 3500。(我仍然可以从内部进行 telnet)。当我尝试 telnet my_host 3500 时,我得到了以下信息:telnet: Unable to connect to remote host: Connection refused
编辑2:我的netstat -an | grep "LISTEN "
输出:
tcp 0 0 127.0.0.1:3500 0.0.0.0:* 监听
tcp 0 0 0.0.0.0:973 0.0.0.0:* 监听
tcp 0 0 0.0.0.0:111 0.0.0.0:* 监听 tcp
0 0 127.0.0.1:631 0.0.0.0:*监听 tcp 0 0 127.0.0.1:25
0.0.0.0:* 监听
tcp 0 0 :::22 :::* 监听
编辑3:我遵循了 lain 的建议,将我的服务绑定到 0.0.0.0:3500 而不是 127.0.0.1:3500,这样就可以了。
答案1
您的规则已列出,rtmp-port
根据 IANA 是端口 3500端口/服务名称。要获取端口号列表(而不是服务名称),请使用-n
开关
iptables -L -n
您还使用了 -A 开关将规则添加到 INPUT 链。这是在数据包发送到 RH-Firewall-1-INPUT 链之后添加的,该链的最后一条规则是全面拒绝,因此发往端口 3500 的数据包在 INPUT 链中测试之前将被拒绝。
您有几个可能的解决方案 - 使用-I
开关将您的规则插入到INPUT
链中或RH-Firewall-1-INPUT
链中
iptables -I INPUT -p tcp --dport 3500 -j ACCEPT
或者
iptables -I RH-Firewall-1-INPUT -p tcp --dport 3500 -j ACCEPT
你可能也应该清理你的规则,你可以使用
iptables -D INPUT -p tcp --dport 3500 -j ACCEPT
(多次)在添加新规则之前删除端口 3500 的现有规则。