`

基于 HTTP/2 的 WEB 内网穿透实现(转)

 
阅读更多

基于 HTTP/2 的 WEB 内网穿透实现

HTTP/2 引入了二进制分帧层,将 HTTP/1.1 中的请求和响应拆成颗粒度更细的帧(frame),从而实现了优先级、流量控制和 Server Push 等功能;HTTP/2 在单条 TCP 连接上可以打开多个流,从而实现了多路复用;HTTP/2 使用静态字典、动态字典以及哈夫曼编码,对请求 / 响应头部进行压缩。总之,HTTP/2 从协议层面解决了 HTTP/1.1 的诸多问题。

在我之前写的《搭建 ngrok 服务实现内网穿透》这篇文章里,我介绍了如何通过 ngrok 让内网 WEB 在其它网络环境中能够被访问。本文要实现的服务与 ngrok 类似,我把它称之为 Pangolin,中文是穿山甲的意思(名字来自于同事的类似项目,在此表示感谢)。Pangolin 客户端和服务端之间的报文转发,是用 node-http2 这个 Node.js 模块提供的 HTTP/2 服务来实现的。

Pangolin 的需求来自于本博客用户评论(via)。实际上,能实现类似功能的软件很多,有使用私有协议进行转发的,有使用 WebSocket 进行转发的。而我认为 HTTP/2 应该是个不错的选择,打算试一下。最终我花了一个小时实现了一个初步能用的版本,除开 node-http2,全部代码不超过 200 行。代码我放在了 github 上,有兴趣的同学可以玩一下。

下面简单介绍它的原理,我画了一张草图:

pangolin-dataflow

最左侧是最终用来访问服务的浏览器,它可能位于公网,也可能位于其它内网;最右侧是实际提供 WEB 服务的 HTTP Server,它位于内网。显然,左侧浏览器没办法直接访问右侧 WEB 服务,只能借助公网节点作为桥梁。中间的 Pangolin 服务端运行在公网节点上;Pangolin 客户端运行在与 WEB 服务同台机器或者同一网段内。

浏览器发起请求后,请求报文沿着绿色箭头从左到右流动,每个节点都相当于左侧相邻节点的 HTTP Server。唯一的问题出现在 Pangolin 服务端和客户端之间:客户端位于内网,正常情况下 Pangolin 服务端连不上客户端提供的 HTTP Server。

这个问题我用了一个取巧的办法解决:由于 Pangolin 服务端有公网 IP,可以开启 TCP Server,客户端可以通过 IP 和约定的端口与服务端建立 TCP 连接。那么只要稍微改造一下 node-http2 的代码,使它可以基于指定 socket 创建 HTTP/2 Server、发送 HTTP/2 Request,就可以打通所有节点了。这个问题解决后,左侧的请求可以顺利到达右侧,响应数据也可以沿着之前的连接逐级返回。

Pangolin 服务端和客户端内部之间使用 HTTP/2,可以大幅提高性能,降低程序复杂性;对外使用 HTTP/1.1,保证了与已有系统的兼容性。

为了实现内网穿透,Pangolin 需要做以下准备工作:

  • Pangolin 服务端开启 TCP Server;
  • Pangolin 客户端启动 TCP Client,与 Pangolin 服务端连接,得到 socket 长连接;
  • Pangolin 客户端基于这个 socket 连接,开启 HTTP/2 Server;
  • Pangolin 服务端开启 HTTP/1.1 Server,等待浏览器来访问;

实际的数据传输流程如下:

  • 浏览器向 Pangolin 服务端发起请求(HTTP/1.1);
  • Pangolin 服务端基于已有 socket,向 Pangolin 客户端发起请求(HTTP/2);
  • Pangolin 客户端向内网 WEB 服务发起请求,得到响应(HTTP/1.1);
  • Pangolin 客户端基于已有 socket,将响应返回给 Pangolin 服务端(HTTP/2);
  • Pangolin 服务端将响应返回给浏览器(HTTP/1.1);

由于 Pangolin 客户端采用了 HTTP 转发,而不是 TCP 隧道,所以可以轻松实现 ngrok 那样的管理界面,用来查看完整的 Request/Response 信息。目前我还只是简单地打印了请求日志。

HTTP/2 协议本身并没有规定它必须基于 TLS 部署,没有安全层的 HTTP/2 被称之为 h2c(HTTP/2 Cleartext)。目前来看,所有浏览器都不打算支持 h2c,但如果一个系统的某些环节对安全没有那么高的要求,或者已经通过了其它方案确保了安全,部署 h2c 也是一个非常好的选择。现在很多 HTTP/2 工具和类库同时支持 h2 和 h2c,node-http2 也是如此。

实际上,我为了测试方便,在实现 pangolin 时也选择了 h2c。通过 Wireshark 抓包可以看出,HTTP/2 层之下直接就是 TCP 层:

wireshark-h2c

好了,本文就讨论这么多内容,大家有什么问题或想法欢迎给我留言。

本文链接:https://imququ.com/post/tunnel-to-localhost-base-on-http2.html参与评论

分享到:
评论

相关推荐

    基于Swoole的内网穿透支持本地微信开发Web开发让外网能够访问到

    基于 Swoole 的内网穿透,支持本地微信开发、Web开发,让外网能够访问到!山寨简易版 Ngrok!

    一个基于Python的TCP内网穿透工具,支持向公网投射内网应用(实验)+源代码+文档说明

    一个基于Python的TCP内网穿透工具,可以向外网映射内网TCP应用,如http MySQL SSH RDP # Requirement > * 一台带有公网IP的云主机 > * 服务器和客户端均装有Python3环境 # Experience 进入`PNAT-internal/src/main...

    Bullet:【主线】基于Ngrok内网穿透开源项目,稳定、高效的内网穿透系统。私有部署、云服务

    Bullet是一款开源的反向代理内网穿透利器,采用Java技术实现了基于Websocket的Bullet内网穿透交互协议,通过自定义的协议控制Ngrok客户端实现Web界面管理。注意:本项目对Ngrok源码定制化的修改以满足安全性等需求,...

    EarthWorm 内网穿透神器

    EarthWorm是一套轻量便携且功能强大...相较于其他穿透工具,如reGeorg等, EarthWorm可以穿透更复杂的内网环境同时也不需要跳板机运行web服务,也可以支持多平台间的转接通讯,如Linux、Windows、MacOS、Arm-Linux等。

    应用网关Nginx+Https证书+内网穿透+图片切割水印+网关登录

    它从底层Socket原始通信层开始,采用多线程、多任务模式从新构建Web服务,充分发挥当下多核的CPU的多任务并行性能,达到不输nginx的性能表现,而多线程、多任务天生比多进程模式更有编程可控性,基于这此原理,为...

    LightTunnel-内网穿透映射工具,支持TCP、HTTP、HTTPS穿透映射.zip

    LightTunnel-内网穿透映射工具,支持TCP、HTTP、HTTPS穿透映射,支持Windows、Linux、Mac、Android系统,支持二次开发 软件开发设计:PHP、QT、应用软件开发、系统软件开发、移动应用开发、网站开发C++、Java、...

    frp内网穿透工具 v0.34.2

    为您提供frp内网穿透工具下载,frp是一个高性能的反向代理应用,可以帮助您轻松地进行内网穿透,对外网提供服务,支持tcp,http,https等协议类型,并且web服务支持根据域名进行路由转发。frp的作用:利用处于内网或...

    FastTunnel.SuiDao:基于FastTunnel实现的内网穿透服务

    基于二次开发的内网穿透服务 官网: 免费使用步骤 登录官网注册账号 创建一个免费的隧道,同时在个人中心获取 accesskey 密钥,此密钥用于客户端登录。 在 页面,下载您的系统所对应的客户端。 运行SuiDao客户端,...

    frp内网穿透工具 v0.48.0

    frp是一个高性能的反向代理应用,可以帮助您轻松地进行内网穿透,对外网提供服务,支持tcp,http,https等协议类型,并且web服务支持根据域名进行路由转发。frp的作用:利用处于内网或防火墙后的机器,对外网环境...

    Arduino-fre内网穿透库

    可以将esp32/esp8266内不大于1.4K的web页面进行穿透(基于一次MTU传输,包含header头部信息),fre服务器请联系QQ:1336621774

    frp内网穿透工具 v0.34.1

    为您提供frp内网穿透工具下载,frp是一个高性能的反向代理应用,可以帮助您轻松地进行内网穿透,对外网提供服务,支持tcp,http,https等协议类型,并且web服务支持根据域名进行路由转发。frp的作用:利用处于内网或...

    frp内网穿透工具 v0.34.3

    为您提供frp内网穿透工具下载,frp是一个高性能的反向代理应用,可以帮助您轻松地进行内网穿透,对外网提供服务,支持tcp,http,https等协议类型,并且web服务支持根据域名进行路由转发。frp的作用:利用处于内网或...

    Linux系统设计-LightTunnel-内网穿透映射工具,支持TCP、HTTP、HTTPS穿透映射

    Linux系统是一个免费使用和自由传播的类Unix操作系统,基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统,Linux是许多企业...

    frp内网穿透工具-其他

    frp是一个高性能的反向代理应用,可以帮助您轻松地进行内网穿透,对外网提供服务,支持tcp,http,https等协议类型,并且web服务支持根据域名进行路由转发。 frp的作用: 利用处于内网或防火墙后的机器,对外网环境...

    platform:基于web的远程控制,无任何插件,协议支持vnc,rdp,支持内网穿透,四层协议代理

    基于web的远程控制,无任何插件。协议支持vnc,rdp,ssh。 支持内外穿透、四层协议代理。 配合使用即使被控PC没有公网也能进行远程控制,随时随地进行远程控制,还可支持代理局域网端口。 支持个人、企业、权限控制。...

    基于树莓派的寝室门禁系统,指纹识别+Web开门+源代码+文档说明

    web请求(http/https,自动进行内网穿透,通过公网服务器/域名访问) 通知(开门后每个寝室成员会收到通知) 微信实时通知 系统每天23:23自动关机,第二天6:30自动启动。 -------- <项目介绍> 该资源内项目源码是个人...

    单点登录源码

    基于bootstrap实现的响应式Material Design风格的通用后台管理系统,`zheng`项目所有后台系统都是使用该模块界面作为前端展示。 > zheng-ui 各个子系统前台thymeleaf模板,前端资源模块,使用nginx代理,实现动静...

    OSEICQ即时通讯软件(开源例子)

    2)文件传输基于UDP协议。Internet中传输文件速度与QQ相当,内网传输文件最快,比QQ快点。 3)客户端之间消息交换基于P2P技术(点对点) 4)应用网络地址转换(NAT)技术,局域网和Internet之间自由通讯. 5)穿透防火墙...

    基于Flask部署YOLOv5

    实现YOLOv5的web部署,后端使用的是Flask web框架 还可以通过内网穿透或者云服务器等,将网页提供他人使用 首先安装环境 然后python app.py 其中Flask的代码主要在app.py中 前端html文件在templates文件中 其中包括...

    frp_0.27.x linux && windows.zip (包含windows版本和linux版本)

    FRP 是一个使用 Go 语言开发的高性能的反向代理应用,可以帮助您轻松地进行内网穿透,对外网提供服务。FRP 支持 TCP、UDP、HTTP、HTTPS等协议类型,并且支持 Web 服务根据域名进行路由转发。 FRP 的作用: 利用处于...

Global site tag (gtag.js) - Google Analytics