我也需要这个功能,对于具体的实现方案,我有不同的看法。
为什么需要 STUN
STUN 可以协助大量用户实现直接连接而避免使用中继服务器。可以帮助用户和 FN Connect 的节约大量成本。进而节约整体社会资源,降低中国互联网负载。助理中国节能减排和生态环境建设。延缓南极冰川融化......
楼主的实现方案有什么问题
楼主提出的方案是基于 HTTP 跳转实现 NAT 穿透,其方案仅对 NAT 1有效。然而国内的 NAT 1 用户普遍叫少,更多用户被困于 NAT2、3、4 网络环境中。更多情况是,运营商为改善用户游戏体验而只为 UDP 数据包提供 FullCone NAT(NAT1),而 TCP 则为 NAT3/4,并启用追踪连接状态的防火墙。
更常见的 NAT 穿透方案是
人们更多使用基于 UDP 协议的 NAT 穿透方案。NAT1、NAT2容易实现穿透,NAT3使用生日攻击亦可在短时间内实现,而NAT4则无法穿透。使用 UDP 成功实现 NAT 穿透后,再其上建立隧道,负载其他流量,即可实现直连。
为什么不用成熟商用虚拟局域网
市面上有很多成熟的方案,例如 Zoterio、Tailscale、NetBird 等。但以上软件均要求在连接时运行其专有软件,并使用内网地址连接。这十分不方便。用户需要同时运行虚拟局域网软件和飞牛APP才能实现访问。且对于Android 用户来说,无法同时连接到两个虚拟局域网。
故而,将此功能整合到飞牛APP中,才能实现最佳的用户体验。
NAT穿透以外的需求
实际上我自己并没有 IPv4 NAT穿透的需求。我的问题场景更简单,且更****普遍。
STUN 不仅可以用于辅助 NAT 遍历,还可以帮助穿越防火墙。在我的使用场景中,有一个无法关闭(来自上级)的 IPv6 防火墙,需要借助 STUN 服务器穿越该防火墙。实现原理很简单,只需要两边同时(短于25秒(具体取决于防火墙机制))向对端发送 UDP 数据包即可建立连接。
伴随着 IPv6 的普及,很多用户都会获得 IPv6 地址。但运营商为了用户安全,或者限制用户自部署服务(PCDN),往往会为用户强制启用 IPv6 防火墙。我相信这在中国是一个更加普遍的现象。故而此功能大有用处。
如何实现
遵循标准的 NAT 穿透流程即可。IPv6 防火墙可视为 NAT 2类型,轻松穿透。现简述如下
描述包含三方
- 飞牛APP:用户手机,想要连接飞牛OS
- 中继服务器:可以中继流量,支持 STUN 功能,辅助NAT传统
- 飞牛OS:用户家中的 NAS
流程:
- 在飞牛APP中输入中继服务器的地址和认证信息,连接到中继服务器。
- 中继服务器中继用户流量,帮助用户连接到飞牛OS。此时处于中继模式,飞牛APP与飞牛OS通过中继服务器中继流量连接。
- 在中继服务器的STUN服务的协助下,尝试NAT穿透。如果成功打洞,则在飞牛APP与飞牛OS之间构建一条UDP隧道(可以使用Wireguard或另行开发私有协议),在其上负载TCP、HTTP连接,进而实现飞牛APP与飞牛OS的直接连接。
- 如果NAT穿透失败,则继续维持中继模式,确保用户的基础体验。应当在 APP 端明确表示当前的连接状态,以便用户决定是否执行大流量任务(例如备份)。
我希望这套软件架构可以自部署,我有自己的中继服务器。我可以协助开发服务器端,但是关键是这套逻辑需要整合进飞牛的App里才会有良好的用户体验。