允许公共 IP 通过 WebSockets 连接

Posted

技术标签:

【中文标题】允许公共 IP 通过 WebSockets 连接【英文标题】:Allow Public IP to connect via WebSockets 【发布时间】:2014-03-25 14:13:33 【问题描述】:

我尝试使用 nodejs ws (einaros) 创建聊天,这是我的代码:

服务器:

var WebSocketServer = require('ws').Server;
var wss = new WebSocketServer( port: 80 );
wss.on('connection', function(ws) 
    console.log('connecting count:' + wss.clients.length);
);

客户:

var hostname = location.hostname;
var port = 80;
var url = 'ws://'+hostname+':'+port+'/';
window.WebSocket = window.WebSocket || window.MozWebSocket;
var w = new WebSocket(url);

当我用我的电脑或与我的路由器连接的其他电脑进行测试时,它运行良好。但是,通过 Internet 访问的其他客户端无法建立连接。当然,他们使用的是公网 IP,比如 218.xxx.xxx.xxx,而不是 192.168.xxx.xxx。

我想知道如何解决这个问题。

谢谢你的回答。但是,它可能不是 NAT 问题。例如,我的公网 IP 是 218.100.50.50,我的私网 IP 是 192.168.1.1。当连接来自我的网络外部并访问 218.100.50.50:80 时,路由器会将其重定向到 192.168.1.1:80。有一个网页可以通过这种方式访问​​,但仍然无法连接到我的 websocket 服务器。这个问题真的让我很困惑。

【问题讨论】:

【参考方案1】:

使用 IPv4 坐在路由器后面会导致将实际流量路由到正确方向(路由器后面的计算机)的问题。

您需要将路由器设置中的 80 端口转发到您的计算机 IP。此外,我建议在路由器设置中为您的计算机设置首选 IP,以便在重新启动后更可能不会更改本地 IP 地址(否则可能会发生)。

进行这些更改后,您甚至可以尝试从自己的计算机使用公共 IP 进行连接,如果它可以正常工作 - 那么它应该可以在外部计算机上正常工作。 另外检查防火墙设置以确保它不会阻止任何外部流量到端口 80。

【讨论】:

【参考方案2】:

您的问题称为 NAT:http://en.wikipedia.org/wiki/Network_address_translation

当连接来自您的网络外部(即针对您的公共 IP)时,路由器不知道谁将接收该连接。想象一下,有 3 台 PC 和 2 部智能手机连接到您的路由器,哪一个会“接听”?好吧,你要做的就是告诉路由器:“亲爱的路由器,当我的朋友尝试连接端口 80 时,将他们重定向到设备 192.168.1.37 和端口 80(例如)”。 如果您不想一次又一次地重新配置路由器以更新 192.168.1.37(因为 DHCP 随机 IP 分配),那么请告诉您的路由器始终为您的 PC 分配相同的 IP(静态 IP)。

因此,为您的 PC 配置一个“静态 IP”,并为端口 80 创建一个端口转发规则,以将流量重定向到您的服务器。您可以搜索“路由器后面的服务器配置”了解更多详细信息,有成千上万的教程。

【讨论】:

感谢您的回答。但是,当我设置 NAT 时,它仍然不起作用。例如,我的公网 IP 是 218.100.50.50,我的私网 IP 是 192.168.1.1。当连接来自我的网络外部并访问 218.100.50.50:80 时,路由器会将其重定向到 192.168.1.1:80。有一个网页可以通过这种方式访问​​,但仍然无法连接到我的 websocket 服务器。这个问题真的让我很困惑。 嗨凪,你找到任何解决方案了吗,我遇到了同样的问题

以上是关于允许公共 IP 通过 WebSockets 连接的主要内容,如果未能解决你的问题,请参考以下文章

无法与在 EC2 上运行的 Laravel Websockets 建立连接

如何允许所有网络公共 ip 访问我的数据库? [关闭]

在没有公共 IP 的情况下通过 http 连接两台计算机

天蓝色公网IP的IP范围

KeyCloak - 入口不允许通过 https 服务连接

AWS EC2 Windows实例无法通过公共IP访问