FastTunnel-內網穿透原理揭祕

gui.h發表於2021-07-15

之前寫了一篇關於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群

FastTunnel-內網穿透原理揭祕

宣告

開源專案及文章皆為原創內容,轉載或摘抄請附 原文連結

相關文章