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支持一下

有興趣的可加qq群

聲明

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM