我目前正在使用 golang 编写 P2P 应用程序。我为此选择了Noise,因为它提供了一个易于使用的网络堆栈。
我的应用程序提供了一个 REST API,可以通过localhost
. 发送到本地提供的端点的数据然后将被传输到所有连接的对等点,然后将数据分发给它们连接的对等点以保持网络同步。
到目前为止,我的实现已经成功,但这仅适用于公开暴露的节点或同一网络中的节点。
我想让我的应用程序的可用性尽可能简单,对于专用网络中的用户也是如此。因此,我想避免手动配置开销(即路由器设置中的端口转发)。如果可能的话,我还想避免使用中央服务器进行 NAT 遍历,因为我的目标是拥有一个真正去中心化的应用程序。
我知道有几种 NAT-Traversal 技术,例如STUN和TURN以及其他技术,并且我知道 Noise 已经提供NAT-PMP和UPnP,但不知何故我无法理解它们的工作原理。
我知道,一些 VoIP 或文件共享服务使用 NAT-PMP,它们似乎几乎可以在每个网络上工作,无需任何用户交互。这对我来说似乎有点奇怪,我被困住了。
怎么可能,我的应用程序只是神奇地更改了一些路由器配置以接受传入流量?对我来说,这似乎是一个巨大的安全风险,特别是如果我的应用程序的用户甚至不知道它。此外,我认为并非每个路由器都支持 NAT-PMP 和 UPnP。如果我的用户有其中之一怎么办?