在iptables中为websocketsconfiguration端口

我在端口9090上的服务器(websockets)中实现了Ratchet的推送示例 。 这些是当前的iptables策略:

[root@myserver ~]# iptables -L -n -v Chain INPUT (policy ACCEPT 309 packets, 22420 bytes) pkts bytes target prot opt in out source destination 6 380 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:9090 flags:0x17/0x02 1765 79738 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:3306 state NEW,ESTABLISHED 831 80329 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 37 2866 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:443 1657K 67M ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 57 4891 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 1645K 99M ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0 763 44632 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 7 348 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:21 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:21 state NEW,RELATED,ESTABLISHED 6 384 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:1337 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:11211 Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 3204K packets, 162M bytes) pkts bytes target prot opt in out source destination 1881 129K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp spt:3306 state ESTABLISHED 

出于某种原因,我不能从客户端或通过telnet访问端口9090。

浏览器控制台返回这个:

 WebSocket connection to 'ws://XX.XX.XX.XX:9090/' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED autobahn.min.js:62 

(XX.XX.XX.XX是我服务器的ip)

telnet localhost返回这个:

 [root@myserver html]# telnet localhost 9090 Trying 127.0.0.1... telnet: connect to address 127.0.0.1: Connection refused 

更新

我运行ss -tnlp ,这是结果:

 [root@myserver ~]# ss -tnlp State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 50 *:3306 *:* users:(("mysqld",1317,10)) LISTEN 0 128 :::11211 :::* users:(("memcached",1361,27)) LISTEN 0 128 *:11211 *:* users:(("memcached",1361,26)) LISTEN 0 128 :::80 :::* users:(("httpd",6378,4),("httpd",6381,4),("httpd",6382,4),("httpd",6383,4),("httpd",6384,4),("httpd",6385,4),("httpd",6386,4),("httpd",6387,4),("httpd",6388,4)) LISTEN 0 32 *:21 *:* users:(("vsftpd",1073,3)) LISTEN 0 128 :::22 :::* users:(("sshd",2661,4)) LISTEN 0 128 *:22 *:* users:(("sshd",2661,3)) LISTEN 0 100 ::1:25 :::* users:(("master",1442,13)) LISTEN 0 100 127.0.0.1:25 *:* users:(("master",1442,12)) LISTEN 0 128 :::443 :::* users:(("httpd",6378,6),("httpd",6381,6),("httpd",6382,6),("httpd",6383,6),("httpd",6384,6),("httpd",6385,6),("httpd",6386,6),("httpd",6387,6),("httpd",6388,6)) 

要检查进程是否正在监听/使用套接字,请尝试lsof -i:9090

正如fukawi2所说,也许你的过程没有听取它。 或者也许是另一个,并阻止你使用它。

你可以从你的iptables -nvL输出中看到你的规则正在被命中(输出中有6个命中)。

你的ss -tnlp显示没有任何进程绑定到端口9090( Local Address:Port列),所以到9090的传入数据包通过iptables,但内核与他们没有任何关系(没有进程绑定),所以内核发回一个TCP RST数据包,导致您的连接被拒绝错误。

简而言之,你的问题不是iptables,而是你的进程没有运行,或者没有正确/成功地绑定到9090端口。