Yusuke 直接穿过你的 NAT
免责声明:这不是一个生产就绪的聊天应用程序。虽然它确实创建了 AES 加密连接client <-> client
和client <-> server
,但此代码尚未经过任何安全专家的审核或测试。这只是我的一个练习,旨在了解有关 P2P 网络和技术的更多信息,并为有兴趣学习的其他人提供一些正在使用的技术示例。此外,udp 客户端没有实现确保消息成功传送的协议,因此一些消息会因不稳定的连接而丢失。
单击上面的图片可观看正在运行的聊天应用程序的 YouTube 视频。右上角的终端通过 SSH 连接到运行集合服务器的 VPS。右下角的终端是终端 UI。左侧的 Web 应用程序是 GUI。
go get github.com/wilfreddenton/udp-hole-punching
主要包是集合服务器。找到一个 VPS 或其他东西来托管它。您可以在本地运行所有内容,但它不会真正测试打孔是否有效,因为它位于同一台机器上。确保服务器对 0-65535 之间的传入流量开放 TCP 和 UDP 端口。
运行它:
go install
有两个 UI 可以使用gui
(Web UI)和term-ui
(终端 UI)。您可以使用 UI 的任意组合。
在使用之前,您应该打开main.go
文件并将serverTCPIP
和serverUDPIP
常量切换为集合服务器的 IP 地址(无端口)。
运行 Web UI
cd gui/ui
npm install
npm run build
cd ..
go install
gui
如果您的集合服务器在本地运行,或者gui -serverIP=<server IP here>
localhost:8000
要断开连接并开始新的聊天,只需刷新即可。
运行终端 UI
cd term-ui
go install
term-ui
如果您的 rendezvouse 服务器在本地运行term-ui -serverIP=<server IP here>
要断开连接并开始新的聊天,请ctrl-c
退出程序并再次运行。
如果不是朋友,则可以访问不同路由器后面的计算机并在那里设置客户端。
运行客户端并向另一客户端提供一个客户端的 PeerID,如果网络拓扑允许打洞,那么您将在客户端之间建立加密连接。
ID
为了使打洞的实施更加简单,客户端不要尝试连接到彼此的私有 IP 地址。位于同一 NAT 后面的客户端仍然能够进行连接,但它们将使用公共 IP 地址而不是私有 IP 地址进行连接。我测试过的路由器似乎知道对等点位于其本地网络上,并且无需访问外部互联网即可促进连接。