# LPS **Repository Path**: leejh1994/LPS ## Basic Information - **Project Name**: LPS - **Description**: Lee开发的LPS服务器 - **Primary Language**: Go - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-07-17 - **Last Updated**: 2021-11-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Lee开发的LPS服务器 # 机制描述 LPS软件旨在实现内网和外网的网络穿透工作。 LPS分为两个部分,一个是远端服务一个是本地服务。本地服务主动连接远端的服务器,当远端请求接收到socket连接(连接A)的时候,将远端服务给本地服务发送指令,让本地服务与远端服务创建新的远端连接(连接B),在本地服务与本地端口的连接(连接C)。 ## 数据传输过程 A->B->C C->B->A ## 业务拆分 ### 本地服务器主动连接到远端服务器 * 本地服务根据本地配置文件查询自己的id,自己的版本,服务器ip和端口 * 本地服务连接远端服务的指定端口,上报自己的版本包和id。 ~~~ { "action":"loadNewConnect" "id":"1", "version":"1" } ~~~ * 远服务将socket连接,id,version打包存储在容器内,等待调度使用。 ### 远端服务器接收到socket数据链接 ~~~ { "远端端口":{ "loadID":"32312", "ip":"127.0.0.1", "port":"3389" } } ~~~ * 客户端连接远端服务开放的端口,服务端创建连接A。然后服务端查找该端口对应的本地服务id,给该服务发送指令。然后再次监听这个端口。等待本地服务的连接。 ~~~ { "action":"mappPort", "ip":"127.0.0.1", "port":"3389", "remotePort":"123" "version":"1" } ~~~ * 本地服务端接收到指令,创建本地连接C,根据指令信息创建连接。创建完成之后再创建一个新的本地服务于服务端的连接B。发送响应指令,到达此处连接建立完成。 ~~~ { "action":"mappPortACK", "ip":"127.0.0.1", "port":"3389", "remotePort":"123" "version":"1" } ~~~ ### A->B->C * A接收到数据,A转发到B,B转发到C ### C->B->A * C接收到数据,C转发到B,B转发到A ## 服务端记录 ``` { "客户端服务ID":{ "映射的端口":{"ip":"127.0.0.5", "port":"8080"} } } ``` ## 连接逻辑 ```plantuml @startuml participant 本地服务器A as lsvrA participant 远端服务器 as rsvr actor 客户端A as userA @enduml ```