最近发现了一款比较好的内网映射工具-lanproxy
,
采用 java 开发,源码质量很高
至于内网映射是什么,有什么应用场景,这里就不介绍了。lanproxy
官网都有介绍
连接流程图:
传输流程图略:
大体传输路径就是 30002转发程序,找到步骤6中的连接,最后转发给最终的实际服务。
疑问:为什么proxy-client
需要步骤6:新增一条新的连接,
因为一个proxy-client
可能对应多条转发端口,
当多个浏览器/客户端都通过步骤2发起连接时,如果都采用步骤1的连接,一缺少隔离性 二性能会有影响
步骤1中发起连接的职责就是:1. 表明prox-client
身份,2. 为后续步骤4、5提供处理逻辑,
proxy-server
分为两个监听模块:ProxyServerContainer
和WebConfigContainer
-
ProxyServerContainer
负责和proxy-client
通讯 -
WebConfigContainer
负责对外提供web
配置页面
分析proxy-server源码前遇到一个小的问题:
在idea打开源码调试过程中System.getProperties("user.dir")
获取的路径有问题,下图是我的项目结构
System.getProperties("user.dir")
期望值是:D:\gitResource\tmp\lanproxy\proxy-server
但是返回的却是D:\gitResource\tmp\lanproxy
,
需要做如下配置
ProxyServerContainer
负责两部分连接:
proxy-client
通讯连接。默认监听端口4900,对应的处理类是:ServerChannelHandler
- 转发端口连接(如用户通过web配置了公网端口30002,则需要开启30002端口监听请求),对应代码中
startUserPort
,对应的处理类是:UserChannelHandler
由于随着web配置的公网端口的改变,ProxyServerContainer
需要能够实时的启动相关端口的监听,
所以这里采用了观察者模式:ProxyServerContainer
既实现了Container
,也实现了ConfigChangedListener
,当配置参数变更时,能够做出实时响应。
HttpRequestHandler
作为web
所有的请求入口,在其channelRead0
中对请求进行静态、动态路由转发
具体的动态路由转发,由RouteConfig
配置
,我们主要关注下面的路由处理/config/update
当用户配置公网端口转发时,会交由该路由处理程序,注意此处的ProxyConfig.getInstance().update(config);
,会通知ProxyServerContainer
及时开启相关监听端口
proxy-client
启动后连接proxy-server
4900端口,
连接成功后发送clientkey
,即客户端密钥给-proxyserver
验证其身份,
由于proxy-client
添加了IdleCheckHandler
,会和proxy-server
一直保持心跳
下面是服务端接受到认证信息的处理流程,参见ServerChannelHandler
:
首先关注下channelActive
方法,对应着上述流程图中步骤3:
后续数据传输时,关注下channelRead0
:
现在可以实际测试下转发效果了,由于我们在之前配置了公网30002作为转发端口,转发至127.0.0.1:8080
可以在proxy-client所在机器上开一个TCP监听8080