FastTunnel-内网穿透原理揭秘
2024-09-01 23:48:37
之前写了一篇关于GVP开源项目FastTunnel的一篇介绍 《FastTunnel-开源内网穿透框架》,只简单介绍了使用方法,不少伙伴对其原理表示好奇,今天画抽空了一下其内部实现原理流程。
不知道其他穿透软件实现是什么样子的,FastTunnel是于2020年开始编写,经过几次尝试,最终采取一种实现方案,自认是最容易理解和去实现的。
FastTunnel内网穿透实现原理图
揭开内网穿透的神秘面纱
1270端口为http监听端口,1271为客户端通信端口
- 客户端登录,将子域名web1注册到服务端,此socket一直保持在线,维持客户端和服务端的连接
- 服务端收到注册请求,创建Map集合,进行登记,此时登录完成,后面该客户端不断发起心跳互相检测
- 此时用户发起一次Http请求到1270端口,socket1
- 监听1270端口的Socket收到该请求,并为该次http请求分配全局唯一的guid,后面会用到guid;
- 读取socket1所有header,解析host内容,解析为
web1.abc.com
,去查找哪个客户端注册了这个host,找不到,则客户端不在线,否则对客户端发送Swap指令,表示通知该客户端,有人要请求你内网的服务啦,请求的域名为web1; - 本次请求保存到一个KV集合中,等待客户端建立Swap连接
- 客户端收到Swap指令,创建2个临时socket分别连接本地服务SokcetY和服务端1271端口SocketZ,SocketZ连接后发送一条Swap应答指令携带guid,服务端收到此应答便知道该scoket是用于数据交换的
- SocketY与SocketZ开始接收数据,并把接收的数据互相发给对方
- 服务端收到Swap应答请求,根据guid查找KV集合,寻找等待接收响应数据的Sockt1,一旦找到,Socket1将与SocketZ进行数据互相转发。
- Socket1接收到SocketZ发来的内容,根据第5步我们知道了,SocketZ发来的内容为SocketY给发的内容,而SocketY的内容来自内网服务,经过两次数据转发,浏览器最终得到了来自内网站点的数据。
- 端口转发的实现不做介绍,其原理与以上类似。
本实现或许不是最好的实现,但是这种是我感觉最好实现和理解的一种方案,如果你有更好的实现方案,欢迎一起交流。通过以上的原理介绍,再读FastTunnel源码应该十分顺畅,项目还有很多地方需要优化,欢迎大家一起进行完善,打造.net平台最优秀的内网穿透工具。
仓库地址
FastTunnel-GitHub
FastTunnel-Gitee
SuiDao(二次开发示例)
走过路过觉得写的不错的点个star,star又不花兄弟们一分钱
有兴趣的可加qq群
声明
开源项目及文章皆为原创内容,转载或摘抄请附 原文链接
最新文章
- OpenGL ES 3.0: 图元重启(Primitive restart)
- CentOS6.5菜鸟之旅:VIM插件NERDtree初探
- (转)女生应该找一个玩ACM的男生
- 由于 add 运算符中“Chinese_PRC_CI_AS”和“Chinese_PRC_CS_AS_WS”之间的排序规则冲突
- linux连接远程服务器提示拒绝访问
- ENVI Services Engine5.1 应用开发入门教程
- TortoiseSVN中分支和合并实践
- C#this的五种用法
- [转载] Redis-benchmark使用总结
- Windows Developer Day Review
- 第二周作业(pta存在的问题)
- 学号 20175223 《Java程序设计》第 5 周学习总结
- Thrift架构介绍
- 扩展Linux磁盘空间
- js中的DOM操作汇总
- [Hbase]Hbase章3 Hbase单点故障
- 【刷题】BZOJ 1468 Tree
- CheckStyle——检查编码格式等是否符合规范
- 第一个 Windows 界面程序
- websphere8 从安装到部署 测试集群应用程序 安装j2ee程序(非常详细)