代码拉取完成,页面将自动刷新
由于本地无法被公网访问,如果想通过请求公网服务器将流量转发给本地就实现了内网穿透
jar包下载地址
服务端:EasyProxyServer
客户端:EasyProxyClient
docker镜像:docker pull yujian1996/eps:1.0
源代码(点个star谢谢):Github
大致流程图
整体设计
大概设计思路就是,在公网服务器上部署一个server端,在本地部署多个client端,client与server建立tcp长连接,进行流量转发,client与server已经建立连接,并且使用自定义协议通信,由于客户端的请求可能为socket或http等方式,所以不能与server共用一个handler,每个穿透都需要有自己的端口定义自己的pipeline进行编解码。所以会出现一个类似如下的图
编码
先从客户端启动命令上进行解释
java -jar EasyProxyClient-1.0.jar
-server 47.110.122.122:18888 -pp 9001 -local localhost:8080
命令 | 作用 |
---|---|
-server | 代表服务器的host:port |
-local | 代表需要穿透的本地host:port |
-pp | 与本地端口映射的服务器端口,在服务器请求该端口穿透到本地服务 |
-h | 提示以上命令 |
在jar包同级目录放入proxy.yml并按照模板编写,可一次代理多个本地端口
java -jar EasyProxyClient-1.0.jar -yml
proxys:
- server: localhost:18888
local: localhost:8080
proxyPort: 18080
- server: localhost:18888
local: localhost:8081
proxyPort: 18081
当与服务端建立连接后,EasyProxyServer会新监听一个-pp指定的端口,监听成功后,通知EasyProxyClient,EasyProxyClient与本地服务建立连接,然后就可以访问了。
服务端的启动命令解释
java -jar EasyProxyServer-1.0.jar -port 18888 -sync
命令 | 作用 |
---|---|
-port | 启动的端口号 |
-sync | 是否同步等待(设置后不会无限等待,可选) |
time | 同步等待时间,超时自动返回,可选 默认30S |
-h | 提示以上命令 |
# 命令和上面一样,注意SPORT需要和容器暴露的端口保持一致,客户端指定的端口也要暴露出来,或者使用host模式
docker run -d --name aaa -p 18888:18888 -e SPORT=18888 -e SYNC=true -e -TIME=30 yujian1996/eps:1.0
#host模式
docker run -d --name aaa --network=host -e SPORT=18888 -e SYNC=true -e -TIME=30 yujian1996/eps:1.0
遇到的几个问题,和解决办法
if (idleEvent.state() == IdleState.READER_IDLE) {
connbak();
} else if (idleEvent.state() == IdleState.WRITER_IDLE) {
connbak();
} else if (idleEvent.state() == IdleState.ALL_IDLE) {
ctx.close();
}
//数据包最大长度 数据包长度偏移量 数据包长度字节数 剩余长度 忽略长度
//我这里数据包长度偏移量是8 前面有4个字节的magic和4个字节的type
LengthFieldBasedFrameDecoder(Integer.MAX_VALUE,8,4,0,0)
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。