Intranet to public network.
基本原理:
- 客户端与服务端建立
websocket连接(为什么是ws? 因为我刚好最近在弄这个,其他的也可以,比如说直接一个裸的tcp),然后告诉服务端自己要暴露到公网的端口。 - 服务端然后在本机进行端口绑定并把端口映射关系发送给客户端。
比如说客户端想要暴露
3306,然后服务端收到了,在本地随机监听一个可用的端口-> 53821 然后发送给客户端,53821:3306 - 当有用户连接服务端的
53821时,服务端会发送一个USER_CONNECT的数据包并携带53821以及这个用户的随机id(使用netty的channelId)发送到客户端 - 客户端收到
USER_CONNECT包以后,根据保存的端口映射关系,监听到本地的3306端口,然后将这个端口和channelId绑定 - 剩下的就是数据的转发了。
- 比如说客户端监听的对应的
3306有数据要转发了,就会通过websocket连接发送给服务端一个FORWARD_DATA类型的数据包,并携带channelId,然后服务端会自动路由到对应的客户端。 - 服务端到客户端的数据转发流程也是同理。
- get client
- register your client
curl --location --request POST 'http://114.132.249.192:10086/register' \
--header 'Content-Type: application/json' \
--data-raw '{
"ports": [
"63342" // client wants exposed port
]
}'
// response
{"token":"348f952bb76e44d5a818440ef1bec53a"}- start your client
./burst-client -sip 114.132.249.192 -sp 10086 -t {{token}}=> 114.132.249.192:28236 is your mapped address information
