FastTunnel-內網穿透原理揭秘

之前寫了一篇關於GVP開源項目FastTunnel的一篇介紹 《FastTunnel-開源內網穿透框架》,只簡單介紹了使用方法,不少夥伴對其原理表示好奇,今天畫抽空了一下其內部實現原理流程。
不知道其他穿透軟體實現是什麼樣子的,FastTunnel是於2020年開始編寫,經過幾次嘗試,最終採取一種實現方案,自認是最容易理解和去實現的。

FastTunnel內網穿透實現原理圖

揭開內網穿透的神秘面紗

1270埠為http監聽埠,1271為客戶端通訊埠

  1. 客戶端登錄,將子域名web1註冊到服務端,此socket一直保持在線,維持客戶端和服務端的連接
  2. 服務端收到註冊請求,創建Map集合,進行登記,此時登錄完成,後面該客戶端不斷發起心跳互相檢測
  3. 此時用戶發起一次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開始接收數據,並把接收的數據互相發給對方
  4. 服務端收到Swap應答請求,根據guid查找KV集合,尋找等待接收響應數據的Sockt1,一旦找到,Socket1將與SocketZ進行數據互相轉發。
  5. Socket1接收到SocketZ發來的內容,根據第5步我們知道了,SocketZ發來的內容為SocketY給發的內容,而SocketY的內容來自內網服務,經過兩次數據轉發,瀏覽器最終得到了來自內網站點的數據。
  6. 埠轉發的實現不做介紹,其原理與以上類似。

本實現或許不是最好的實現,但是這種是我感覺最好實現和理解的一種方案,如果你有更好的實現方案,歡迎一起交流。通過以上的原理介紹,再讀FastTunnel源碼應該十分順暢,項目還有很多地方需要優化,歡迎大家一起進行完善,打造.net平台最優秀的內網穿透工具。

倉庫地址

FastTunnel-GitHub
FastTunnel-Gitee
SuiDao(二次開發示例)

走過路過覺得寫的不錯的點個star,star又不花兄弟們一分錢

有興趣的可加qq群

聲明

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