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 位址進行連接。我測試過的路由器似乎知道對等點位於其本地網路上,並且無需訪問外部互聯網即可促進連接。