我目前正在使用golang编写P2P应用程序。我之所以选择Noise,是因为它提供了易于使用的网络堆栈。
我的应用程序提供了一个REST API,可以通过localhost
访问。然后,发送到本地提供的端点的数据将被传输到所有连接的对等方,然后再将这些数据分发到其连接的对等方以保持网络同步。
到目前为止,我的实现已成功完成,但是这仅适用于公开暴露的节点或同一网络内的节点。
对于私有网络中的用户,我想尽可能简化应用程序的可用性。因此,我想避免手动配置的开销(即路由器设置中的端口转发)。如果可能的话,我也希望避免使用用于NAT遍历的中央服务器,因为我的目标是拥有一个真正的去中心化应用程序。
我知道有几种NAT遍历技术,例如STUN和TURN,还有其他,我知道Noise已经提供了NAT-PMP和UPnP ,但以某种方式,我无法确定它们的工作原理。
我知道,某些VoIP或文件共享服务使用NAT-PMP,它们似乎可以在几乎所有网络上工作,而无需任何用户交互。对我来说,这似乎有点不可思议,而且我被困住了。
应用程序如何神奇地更改某些路由器配置以接受传入流量,这怎么可能?对我来说,这似乎是一个巨大的安全风险,尤其是如果我的应用程序用户甚至不知道这一点时。另外,我发现并非每个路由器都支持NAT-PMP和UPnP。如果我的用户有其中之一怎么办?
答案 0 :(得分:1)
应用程序如何神奇地更改某些路由器配置以接受传入流量,这怎么可能?对我来说,这似乎是一个巨大的安全风险,尤其是在我的应用程序用户甚至不知道的情况下。
打开进入端口只会使您像侦听该端口的特定应用程序的网络堆栈一样不安全,并且潜在的安全隐患与客户端-服务器模型并没有什么不同。
以您的浏览器为例。每当您访问包含广告网络的某个随机互联网站点时,某些恶意实体可能就会将广告指向其服务器。如果您的浏览器存在漏洞,则可以被利用。
如果您的P2P应用程序未打开端口,它仍将建立与P2P网络中各个节点的传出连接,并且如果其中之一是恶意的并且您的应用程序易受攻击,则可以被利用。
为进入的连接打开端口只会改变方程式,以至于攻击者可以利用某些漏洞(通常是网络堆栈中较低的漏洞,在连接建立的早期,例如在预身份验证消息解析中),而无需等待您来,他们可以拜访您。有所不同,但实际上相差很小。
某人无论如何都必须开放其端口,否则互联网上没有人可以与其他任何人交谈。
最后,更重要的是集中精力加强应该暴露给互联网的应用程序的网络堆栈。
防火墙的好处主要在于避免意外暴露那些并非出于安全考虑而编写的服务,无论是传统服务还是仅基于仅内部用户才可以访问它们的假设。它们减少了不必要的攻击面。
另一方面,存在NAT-PMP和类似的功能可以使您创建必要的攻击面,这仅仅是因为应用程序无法使用网络就无法运行。
此外,我发现并非每个路由器都支持NAT-PMP和UPnP。如果我的用户有其中之一怎么办?
UDP穿孔是一种NAT穿越策略,不需要路由器的配合。
您还可以要求用户手动调整防火墙/端口转发规则。
但是,如果所有nat遍历策略都失败了,那么下一个问题是,协议的正常工作是否需要直接的对等连接。例如,在bittorrent中,它们不足以形成一个连接图,而不是一个完全连接图就足够了。 类似的事情也可以用于群聊。
对于一对一通信,您可以选择通知用户其网络正在阻止连接,也可以利用提供数据中继服务的无私(或付费)节点。
答案 1 :(得分:0)
没有公共中央目录服务器,这是不可能的。同行无法相互识别。这并不意味着服务器必须参与任何对等通信。我只允许发现p2p网络的入口点。
在NAT穿越上:UPNP是采用零配置的唯一方法。请注意,主要问题不是NAT,而是防火墙配置。由于安全方面的考虑,大多数专用防火墙(不是家用路由器)都不支持UPNP。他们仍然可以建立传出连接。