Ngrok內網穿透原理

Ngrok穿透原理

流程圖

Ngrok流程

  1. Client與Server創建一個scoket鏈接,而後發送一個Auth請求,Server驗證後,返回AuthResp
  2. 接着Client發送ReqTunnel像服務器註冊通道,好比,HTTP,HTTPS,TCP,其中包含想要申請的二級域名,服務器返回NewTunnel,若是Client的二級域名請求爲空,服務器會隨機分配。
  3. Server等待瀏覽器,APP等訪問,當有APP訪問,Server會檢查二級域名是不是已經註冊了的,若是是,則發送ReqProxy給Client。Client收到請求後會建立一個新的Socket鏈接到Server,併發送RegProxy請求,服務器收到後,返回StartProxy,並開始使用新的Socket鏈接作中繼。

通訊數據格式

數據經過Socket通訊,主要以Json格式數據爲主。瀏覽器

在數據的開頭,有2個分別以64bit的無符號整型<message length><message payload>表示數據的長度和負載。服務器

數據格式:session

  • Auth
type Auth struct {
	Version   string // protocol version
	MmVersion string // major/minor software version (informational only)
	User      string
	Password  string
	OS        string
	Arch      string
	ClientId  string // empty for new sessions
}
  • AuthResp併發

    type AuthResp struct {
    	Version   string
    	MmVersion string
    	ClientId  string
    	Error     string
    }
  • ReqTunneldom

    type ReqTunnel struct {
    	ReqId    string
    	Protocol string
    
    	// http only
    	Hostname  string
    	Subdomain string
    	HttpAuth  string
    
    	// tcp only
    	RemotePort uint16
    }
  • NewTunneltcp

    type NewTunnel struct {
    	ReqId    string
    	Url      string
    	Protocol string
    	Error    string
    }
  • ReqProxyui

    type ReqProxy struct {
    }
  • RegProxythis

    type RegProxy struct {
    	ClientId string
    }
  • StartProxycode

    type StartProxy struct {
    	Url        string // URL of the tunnel this connection connection is being proxied for
    	ClientAddr string // Network address of the client initiating the connection to the tunnel
    }
  • Pingorm

    type Ping struct {
    }
  • Pong

    type Pong struct {
    }
相關文章
相關標籤/搜索