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 上,有兴趣的同学可以玩一下。
下面简单介绍它的原理,我画了一张草图:
最左侧是最终用来访问服务的浏览器,它可能位于公网,也可能位于其它内网;最右侧是实际提供 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 层:
好了,本文就讨论这么多内容,大家有什么问题或想法欢迎给我留言。
本文链接:https://imququ.com/post/tunnel-to-localhost-base-on-http2.html,参与评论。
相关推荐
基于 Swoole 的内网穿透,支持本地微信开发、Web开发,让外网能够访问到!山寨简易版 Ngrok!
一个基于Python的TCP内网穿透工具,可以向外网映射内网TCP应用,如http MySQL SSH RDP # Requirement > * 一台带有公网IP的云主机 > * 服务器和客户端均装有Python3环境 # Experience 进入`PNAT-internal/src/main...
Bullet是一款开源的反向代理内网穿透利器,采用Java技术实现了基于Websocket的Bullet内网穿透交互协议,通过自定义的协议控制Ngrok客户端实现Web界面管理。注意:本项目对Ngrok源码定制化的修改以满足安全性等需求,...
EarthWorm是一套轻量便携且功能强大...相较于其他穿透工具,如reGeorg等, EarthWorm可以穿透更复杂的内网环境同时也不需要跳板机运行web服务,也可以支持多平台间的转接通讯,如Linux、Windows、MacOS、Arm-Linux等。
它从底层Socket原始通信层开始,采用多线程、多任务模式从新构建Web服务,充分发挥当下多核的CPU的多任务并行性能,达到不输nginx的性能表现,而多线程、多任务天生比多进程模式更有编程可控性,基于这此原理,为...
LightTunnel-内网穿透映射工具,支持TCP、HTTP、HTTPS穿透映射,支持Windows、Linux、Mac、Android系统,支持二次开发 软件开发设计:PHP、QT、应用软件开发、系统软件开发、移动应用开发、网站开发C++、Java、...
为您提供frp内网穿透工具下载,frp是一个高性能的反向代理应用,可以帮助您轻松地进行内网穿透,对外网提供服务,支持tcp,http,https等协议类型,并且web服务支持根据域名进行路由转发。frp的作用:利用处于内网或...
基于二次开发的内网穿透服务 官网: 免费使用步骤 登录官网注册账号 创建一个免费的隧道,同时在个人中心获取 accesskey 密钥,此密钥用于客户端登录。 在 页面,下载您的系统所对应的客户端。 运行SuiDao客户端,...
frp是一个高性能的反向代理应用,可以帮助您轻松地进行内网穿透,对外网提供服务,支持tcp,http,https等协议类型,并且web服务支持根据域名进行路由转发。frp的作用:利用处于内网或防火墙后的机器,对外网环境...
可以将esp32/esp8266内不大于1.4K的web页面进行穿透(基于一次MTU传输,包含header头部信息),fre服务器请联系QQ:1336621774
为您提供frp内网穿透工具下载,frp是一个高性能的反向代理应用,可以帮助您轻松地进行内网穿透,对外网提供服务,支持tcp,http,https等协议类型,并且web服务支持根据域名进行路由转发。frp的作用:利用处于内网或...
为您提供frp内网穿透工具下载,frp是一个高性能的反向代理应用,可以帮助您轻松地进行内网穿透,对外网提供服务,支持tcp,http,https等协议类型,并且web服务支持根据域名进行路由转发。frp的作用:利用处于内网或...
Linux系统是一个免费使用和自由传播的类Unix操作系统,基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统,Linux是许多企业...
frp是一个高性能的反向代理应用,可以帮助您轻松地进行内网穿透,对外网提供服务,支持tcp,http,https等协议类型,并且web服务支持根据域名进行路由转发。 frp的作用: 利用处于内网或防火墙后的机器,对外网环境...
基于web的远程控制,无任何插件。协议支持vnc,rdp,ssh。 支持内外穿透、四层协议代理。 配合使用即使被控PC没有公网也能进行远程控制,随时随地进行远程控制,还可支持代理局域网端口。 支持个人、企业、权限控制。...
web请求(http/https,自动进行内网穿透,通过公网服务器/域名访问) 通知(开门后每个寝室成员会收到通知) 微信实时通知 系统每天23:23自动关机,第二天6:30自动启动。 -------- <项目介绍> 该资源内项目源码是个人...
基于bootstrap实现的响应式Material Design风格的通用后台管理系统,`zheng`项目所有后台系统都是使用该模块界面作为前端展示。 > zheng-ui 各个子系统前台thymeleaf模板,前端资源模块,使用nginx代理,实现动静...
2)文件传输基于UDP协议。Internet中传输文件速度与QQ相当,内网传输文件最快,比QQ快点。 3)客户端之间消息交换基于P2P技术(点对点) 4)应用网络地址转换(NAT)技术,局域网和Internet之间自由通讯. 5)穿透防火墙...
实现YOLOv5的web部署,后端使用的是Flask web框架 还可以通过内网穿透或者云服务器等,将网页提供他人使用 首先安装环境 然后python app.py 其中Flask的代码主要在app.py中 前端html文件在templates文件中 其中包括...
FRP 是一个使用 Go 语言开发的高性能的反向代理应用,可以帮助您轻松地进行内网穿透,对外网提供服务。FRP 支持 TCP、UDP、HTTP、HTTPS等协议类型,并且支持 Web 服务根据域名进行路由转发。 FRP 的作用: 利用处于...