之前写了一篇关于GVP开源项目FastTunnel的一篇介绍 《FastTunnel-开源内网穿透框架》,只简单介绍了使用方法,不少伙伴对其原理表示好奇,今天画抽空了一下其内部实现原理流程。

不知道其他穿透软件实现是什么样子的,FastTunnel是于2020年开始编写,经过几次尝试,最终采取一种实现方案,自认是最容易理解和去实现的。

FastTunnel内网穿透实现原理图

揭开内网穿透的神秘面纱

1270端口为http监听端口,1271为客户端通信端口

  1. 客户端登录,将子域名web1注册到服务端,此socket一直保持在线,维持客户端和服务端的连接
  2. 服务端收到注册请求,创建Map集合,进行登记,此时登录完成,后面该客户端不断发起心跳互相检测
  3. 此时用户发起一次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开始接收数据,并把接收的数据互相发给对方
  4. 服务端收到Swap应答请求,根据guid查找KV集合,寻找等待接收响应数据的Sockt1,一旦找到,Socket1将与SocketZ进行数据互相转发。
  5. Socket1接收到SocketZ发来的内容,根据第5步我们知道了,SocketZ发来的内容为SocketY给发的内容,而SocketY的内容来自内网服务,经过两次数据转发,浏览器最终得到了来自内网站点的数据。
  6. 端口转发的实现不做介绍,其原理与以上类似。

本实现或许不是最好的实现,但是这种是我感觉最好实现和理解的一种方案,如果你有更好的实现方案,欢迎一起交流。通过以上的原理介绍,再读FastTunnel源码应该十分顺畅,项目还有很多地方需要优化,欢迎大家一起进行完善,打造.net平台最优秀的内网穿透工具。

仓库地址

FastTunnel-GitHub

FastTunnel-Gitee

SuiDao(二次开发示例)

走过路过觉得写的不错的点个star,star又不花兄弟们一分钱

有兴趣的可加qq群

声明

开源项目及文章皆为原创内容,转载或摘抄请附 原文链接

最新文章

  1. OpenGL ES 3.0: 图元重启(Primitive restart)
  2. CentOS6.5菜鸟之旅:VIM插件NERDtree初探
  3. (转)女生应该找一个玩ACM的男生
  4. 由于 add 运算符中“Chinese_PRC_CI_AS”和“Chinese_PRC_CS_AS_WS”之间的排序规则冲突
  5. linux连接远程服务器提示拒绝访问
  6. ENVI Services Engine5.1 应用开发入门教程
  7. TortoiseSVN中分支和合并实践
  8. C#this的五种用法
  9. [转载] Redis-benchmark使用总结
  10. Windows Developer Day Review
  11. 第二周作业(pta存在的问题)
  12. 学号 20175223 《Java程序设计》第 5 周学习总结
  13. Thrift架构介绍
  14. 扩展Linux磁盘空间
  15. js中的DOM操作汇总
  16. [Hbase]Hbase章3 Hbase单点故障
  17. 【刷题】BZOJ 1468 Tree
  18. CheckStyle——检查编码格式等是否符合规范
  19. 第一个 Windows 界面程序
  20. websphere8 从安装到部署 测试集群应用程序 安装j2ee程序(非常详细)

热门文章

  1. [源码解析] 深度学习分布式训练框架 Horovod (1) --- 基础知识
  2. 关于LSTM核心思想的部分理解
  3. 201871030132-熊文婷 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告
  4. ARM CPU自动调度神经网络
  5. TVM在ARM GPU上优化移动深度学习
  6. MinkowskiEngine多GPU训练
  7. Python 应用领域以及版本之间的区别
  8. Nucleus 实时操作系统中断(上)
  9. BP-Wrapper:无锁竞争的缓存替换算法系统框架
  10. Java IO学习笔记六:NIO到多路复用