NodeJS 在没有服务器的节点中打TCP洞

tjvv9vkg  于 2022-12-22  发布在  Node.js
关注(0)|答案(1)|浏览(188)

bounty将在2天后过期。回答此问题可获得+100声望奖励。Mathew希望引起更多人关注此问题。

我尝试按照here给出的代码在Node.js中实现NAT打洞。我想知道服务器是否是严格必要的。阅读了打洞的内容后,我的印象是,服务器的目的是允许客户端交换一些信息(包括但不限于它们的地址和它们想要通信的端口),使得它们然后可以直接进行交谈。(同样,包括但不限于它们的地址和端口),服务器是否仍然必要?如果是,为什么,如果不是,如何实现。
例如,假设要构建一个应用程序,其中client_A打印出所有要传输到服务器的信息,以便user_A读取,然后user_A将其发送给user_B,user_B再将此信息提交给client_B(例如,这可以通过电子邮件完成),这难道不需要服务器吗?

下面是我认为可以删除中间服务器的另一个原因:

在NAT打洞中(假设我理解正确),当client_A向服务器发送消息时,通信开始。该消息包含一些信息,当client_B与服务器联系时,服务器会将这些信息传递给client_B。在此之后,client_A和client_B能够直接通信,而无需服务器。我的印象是,一旦client_A和client_B之间建立了直接连接,A和client_B已经建立,服务器可以离线,而两个客户端仍然能够直接相互通信。如果是这种情况,那么我可以想象任何用于维护此连接的信息(地址、端口或任何其他类型的信息)都可以通过任何其他通道交换(例如:电子邮件、手写信件、语音呼叫等),然后可以在不需要服务器的情况下建立连接。

关于“欺骗”路由器

正如Manishig在评论中向我指出的(谢谢),打NAT洞也需要欺骗路由器。如果我理解正确的话(如果不是,请纠正我)路由器被欺骗了,让路由器存储用于将来自服务器的数据包定向到客户端A的信息,然而,在协议的初始阶段之后,这些数据包实际上来自客户端B。如果这是对问题的正确描述,那么有没有一种不需要使用服务器就可以欺骗路由器的方法呢?

amrnrhlw

amrnrhlw1#

有一些方法可以在没有中间服务器的情况下通过互联网在两台远程计算机之间进行通信,但IMO这不是首选的方法。

为什么需要中间服务器?

如果client_A和client_B都在同一个局域网中(例如您的家庭/办公室网络),您可以确保(在客户端和/或路由器上配置)它们在此局域网上有一个静态ip地址,并且它们可以自由地交谈。如果client_A正在侦听端口8080,则client_B可以在端口8080上创建到client_A_ip的连接
在互联网上,任何发送的数据包通常至少要经过NAT两次。一次是在通过你的局域网(例如你的家庭/办公室路由器)之后,另一次是在ISP端点上。这意味着你无法控制分配给你的数据包的公共ip和端口。
现在你不仅不能控制你的数据包分配的公共ip和端口,而且它们也不是静态的。当你有一个活动的TCP连接时,它们不会改变,但是你不能从你的ISP那里得到任何关于你分配的公共ip和端口的保证。
中间服务器的目的是动态地更新每个客户端的对等信息,同时保持tcp连接打开,以便对等通信可用。

中间服务器的替代解决方案(不推荐)

如果你想让你的客户端在没有中间服务器的情况下进行通信,你可以从你的ISP购买一个公共静态IP(如果他们支持的话),然后你可以通过一些方法(通过一些配置)让你的一个客户端拥有一个公共静态IP和其他客户端可以连接的端口。
但我不建议这样做,因为它需要对IT和安全风险有一定的了解。
此外,如果两个客户端都是便携式的,并且一直连接到不同的网络,这不是一个有效的解决方案

相关问题