ngrok支持tcp tunnel和http以及https,但是ngrok的tcp代理似乎优化不够好,当一段时间闲置tcp连接的话,再连接会出现连接不上的问题。

首先来看看ngrok的tcp tunnel的原理: 假设ngrok的client端配置文件如下

#填写服务器域名和连接端口
server_addr: ngrok.domain.com:4444
trust_host_root_certs: false
tunnels:
 adb:
 #这里的remote_port是指从ngrok.domain.com:5555->被代理端的5555端口
  remote_port: 5555
  proto:
  #使用tcp协议
   tcp: 5555
sequenceDiagram
被代理端-->ngrok client: \n
ngrok client->>ngrok server: 连接请求tls
ngrok server->>ngrok client: 鉴定确认连接请求tls
ngrok client->>被代理端: 建立tcp连接
ngrok client->>ngrok server: 请求监听5555端口
ngrok server->>ngrok client: 已经监听5555端口
用户端->>ngrok server: 建立和ngrok server的5555端口的tcp连接
ngrok server->>ngrok client: 请求ngrok client建立连接
ngrok client->>ngrok server: 建立专门用于5555的tcp连接
ngrok client->>被代理端: 传输来自sever 5555 tcp连接的流量到被代理端

可以发现一共三条tcp连接,一条是被代理端到ngrok client的和ngrok client到ngrok server端的

……

阅读全文