我构建了自己的隧道平台

我在笔记本电脑上花了三天时间打磨一个 Web 应用。它看起来很完美。但当我尝试在手机上测试时,一切都崩溃了。

当需要第二个设备时,本地开发会变得非常麻烦。由于防火墙和 HTTPS 证书问题,分享本地 IP 往往会失败。

我试过 Ngrok。它确实有用,但免费版会断开连接。URL 看起来也很糟糕。像 a1b2-34-56.ngrok-free.app 这样的随机字符串在与客户或团队分享时非常不友好。

我想要一个拥有简洁、可读 URL 的隧道。于是我构建了自己的平台。

我将自定义隧道与短链接生成器结合在一起。我加入了 AI 来创建智能 Slug,并内置了安全防护。

技术栈: • 隧道 / 代理:Django Channels, Daphne, WebSockets, Python & Node.js CLI • 前端:Next.js, TailwindCSS, Shadcn/UI • 后端:Django 5, Graphene GraphQL • 数据库:PostgreSQL (Neon) • 认证:JWT, bcrypt • AI:Google Gemini • 安全:MaxMind GeoLite2, Google Safe Browsing API

工作原理:

  • 双向 WebSocket 隧道。本地 CLI 代理连接到 Django 服务器以转发 HTTP 请求。
  • 竞态条件保护。我使用 Django 的 F() 表达式进行原子更新,以确保分析数据的准确性。
  • 非阻塞遥测。位置和操作系统的查询在后台线程中运行,以保持低延迟。
  • AI Slug。Gemini 会读取目标 URL,从而创建一个有意义的 Slug,而不是随机文本。
  • 主动安全防护。在保存任何链接之前,我会拦截私有 IP 范围并运行 Google Safe Browsing 检查。

后端和隧道逻辑已经很稳定了。前端仍在开发中。

我目前正在 IITM 准备考试。为了专注于学业,我暂停了新功能的开发。与其让代码闲置,不如将其开放供大家审阅。

我需要大家在以下几个方面提供反馈:

  • 延迟:在高并发规模下,如何将重定向保持在 10ms 以下?
  • 安全:加强 SSRF 缓解的最佳方式是什么?
  • 可扩展性:对于长连接隧道,我应该使用 WebSockets 还是 TCP?
  • 可观测性:为了监控隧道健康状况,我应该追踪哪些指标?

如果你在代理工作进程(proxy workers)或系统设计方面有经验,请分享你的看法。

完整系统设计详解:[Link] 代码库:[Link]

在本地开发期间,你如何处理移动端权限测试?你使用的是第三方隧道还是自定义工具?

来源:https://dev.to/zallu/my-ngrok-urls-got-so-ugly-i-built-my-own-tunneling-platform-instead-59d