`

基于 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参与评论

分享到:
评论

相关推荐

    内网穿透客户端无需要扩展版源码.zip_PHP 穿透内网_obtainpyb_php_php实现内网穿透_穿透

    标题提到的是一个基于PHP实现的内网穿透客户端源码,无需额外扩展,简化了使用过程。 在描述中提到了"纯php开发 简洁",这意味着这个内网穿透工具是用PHP语言编写的,并且设计简洁,易于理解和部署。PHP是一种广泛...

    Node.js-proxy基于electron开发的内网穿透工具

    【Node.js-proxy基于electron开发的内网穿透工具】 Node.js-proxy是一个使用Node.js和Electron框架构建的内网穿透工具,旨在帮助用户在内网环境下访问或暴露他们的服务到公网。这个工具允许开发者或者普通用户在...

    Node.js-基于socksv5的内网穿透工具

    Node.js基于socksv5的内网穿透工具,顾名思义,就是使用Node.js实现的一个支持socksv5协议的穿透工具。socksv5是TCP协议的扩展,提供了一种标准的方式来通过防火墙和NAT,使客户端能够通过代理服务器与任意远程主机...

    基于appnode搭建网络存储并实现内网穿透.doc

    基于 AppNode 搭建网络存储并实现内网穿透 在这篇文章中,我们将讨论如何使用 AppNode 搭建网络存储,并实现内网穿透。我们将从头开始,安装 AppNode,配置 AppNode,部署 Kod,实现公网访问,并解决遇到的问题。 ...

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

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

    TCP内网穿透神器ding.exe

    TCP内网穿透神器ding.exe是一款基于易语言编写的工具,主要功能是帮助用户在内网环境中实现外网对内网TCP服务的访问。这个工具对于那些由于网络限制无法直接从外部访问内网服务器的用户来说非常有用,比如个人开发者...

    樱花内网穿透管理面板-完整

    内网穿透技术通常涉及NAT(网络地址转换)穿透,常见的实现方式有HTTP代理、TCP隧道、UDP穿透等。樱花内网穿透管理面板可能使用了其中的一种或多种技术,以确保用户能够在外网访问内网服务,如远程桌面、FTP服务器、...

    frp内网穿透window版本,只支持windows系统

    FRP在Windows环境下的内网穿透功能强大,能够帮助用户轻松地实现远程桌面控制、Web服务外网访问等功能。通过合理的配置,我们可以让内网服务在公网中畅通无阻,大大提升了工作效率和灵活性。但同时,也需要注意网络...

    EarthWorm 内网穿透神器

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

    树莓派远程监控内网穿透.zip

    树莓派远程监控内网穿透是一项...通过以上步骤,你就可以实现树莓派的远程监控和内网穿透,使得在任何地方都能便捷地管理和控制你的树莓派。但请始终牢记,远程访问可能会带来安全风险,因此必须采取适当的防护措施。

    natcross-boot:内网穿透 spring boot 实现(包含http方式管理)

    内网穿透常用于远程桌面、FTP服务、物联网设备、Web应用等场景,使得这些原本只能在内网访问的服务可以被外部网络调用。 通过理解以上知识点,你可以深入了解并使用这个项目,实现在内网环境下通过HTTP管理的内网...

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

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

    内网穿透工具-frp使用以及文件

    内网穿透工具frp(Fast Reverse Proxy...总之,frp作为一款强大的内网穿透工具,通过简单的配置就能实现内网服务的公网访问,极大地提高了网络资源的利用率。正确理解和熟练使用frp,将为日常运维工作带来极大的便利。

    使用Frps内网穿透记录

    内网穿透技术是一种在内网环境下,通过特定的代理服务,使得内网设备可以被公网访问的技术。在本文中,我们将深入探讨“使用Frps内网穿透”的实践过程及其相关知识点。 Frps(Frp Server)是Frpc(Frp Client)的...

    delphi开发内网穿透微信应用 包含源码

    标题中的“delphi开发内网穿透微信应用 包含源码”揭示了这是一个使用Delphi编程语言开发的应用程序,其核心功能是实现内网穿透,同时提供了源代码供学习和研究。内网穿透,通常指的是NAT穿透技术,是解决在内网环境...

    ngrok 源码包,个人搭建ngrok内网穿透工具

    ngrok是一款强大的内网穿透工具,它允许用户将本地服务器暴露到公共互联网上,而无需进行复杂的网络配置。源码包的提供意味着你可以自行编译和部署ngrok,以适应你的特定需求或环境,这对于开发者来说是极具价值的。...

    frp_0.36.2 内网穿透工具 64位 linux版, 2021年3月最新版本

    3. **HTTP/HTTPS代理**:FRP可以作为HTTP和HTTPS的反向代理,提供自定义域名和端口的访问,方便Web应用的内网穿透。 4. **WebSocket支持**:对于需要WebSocket协议的应用,FRP同样能够提供内网穿透服务。 5. **...

    Go-ngrokngrok内网穿透nodejs后台管理

    Go-ngrokngrok是一个基于Go语言实现的内网穿透工具,它可以与Node.js后台管理系统相结合,提供方便快捷的远程访问解决方案。本文将深入探讨这个话题,详细介绍Go-ngrokngrok的原理、使用方法以及如何结合Node.js进行...

    开源内网穿透商用平台系统

    开源内网穿透商用平台系统是一种基于网络代理技术的解决方案,旨在帮助用户在内网环境下访问或控制外部网络资源。这种系统通常由服务器端和客户端两部分组成,通过建立安全的隧道,实现内外网的互联互通。在程序开发...

    frp内网穿透客户端服务

    【标题】:“frp内网穿透客户端服务” 【正文】: frp(Frondend Reverse Proxy)是一款轻量级、高性能的内网穿透工具,由Golang编写,旨在帮助那些处于内网或防火墙后的服务器提供对外的服务。通过frp,用户可以在...

Global site tag (gtag.js) - Google Analytics