之前寫了一篇關於GVP開源項目FastTunnel的一篇介紹 《FastTunnel-開源內網穿透框架》,只簡單介紹了使用方法,不少伙伴對其原理表示好奇,今天畫抽空了一下其內部實現原理流程。
不知道其他穿透軟件實現是什么樣子的,FastTunnel是於2020年開始編寫,經過幾次嘗試,最終采取一種實現方案,自認是最容易理解和去實現的。
FastTunnel內網穿透實現原理圖
揭開內網穿透的神秘面紗
1270端口為http監聽端口,1271為客戶端通信端口
- 客戶端登錄,將子域名web1注冊到服務端,此socket一直保持在線,維持客戶端和服務端的連接
- 服務端收到注冊請求,創建Map集合,進行登記,此時登錄完成,后面該客戶端不斷發起心跳互相檢測
- 此時用戶發起一次Http請求到1270端口,socket1
-
- 監聽1270端口的Socket收到該請求,並為該次http請求分配全局唯一的guid,后面會用到guid;
- 讀取socket1所有header,解析host內容,解析為
web1.abc.com
,去查找哪個客戶端注冊了這個host,找不到,則客戶端不在線,否則對客戶端發送Swap指令,表示通知該客戶端,有人要請求你內網的服務啦,請求的域名為web1; - 本次請求保存到一個KV集合中,等待客戶端建立Swap連接
-
- 客戶端收到Swap指令,創建2個臨時socket分別連接本地服務SokcetY和服務端1271端口SocketZ,SocketZ連接后發送一條Swap應答指令攜帶guid,服務端收到此應答便知道該scoket是用於數據交換的
- SocketY與SocketZ開始接收數據,並把接收的數據互相發給對方
- 服務端收到Swap應答請求,根據guid查找KV集合,尋找等待接收響應數據的Sockt1,一旦找到,Socket1將與SocketZ進行數據互相轉發。
- Socket1接收到SocketZ發來的內容,根據第5步我們知道了,SocketZ發來的內容為SocketY給發的內容,而SocketY的內容來自內網服務,經過兩次數據轉發,瀏覽器最終得到了來自內網站點的數據。
- 端口轉發的實現不做介紹,其原理與以上類似。
本實現或許不是最好的實現,但是這種是我感覺最好實現和理解的一種方案,如果你有更好的實現方案,歡迎一起交流。通過以上的原理介紹,再讀FastTunnel源碼應該十分順暢,項目還有很多地方需要優化,歡迎大家一起進行完善,打造.net平台最優秀的內網穿透工具。
倉庫地址
FastTunnel-GitHub
FastTunnel-Gitee
SuiDao(免費使用內網穿透)
走過路過的點個star支持一下
有興趣的可加qq群

聲明
開源項目及文章皆為原創內容,轉載或摘抄請附 原文鏈接