ngrok多子域名规模化管理机制解析及同类小型服务搭建咨询
构建类ngrok隧道服务:多子域名管理架构与实践
1. 隧道与IP的对应关系及DNS动态管理
- ngrok不会给每个隧道分配独立IP,这是它能规模化的核心前提。所有子域名都指向少数几个(甚至一个)公网IP。
- 动态DNS管理靠的是通配符DNS记录,比如配置
*.ngrok.io A 1.2.3.4,这样任何随机子域名(如abcde.ngrok.io)都会自动解析到统一IP,完全不需要动态添加单条DNS记录。这种方式成本极低,还能支持无限子域名扩展。
2. 多子域名的流量区分机制
TLS/HTTP隧道:SNI 是核心
当用户访问a.ngrok.io或b.ngrok.io时,TLS握手阶段的SNI字段会携带具体的子域名。ngrok的前端反向代理(不管是Nginx还是自研的)读取这个SNI值,就能精准把流量转发到对应的隧道连接。
无TLS的纯TCP隧道:端口映射 + 客户端标识
纯TCP隧道没有SNI可用,ngrok的解决办法有两种:
- 给每个TCP隧道分配唯一的公网端口(比如
ngrok.io:12345对应某个TCP隧道),用户通过指定端口访问; - 客户端发起连接时,先发送一段隧道标识信息(比如隧道ID),前端代理拿到标识后再转发到对应后端连接。
小型项目实现类ngrok系统的关键组件与实践
核心组件
- 公网代理节点:负责接收公网流量,区分不同子域名/端口的请求,转发到对应隧道。可以用Nginx处理HTTP/TLS,搭配自研TCP代理,或者直接用Go/Rust写轻量代理(ngrok本身就是Go开发的)。
- 隧道管理服务:维护隧道的创建、销毁、状态同步,存储子域名/端口与隧道的映射关系,给客户端分配子域名或端口。
- 客户端程序:运行在用户本地,主动和公网代理建立长连接(TCP或WebSocket都可以),把本地服务的流量转发到公网代理。
- 通配符DNS解析:在域名服务商处配置
*.yourdomain.com的A记录,指向公网代理的IP,实现所有子域名自动解析。
最佳实践
- 优先用通配符DNS:别折腾动态DNS记录,成本高还没必要,通配符完全能满足小型项目的子域名需求。
- TLS统一终止:在公网代理处统一处理TLS证书(用Let's Encrypt的通配符证书即可),客户端不用管加密逻辑,大幅简化开发。
- 长连接复用:客户端和代理之间用长连接复用,避免频繁建连的开销,还可以用HTTP/2或自定义协议实现多路复用,提升效率。
- 轻量状态管理:小型项目不需要复杂数据库,用Redis甚至内存存储就能搞定隧道映射关系,重点是保证查询速度快。
- 端口范围限制:如果做TCP隧道,提前规划好可用的公网端口范围,避免冲突,同时在管理服务里做好端口的分配与回收。
内容的提问来源于stack exchange,提问作者dimimir
相关产品推荐
相关产品推荐

