如何在没有任何第三方服务器的情况下,在 NAT 后面和具有相互信任的动态 IP 的两方之间建立连接?

How to establish connection between two parties behind NATs and with dynamic IPs that trust each other without any third party servers?

我想在不向第三方泄露任何元数据的情况下与朋友聊天、使用 VoIP 和 video-conference。我考虑过使用 Tor(Tox、Briar)和其他去中心化应用程序(Status,使用 gun.js 的东西),但是有一些注意事项:Briar 不支持 VoIP/video,Tox 应该可以工作,但对于一些原因是我找不到足够的报道——似乎没有多少人使用它,即使它应该满足上述要求。 Status(耳语协议)似乎也不适合 VoIP/video。我不确定是否有任何 VoIP/video Dapps 已经在使用 gun.js?

有没有什么方法可以通过 UDP 打洞建立一个连接,这样每次 IP 更改时(我们的 ISP 大约每个月更改一次 IP),对等点都会让对方知道,而无需任何外部 STUN/randevouz-like服务器?

这不是关于构建 peer-to-peer 网络,而是私人 point-to-point 连接。如果这是可能的,即使我们的 ISP 仍然从它收集元数据,我想人们仍然可以通过稍后在顶部的 Tor/VPN 层完全隐藏它。

如果您可以控制您的家庭路由器(NAT 路由器)并且能够在内部网络中将端口转发设置为您自己的computer/device,则可能。许多家用路由器都有该选项。实际上,您必须就要使用的端口与您的朋友达成一致,然后让彼此知道您家用路由器的 public IP。

我说端口是因为根据您要使用的 application/protocol,您可能需要多个端口(例如,一个用于信号协议,一个用于音频流,一个用于视频流——这很常见对于具有 Session 启动 Protocol/SIP 的 VoIP)。如果你想要一个 multi-party 网状电话会议,你需要更多的转发端口。

您还需要将聊天应用程序配置为使用转发流量的端口。一些 SIP 客户端应用程序允许这样做。

然后是关于家庭路由器的 public IP 在对等体之间的分配。有动态 DNS 选项,家庭路由器可以在每次更改时将新 IP 推送到动态 DNS 服务器。这当然是归属路由具有此功能的问题。但这可以被认为是将元数据提供给第三方。也许有些应用程序可以定期相互 ping 并更新从不同 IP 检索,为了安全起见,必须设置一些身份验证以确保数据包来自您信任的朋友。

但是,如果您或您的朋友不懂技术,处理上述所有问题可能会很复杂。在这种情况下,我宁愿租一个便宜的云虚拟机 (VM),每月 10 美元以下有很多选择,并且 运行 自己的开源 chat/voice/video 会议系统实例,例如 Jitsi认识 Matrix/Element、RocketChat 或 Mattermost,仅举几例。许多提供 Docker 图像,使 运行 变得容易,并且它们通常可以自动使用 Let's Encrypt 获取 TLS 证书并提供良好的隐私和安全通信。还需要购买一个域名,以便在网络浏览器上轻松使用。

第二种变体是使用云 VM 服务器通过一些开源解决方案(如 OpenVPN 或 WireGuard)创建加密 VPN(虚拟专用网络)。然后每个朋友都将连接到 VPN,你们都将像在本地网络中一样,可以使用任何聊天应用程序而无需担心更改家庭路由器 IP。