无法在 CentOS 上修改 iptables

Phu*_*yen 5 firewall iptables centos

我的问题:如何添加自定义 iptables 规则以接受某个端口上的连接?

我试图在我的服务器上打开端口 3500 但失败了。我开始使用这个命令:(来自http://wiki.centos.org/HowTos/Network/IPTables

iptables -A INPUT -p tcp --dport 3500 -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

但是然后我运行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 
Run Code Online (Sandbox Code Playgroud)

编辑 所以我尝试将 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
Run Code Online (Sandbox Code Playgroud)

但它不允许我从外部连接到 3500。(我仍然可以从内部远程登录)。当我尝试 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:* LISTEN
TCP 0 0 0.0.0.0:973 0.0.0.0:* LISTEN
TCP 0 0 0.0.0.0:111 0.0.0.0:* LISTEN
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 并且它可以工作。

use*_*517 10

您的规则已列出,rtmp-port根据 IANA端口/服务名称是端口 3500 。要获取端口号列表而不是其服务名称,请使用-nswitch

iptables -L -n 
Run Code Online (Sandbox Code Playgroud)

您还使用 -A 开关将您的规则添加到 INPUT 链中。这是在将数据包发送到 RH-Firewall-1-INPUT 链之后添加的,其中最后一条规则是全面拒绝,因此发往端口 3500 的数据包将在它们在 INPUT 链中进行测试之前被拒绝。

您有几种可能的解决方案 - 使用-I开关将您的规则插入INPUT链或RH-Firewall-1-INPUT

iptables -I INPUT -p tcp --dport 3500 -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

或者

iptables -I RH-Firewall-1-INPUT -p tcp --dport 3500 -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

你也应该清理你的规则,你可以使用

iptables -D INPUT -p tcp --dport 3500 -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

(多次)在添加新规则之前删除端口 3500 的现有规则。