之前写了一篇关于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群

声明

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

FastTunnel-内网穿透原理揭秘的更多相关文章

  1. 分享下超实用的用skura frp做内网穿透的经验

    操作目的: 使无公网ip的主机能被外网访问,实现ssh对服务器的远程管理 硬件准备: 1.服务端:skura frp主机(skura frp 免费提供,有待创建) 2.客户端:接在无线路由器(内网)上 ...

  2. 手写内网穿透服务端客户端(NAT穿透)原理及实现

    Hello,I'm Shendi. 这天心血来潮,决定做一个内网穿透的软件. 用过花生壳等软件的就知道内网穿透是个啥,干嘛用的了. 我们如果有服务器(比如tomcat),实际上我们在电脑上开启了服务器 ...

  3. 测试龙芯 LoongArch .NET之 使用 FastTunnel 做内网穿透远程计算机

    龙芯3A5000 已经上市,与龙芯3A5000配套的三大编译器GCC.LLVM.GoLang和三大虚拟机Java.JavaScript..NET均已完成开发,从老伙计哪里搞来一台3A5000 机器,安 ...

  4. [svc]frp内网穿透

    什么是穿透 可以任意暴漏内网任何服务,加入你在你的办公网络有台pc,可以上网就可以了, 你可以在你电脑上安装各类服务器, 暴漏如80 22等端口, 注意 这可以暴漏到公网哦, 在出口不做任何nat情况 ...

  5. 如何使用 frp 实现内网穿透

    这有一个专注Gopher技术成长的开源项目「go home」 背景 作为一名程序员,家里多多少少会有一些落了灰的电脑,如果把闲置的电脑变成服务器,不仅有良好的配置,还能用来做各种测试,那就再好不过了. ...

  6. 基于C#的内网穿透学习笔记(附源码)

    如何让两台处在不同内网的主机直接互连?你需要内网穿透!          上图是一个非完整版内外网通讯图由内网端先发起,内网设备192.168.1.2:6677发送数据到外网时候必须经过nat会转换成 ...

  7. frp内网穿透

    原理 frp(fast reverse proxy)分为Server端和Client端,Server端安装在带有公网IP的服务器上,Client安装在内网环境但能上网的普通PC中. 流程: Serve ...

  8. NAT、端口映射、内网穿透、公网IP都是啥

    原文地址:https://wuter.cn/1756.html/ 一.IPv4地址 IP协议是为计算机网络相互连接进行通信而设计的协议,它是能使连接到网上的所有计算机网络实现相互通信的一套规则. 这里 ...

  9. 基于Yarp的http内网穿透库HttpMouse

    简介 前几天发表了<基于Yarp实现内网http穿透>,当时刚刚从原理图变成了粗糙的代码实现,项目连名字都还没有,也没有开放源代码.在之后几天的时间,我不断地重构,朝着"可集成. ...

随机推荐

  1. 调试备忘录-SWD协议解析

    目录--点击可快速直达 目录 写在前面 1  SWD协议简介 2  SWD物理层协议解析 2.1  SWD通信时序分析 2.2  SWD 寄存器简介 2.2.1  DP寄存器 2.2.2  AP寄存器 ...

  2. DDD中限界上下文与通用语言的作用

    什么是通用语言 通用语言, 最主要的目的就是减少交流中信息丢失, 在实际开发中, 可能关联很多人, 例如有业务层面的业务细节制定者.领域专家.产品经理.项目经理 .架构师.开发经理.测试经理等等, 即 ...

  3. Linux系统挂载NFS文件系统

    https://help.aliyun.com/document_detail/90529.html?spm=a2c4g.11186623.6.570.43212f30T5yM4w

  4. GO语言复合类型04---映射

    package main import "fmt" /* 映射(map)是键值对(key-value)数据的集合 根据键key可以快速检索值value 键值的类型可以是任意的,ke ...

  5. Jmeter- 笔记12 - 性能测试分析 & 性能测试流程

    性能测试分析 场景设计.监视图表: 设计场景:阶梯式.波浪式 监视器: 收集用于性能分析的数据:TPS图表.聚合报告\汇总报告.察看结果树.响应时间.吞吐量 服务器资源监控:cpu.内存.磁盘io 分 ...

  6. zk客户端及锁的使用

    1.生成zk客户端对象 private CuratorFramework buildClient() { logger.info("zookeeper registry center ini ...

  7. H.265视频编码与技术全析(上)

    H.265视频编码与技术全析(上) 一. 概述 作为新一代视频编解码格式,H.265得到越来越广泛的应用.不久之前,苹果公司在翘首期盼中发布了iPhone6,该款手机较之以往的iPhone,不仅仅只是 ...

  8. MindSpore数据集mindspore::dataset

    MindSpore数据集mindspore::dataset ResizeBilinear #include <image_process.h> bool ResizeBilinear(L ...

  9. Turing渲染着色器网格技术分析

    Turing渲染着色器网格技术分析 图灵体系结构通过使用 网格着色器 引入了一种新的可编程几何着色管道.新的着色器将计算编程模型引入到图形管道中,因为协同使用线程在芯片上直接生成紧凑网格( meshl ...

  10. .Net RabbitMQ实战指南——进阶(二)

    持久化 持久化可以提高RabbitMQ的可靠性,防止异常情况下的数据丢失.RabbitMQ的持久化分为三个部分:交换器的持久化.队列的持久化和消息的持久化. 交换器的持久化通过声明队列时将durabl ...