内网穿透工具Ngrok的实现原理

suoniao 2021-01-21
需要:0索币

流程图

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>表示数据的长度和负载。

数据格式:

  • 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
    }
    
  • ReqTunnel

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

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

    type ReqProxy struct {
    }
    
  • RegProxy

    type RegProxy struct {
    	ClientId string
    }
    
  • StartProxy

    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
    }
    
  • Ping

    type Ping struct {
    }
    
  • Pong

    type Pong struct {
    

    }

  • 来源https://my.oschina.net/jianming/blog/1633243

回帖
  • 消灭零回复
广告位招租 100元/月 广告位招租 100元/月
相关主题
内网穿透反向代理库frp的实现原理分析一 0
内网穿透软件ngrok使用教程详解 配合本地路由器 0
内网穿透工具Ngrok的实现原理 0
frps内网穿透实现原理及其源码分析详解 0
go语言内网穿透工具FRP实现原理分析 0
frp通过自定义域名访问部署于内网的 web 服务 0
原来EUC-CN是gb2312编码的一种表示方法 0
索鸟快传2.1.0版本发布 0
golang网络数据读取timeout的处理 – 以SetReadDeadline为例 0
索鸟网广告位招租 0
golang利用通道chan实现一个通用的TCP连接池 0
frpc和frps的交互流程详解了解了frp是如何进行TCP代理的 0
golang实现内存池 go语言字节池byte pool实现代码 0
golang网络编程之基于TCP协议实现长连接 golang心跳检测 0
国产光刻机产业链最新核心材料ArF 193nm光刻胶通过用户认证 0
javascript数组相关函数length属性、delete关键字、pop()栈方法、shift() 0
Qt为我们提供了几个可以用于线程Sleep的函数msleep和usleep 0
QT程序闪退错误捕获教程利用DbgHelp 错误调试技术 0
简单快速修改Qtcreator项目工程的名称 0
golang 的interface接口类型断言 0
相关主题
原来EUC-CN是gb2312编码的一种表示方法 0
索鸟快传2.1.0版本发布 0
golang网络数据读取timeout的处理 – 以SetReadDeadline为例 0
索鸟网广告位招租 0
golang利用通道chan实现一个通用的TCP连接池 0
frpc和frps的交互流程详解了解了frp是如何进行TCP代理的 0
golang实现内存池 go语言字节池byte pool实现代码 0
golang网络编程之基于TCP协议实现长连接 golang心跳检测 0
国产光刻机产业链最新核心材料ArF 193nm光刻胶通过用户认证 0
javascript数组相关函数length属性、delete关键字、pop()栈方法、shift() 0
Qt为我们提供了几个可以用于线程Sleep的函数msleep和usleep 0
QT程序闪退错误捕获教程利用DbgHelp 错误调试技术 0
简单快速修改Qtcreator项目工程的名称 0
golang 的interface接口类型断言 0
golang类型断言type的使用 0
golang依赖包管理 mod使用教程 0
golang表单验证库validator 0
如何使用Go语言实现一个简单的异步任务框架呢?生产者消费者模型 0
内网穿透反向代理工具frp实现TCP协议代理源码分析 0
内网穿透反向代理库frp的实现原理分析一 0