【发布时间】:2017-12-18 23:29:03
【问题描述】:
对于我的学术项目,我正在努力实现这一目标。
监听 3000 端口的 Web 服务器节点 JS 应用程序。
所以如果你curl http://localhost:3000 你会得到Hello World!。 (一个简单的网页。
现在我在本地机器的网络服务器上运行。我的调制解调器在 NAT 后面。假设如果我在调制解调器中将端口转发到myip:3000,那么它对世界开放。但这是我遇到的最大问题 - 我不想使用调制解调器进行端口转发,相反,我将使用第三方服务器进行 UDP Punch Hole。
现在我的要求是任何来自网络的人都应该能够通过curl http://third-party-server-ip:3000 访问我的网络服务器。
我正在尝试编写另一个客户端 - 打开与第三方服务器的连接。假设它在41234 端口打了一个孔。那个端口是开放的。第三方主机可以向该端口发送内容。
现在互联网上的任何人都会向第三方主机发起此命令curl http://third-party-ip:3000。所以第三方返回 myip:udpPunchHolePort 即myip:41234。
任何人都会再次卷曲到myip:41234,它将被节点js UDP打孔应用程序接收,因此它将重定向到localhost:3000。最后,anyone 将收到来自localhost:3000 的响应。
我的两个问题 -
- 有没有比我在这里提出的更好的方法?
- 我知道,是否有任何知名的 node-js 库用于此类东西, 我可以使用UDP punch hole。 或者我正在考虑写一个 Lib 来做这件事 - 这听起来像是重新发明轮子吗?
注意 - 在这个学术项目中,我们正在尝试学习如何使任何本地应用程序向世界开放,而无需在调制解调器中进行端口转发。
我们在skype protocol analysis 上阅读,这也是我们的灵感。
【问题讨论】:
-
不清楚你为什么在这里尝试使用 UDP。您正在尝试使用第三方主机作为“防火墙后”主机的代理。有许多架构方法可以做到这一点。我能想到的最直接的方法是让您的“防火墙后”服务器打开与第三方代理的连接。因为这个连接是出站的,所以它会被允许,并且因为连接是持久的,所以双方都可以通过连接发送数据。因此,您的第三方代理可以随时向您的“防火墙后”服务器发送它想要的任何数据。
-
所有使用 socket.io 或 webSockets 的浏览器页面都获得了同样的好处。防火墙后面的客户端连接到服务器,从而允许服务器随时向它们发送数据,即使它们位于防火墙后面。大多数聊天客户端都使用这样的东西。
-
您好@Sam,您确实是在重新发明轮子。您只需要介于两者之间的 nginx 代理服务器。我们正在我们当前的项目中这样做。每次您发送的每个请求,它都会发送到 nginx 代理服务器,然后请求将由 nginx 发送到您的应用程序localhost:3000。这是nginx的详细手册nginx.com/resources/admin-guide/reverse-proxy
-
@InderRSingh NGINX 在第三方机器上运行,将无法穿越 NAT 到本地机器。 @Sam 在我看来,这个问题可以通过 SSH 反向隧道轻松解决。
ssh -R 80:localhost:3000 user@thirdpartyip假设第三方上的 sshd 启用了GatewayPorts yes设置。 -
@Sam SSH 隧道没有帮助。它要求防火墙运行 SSH 服务器,而这基本上是不可用的。具有 SSH 服务器的(非常罕见的,通常是自制的)防火墙几乎总是有端口转发和/或 UPnP 可用。
标签: node.js sockets curl hole-punching