本地开发环境暴露给外网:让 webhook 与第三方回调直接打到你本机
现代开发的接口越来越多是「对方主动调你」:GitHub 的 push webhook、支付平台的异步通知、企业微信机器人回调、
AI 平台的任务完成通知……这些请求只认公网地址,而你的 dev server 在
localhost:5173。把本地端口经内网穿透映射到公网,回调就会直接命中你正在改的代码——
断点、热重载、日志全部生效,联调从「改一次发一次测试环境」变成「保存即生效」。
第一步:确认本地服务的监听地址
先把一个常见坑排掉:本地服务必须能被「非 localhost 的本机地址」访问。
-
Vite 默认只监听
localhost,联调前启动加--host(或在vite.config.ts里server.host: true),否则隧道流量到达本机会被拒接; -
webpack / Spring Boot 默认监听
0.0.0.0一般没问题;Spring Boot 注意server.address不要显式绑成127.0.0.1; - 验证方法:在本机用
http://本机局域网IP:端口打开一次,能通就说明隧道侧也能通。
# Vite / 前端 dev server
pnpm dev --host # 监听 0.0.0.0:5173
# 常见本机服务端口
# Spring Boot 8080 / Express 3000 / Flask 5000 / Rails 3000
第二步:创建映射并自测
- 安装 NA-Vlet 客户端(免费下载),邮箱验证码注册登录。
- 「隧道映射」→ 新建,选「网站」模板,协议 HTTP,内网目标填
127.0.0.1:5173(换成你的实际端口)。 - 保存后拿到公网地址,先自己 curl 一遍确认链路通:
curl -i http://公网地址/api/health。 - 链路通了再把地址填到第三方的回调配置里——顺序别反,否则你在对方面板上看不到有意义的报错。
第三步:接各家 webhook 的注意点
GitHub / GitLab webhook
仓库 Settings → Webhooks → Add webhook,Payload URL 填公网地址。GitHub
会先发一次 ping 事件校验连通性;如果配了 secret,记得在本地按
HMAC-SHA1 算签名(x-hub-signature 头)验签。Recent Deliverations 面板能重发请求,配合本地断点反复调试非常方便。
支付 / 订阅类回调
多数支付平台(微信支付 v3、Stripe 等)要求回调地址是 HTTPS。两个做法:给映射绑定自有域名与证书(NA-Vlet 支持), 或按各平台提供的沙箱/模拟回调工具先在 HTTP 上调通业务逻辑。详细以微信为例的完整流程见 微信回调本地调试教程。
企业微信 / 钉钉机器人
回调 URL 通常要求 IP 可公网访问 + 配置时立即验证(URL 有效性校验,解密 echo 串), 映射建立后即可在后台直接通过验证;机器人消息加解密的 AES key 在本地断点里看解密过程,比打印日志直观得多。
联调工作流建议
- 一条映射一个用途:前后端各一条、不同分支各一条,NA-Vlet 免费开放期不限隧道数, 别把 QA 和自己的调试挤同一个入口;
- 映射名写清楚用途与有效期(如
pay-callback-0912),过期的映射随手停用——列表清爽,攻击面也小; - 给回调入口加白名单:GitHub 的 webhook 官方公布 IP 段,安全组规则里只放行这些网段,你的 dev server 就不会被扫描器骚扰;
- 限速兜底:对方重试风暴或被人恶意打流量时,隧道限速能保住你家/办公室的带宽。
与 ngrok / cpolar 类工具的差异
这类「一条命令换一个随机 URL」的工具与本教程思路相同,差别在细节:随机域名每次重启都变, 意味着每次都要去第三方后台重新填回调地址;NA-Vlet 的映射地址稳定,配合域名绑定可以长期复用, 且隧道有 TLS 加密与白名单能力。临时演示用随机域名无所谓,长期联调建议固定地址。
dev server 暴露公网意味着别人也可能访问到你的开发环境(往往带源码、接口文档、调试端点)。 联调结束立即停用映射;长期开的映射务必配白名单或访问口令。