Skip to content

Latest commit

 

History

History
115 lines (55 loc) · 4.17 KB

lanProxy分析.md

File metadata and controls

115 lines (55 loc) · 4.17 KB

最近发现了一款比较好的内网映射工具-lanproxy,

采用 java 开发,源码质量很高

至于内网映射是什么,有什么应用场景,这里就不介绍了。lanproxy官网都有介绍

一. 结构图

连接流程图:

image-20200810150605359

传输流程图略:

大体传输路径就是 30002转发程序,找到步骤6中的连接,最后转发给最终的实际服务。

疑问:为什么proxy-client需要步骤6:新增一条新的连接,

因为一个proxy-client可能对应多条转发端口,

当多个浏览器/客户端都通过步骤2发起连接时,如果都采用步骤1的连接,一缺少隔离性 二性能会有影响

步骤1中发起连接的职责就是:1. 表明prox-client身份,2. 为后续步骤4、5提供处理逻辑,

二. proxy-server

1. config-properties

image-20200810130549617

2. 源码分析

proxy-server分为两个监听模块:ProxyServerContainerWebConfigContainer

  1. ProxyServerContainer负责和proxy-client通讯

  2. WebConfigContainer负责对外提供web配置页面

分析proxy-server源码前遇到一个小的问题:

在idea打开源码调试过程中System.getProperties("user.dir")获取的路径有问题,下图是我的项目结构

image-20200810192147995

System.getProperties("user.dir")期望值是:D:\gitResource\tmp\lanproxy\proxy-server

但是返回的却是D:\gitResource\tmp\lanproxy,

需要做如下配置

image-20200810192338625

2.1. 启动ProxyServerContainer

ProxyServerContainer负责两部分连接:

  1. proxy-client通讯连接。默认监听端口4900,对应的处理类是:ServerChannelHandler
  2. 转发端口连接(如用户通过web配置了公网端口30002,则需要开启30002端口监听请求),对应代码中startUserPort,对应的处理类是:UserChannelHandler

由于随着web配置的公网端口的改变,ProxyServerContainer需要能够实时的启动相关端口的监听,

所以这里采用了观察者模式:ProxyServerContainer既实现了Container,也实现了ConfigChangedListener,当配置参数变更时,能够做出实时响应。

image-20200810131135454

2.2. 启动WebConfigContainer

image-20200810132726108

HttpRequestHandler作为web所有的请求入口,在其channelRead0中对请求进行静态、动态路由转发

具体的动态路由转发,由RouteConfig配置

,我们主要关注下面的路由处理/config/update

image-20200810133109840

当用户配置公网端口转发时,会交由该路由处理程序,注意此处的ProxyConfig.getInstance().update(config);,会通知ProxyServerContainer及时开启相关监听端口

2.3. proxy-client

proxy-client启动后连接proxy-server4900端口,

连接成功后发送clientkey,即客户端密钥给-proxyserver验证其身份,

由于proxy-client添加了IdleCheckHandler,会和proxy-server一直保持心跳

image-20200810134553877

下面是服务端接受到认证信息的处理流程,参见ServerChannelHandler

image-20200810135457241

2.4. 访问转发端口UserChannelHandler

首先关注下channelActive方法,对应着上述流程图中步骤3:

image-20200810151626722

后续数据传输时,关注下channelRead0:

image-20200810151838113

现在可以实际测试下转发效果了,由于我们在之前配置了公网30002作为转发端口,转发至127.0.0.1:8080

可以在proxy-client所在机器上开一个TCP监听8080

image-20200810140439685