FastTunnel-内网穿透原理揭秘
之前写了一篇关于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群

声明
开源项目及文章皆为原创内容,转载或摘抄请附 原文链接
FastTunnel-内网穿透原理揭秘的更多相关文章
- 分享下超实用的用skura frp做内网穿透的经验
操作目的: 使无公网ip的主机能被外网访问,实现ssh对服务器的远程管理 硬件准备: 1.服务端:skura frp主机(skura frp 免费提供,有待创建) 2.客户端:接在无线路由器(内网)上 ...
- 手写内网穿透服务端客户端(NAT穿透)原理及实现
Hello,I'm Shendi. 这天心血来潮,决定做一个内网穿透的软件. 用过花生壳等软件的就知道内网穿透是个啥,干嘛用的了. 我们如果有服务器(比如tomcat),实际上我们在电脑上开启了服务器 ...
- 测试龙芯 LoongArch .NET之 使用 FastTunnel 做内网穿透远程计算机
龙芯3A5000 已经上市,与龙芯3A5000配套的三大编译器GCC.LLVM.GoLang和三大虚拟机Java.JavaScript..NET均已完成开发,从老伙计哪里搞来一台3A5000 机器,安 ...
- [svc]frp内网穿透
什么是穿透 可以任意暴漏内网任何服务,加入你在你的办公网络有台pc,可以上网就可以了, 你可以在你电脑上安装各类服务器, 暴漏如80 22等端口, 注意 这可以暴漏到公网哦, 在出口不做任何nat情况 ...
- 如何使用 frp 实现内网穿透
这有一个专注Gopher技术成长的开源项目「go home」 背景 作为一名程序员,家里多多少少会有一些落了灰的电脑,如果把闲置的电脑变成服务器,不仅有良好的配置,还能用来做各种测试,那就再好不过了. ...
- 基于C#的内网穿透学习笔记(附源码)
如何让两台处在不同内网的主机直接互连?你需要内网穿透! 上图是一个非完整版内外网通讯图由内网端先发起,内网设备192.168.1.2:6677发送数据到外网时候必须经过nat会转换成 ...
- frp内网穿透
原理 frp(fast reverse proxy)分为Server端和Client端,Server端安装在带有公网IP的服务器上,Client安装在内网环境但能上网的普通PC中. 流程: Serve ...
- NAT、端口映射、内网穿透、公网IP都是啥
原文地址:https://wuter.cn/1756.html/ 一.IPv4地址 IP协议是为计算机网络相互连接进行通信而设计的协议,它是能使连接到网上的所有计算机网络实现相互通信的一套规则. 这里 ...
- 基于Yarp的http内网穿透库HttpMouse
简介 前几天发表了<基于Yarp实现内网http穿透>,当时刚刚从原理图变成了粗糙的代码实现,项目连名字都还没有,也没有开放源代码.在之后几天的时间,我不断地重构,朝着"可集成. ...
随机推荐
- MarkDown笔记二
表格 列1|列2|列3 --|--|-- 内容1|内容2|内容3 下例冒号在左为左对齐(默认),在右为右对齐,在俩侧为居中对齐 | 左对齐 | 右对齐 | 居中对齐 | | :-----| ----: ...
- 【补档_STM32单片机】脉搏波采集显示硬件设计
一.脉搏波简介 脉搏一般情况下指的都是动脉脉搏.每分钟的脉搏次数称为脉率,正常情况下与心率是一致的.心脏的一次收缩和舒张成为一个心动周期.在每个心动周期内,心室的收缩和舒张会引起脉内压力的周期性波 ...
- Mybatis3详解(十四)----Mybatis的分页
1.前言 在前面学习mybatis的时候,会经常对数据进行增删改查操作,使用最多的是对数据库进行查询操作,但是前面都是简单的案例,所以查询的数据量不是很大,自然查询时没有任何压力,但是如果在实际的项目 ...
- 纯C++代码实现将像素矩阵保存为bmp图片
由于工作需要,时常需要将像素矩阵保存图片显示观看.为此,特地总结了三种使用纯C++代码生成bmp图片的方法.分别是使用自定义数据.从外界导入的txt和csv以及从图片中导入的数据. 1.使用自定义数据 ...
- SQL Server 将两行或者多行拼接成一行数据
一个朋友,碰到一个问题. 就是查询出来的结果集,需要每隔三行.就将这三行数据以此拼接为一行显示.起初我想着用ROW_NUMBER加CASE WHEN去做,发现结果并非我预期那样. 结果如下: 由于别人 ...
- 人脸标记检测:ICCV2019论文解析
人脸标记检测:ICCV2019论文解析 Learning Robust Facial Landmark Detection via Hierarchical Structured Ensemble 论 ...
- 适用于CUDA GPU的Numba例子
适用于CUDA GPU的Numba例子 矩阵乘法 这是使用CUDA内核的矩阵乘法的简单实现: @cuda.jit def matmul(A, B, C): """Perf ...
- CodeGen API分析
CodeGen API分析 作为使用命令行界面的替代方法,开发人员可以使用核心CodeGen环境编写自定义工具或实用程序来生成代码,从而将CodeGen更紧密地集成到开发环境中. 为了实现这一点,Co ...
- Timer定时器开发
Timer定时器开发 定时器的作用是不占线程的等待一个确定时间,同样通过callback来通知定时器到期. 参考:https://github.com/sogou/workflow 定时器的创建 同样 ...
- 用MAILX 发送邮件
使用 25 端口发送 mail 编辑/etc/mail.rc 文件,添加以下信息vi /etc/mail.rc set from=xxx@163.com smtp=smtp.163.comset sm ...