websocket将无法从远程服务器连接

websocket将无法从远程服务器连接,websocket,firewall,Websocket,Firewall,我有一个网页来控制raspberry pi上的恒温器,当我试图从远程客户端让WebSocket工作时遇到了困难。然而,它在局域网上似乎工作得很好。很明显,我遗漏了一些东西(很可能是一些基本的东西),但我似乎不知道它是什么 pi的本地ip是192.168.1.134。该网页(由apache服务器提供)具有URLhttp://192.168.1.134:8010/thermostat.html。页面启动一些javascript,然后尝试通过ws://192.168.1.134:9000使用WebSo

我有一个网页来控制raspberry pi上的恒温器,当我试图从远程客户端让WebSocket工作时遇到了困难。然而,它在局域网上似乎工作得很好。很明显,我遗漏了一些东西(很可能是一些基本的东西),但我似乎不知道它是什么

pi的本地ip是
192.168.1.134
。该网页(由apache服务器提供)具有URL
http://192.168.1.134:8010/thermostat.html
。页面启动一些javascript,然后尝试通过
ws://192.168.1.134:9000
使用WebSocket连接到pi的主程序。(pi上的服务器正在运行libwebsockets)。websocket出现了,它似乎工作得很好。然后我尝试通过一个远程客户端(一部手机,wifi已关闭)从
http:\\23.239.99.99:8010\automator.html
连接。html/js文件加载正常,但web套接字尝试连接到uri
ws:\\23.239.99.99:9000
,这是无效的

据我所知,NAT似乎配置正确:

name           ext     ext    protocol    int     int     ip addr     interface
               port    port               port    port
               start   end                start   end

Thermostat3     8010   8010   TCP        8010   8010    192.168.1.134   eth3.1  
Thermostat5     8000   8000   TCP/UDP    80     80      192.168.1.134   eth3.1  
Thermostat_ws   9000   9000   TCP/UDP    9000   9000    192.168.1.134   eth3.1  
我检查过了,路由器没有设置任何防火墙,我的调制解调器也没有。我没有在pi上安装防火墙(我检查过,没有奇怪的iptables规则)。有人知道我错过了什么吗

---编辑---


我还是被这件事缠住了。我打电话给我的ISP,他们向我保证他们的服务器上没有防火墙。是否有任何方法可以判断端口9000是否被阻止以及被谁阻止?

尝试此工具以确定端口是否不可访问(使用自定义端口):


其他一切看起来都很好。作为一个健全的检查,我会尝试将ws-port设置为8010,看看是否有效。我还建议使用高级Web客户端之类的工具来隔离网络问题。

这很有趣。我曾经有过类似的问题。我设置了一个WebSocket(我使用的是nodejs),当我试图从远程客户端访问它时,我无法使用
ws://yourip:port
访问它,但我不得不使用
http://yourip:port
。我不知道你是否也有同样的问题,我的问题是因为我使用了一个代理

我仍然有一个建议给你如何才能解决你的问题。我不知道你有多担心安全问题,但据我所知,你基本上是通过一个WebSocket连接到你的覆盆子pi,并告诉它改变温度。
当我做了一个类似的项目时,我发现很难保证我的WebSocket连接。我基本上是通过WebSocket向我的服务器发送一个password plus命令,然后服务器会检查密码是否正确。否则互联网上的每个人都会给你的房子供暖。不酷…
但因此,我不得不通过https对连接进行隧道传输,以防止中间件攻击。
我很快就放弃了,并决定采用一种完全不同的解决方案。基本上,我设置了一个nodejs express服务器(可以很容易地配置一个使用https的自签名证书,或者在nginx/apache https服务器后面使用),并使用用户名和密码进行身份验证。当有人通过温度请求向/api/thermostats?id=0发出POST请求时,服务器会检查用户是否经过身份验证,然后从节点内执行终端命令。

也许这个想法也适合您的需求。

将您的apache服务器绑定到0.0.0.0地址,以便从远程机器访问它。

两个想法:您确定ws-connection使用外部i.p?(好像它不是用html硬编码的,也没有更新过?)更有用-可能值得尝试使用端口443,因为它通常比其他端口“更开放”(但考虑到8010正在工作,这可能需要一段时间)。抱歉,我离开了几天,所以回到这里太慢了。这些都是正确的观点。js代码使用
ws\u uri+=“/”+window.location.host.replace(/\:.*$/,“”)+“:9000”作为uri,我打印出来,它正确显示。我尝试使用443,但它有相同的行为(从lan工作,而不是从wan…)有相同的问题。远程连接到websocket时,我收到“500握手”错误。第二周已经在寻找解决方案了,没有人提出建议。是的,这就是我未来的计划。该网页将通过https/wss提供服务,默认情况下,用户将能够查看状态,但为了更改温度,js应用程序必须发送其凭据。凭据可以通过密码验证生成,也可以存储/加载到设备上的cookie中。可以从其他机器(即通过LAN连接的任何计算机)访问凭据,但不能从任何通过路由器的设备访问凭据。从理论上讲,路由器应该NAT外部访问,这样看起来请求将到达192.168.1.134,所以apache应该看不到区别。。。