【问题标题】:UDP punch hole for a web-server?Web服务器的UDP打孔?
【发布时间】: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:udpPunchHolePortmyip:41234

任何人都会再次卷曲到myip:41234,它将被节点js UDP打孔应用程序接收,因此它将重定向到localhost:3000。最后,anyone 将收到来自localhost:3000 的响应。

我的两个问题 -

  1. 有没有比我在这里提出的更好的方法?
  2. 我知道,是否有任何知名的 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


【解决方案1】:

不,这行不通。

  1. HTTP 通过 TCP 而非 UDP 运行。打一个 UDP 漏洞对你没有任何好处——到后端 HTTP 服务器的任何 TCP 连接仍然会失败。

  2. HTTP 重定向并不神奇。如果用户无法访问特定的 host:port,将他们重定向到该 host:port 上的 URL 只会使他们的浏览器在请求该 URL 时超时。

  3. 您无法从浏览器请求的不同主机:端口发送响应,因为没有与该端点建立 TCP 连接。

【讨论】:

  • 如果我打 TCP 洞而不是 udp 会怎样?我看到 tcp 漏洞是可能的,只是想知道您对此的看法。
  • @Sam 存在一些用于 TCP 打洞的理论技术,但它们并不可靠——它们取决于防火墙的实现细节。我的建议?选择另一个项目。你在这里试图完成的事情是不可能的。
  • 非常感谢 :) 在我完全放弃这个项目之前,我只需要再等几天来接受这个答案。
  • 4) 您不能通过 udp 打一个洞并期望它为其他人打开。您的每个访问者都需要自己打开一个洞。
  • 了解通用即插即用
猜你喜欢
  • 2015-11-30
  • 2012-08-21
  • 2017-09-24
  • 2011-06-14
  • 2020-11-13
  • 2014-10-17
  • 2019-04-11
  • 2012-11-30
  • 2019-01-13
相关资源
最近更新 更多