从本地到公网:Windows 下使用 Cloudflare Quick Tunnel 与 Natapp 联调 FastAPI

作者:码海寻道
适合人群:刚开始做前后端联调、需要让同事访问本地服务的开发者
关键词:内网穿透、FastAPI、Cloudflare Tunnel、Natapp、Apifox、Windows
写在前面
后端服务已经在自己的电脑上运行,前端同事却无法访问,这是开发阶段非常常见的问题。
例如,本机 FastAPI 可以访问:
text
http://127.0.0.1:8000
但 127.0.0.1 只代表当前电脑。其他电脑访问同样的地址时,访问的是它自己的电脑,而不是你的电脑。
内网穿透工具可以把本地服务临时映射成公网地址,让前端同事通过浏览器、Apifox 或前端项目直接访问。本文以 FastAPI 价格预测项目为例,详细介绍两种 Windows 方案:
- Cloudflare Quick Tunnel;
- Natapp Web 隧道。
本文会从原理、安装、启动、接口验证、Apifox 配置、故障排查和安全注意事项一步步说明,适合小白照着操作。
一、先理解什么是内网穿透
1. 本地地址为什么不能直接给同事使用
后端服务通常监听在本机地址和端口:
text
http://127.0.0.1:8000
其中:
127.0.0.1:本机回环地址,只能在当前电脑访问;8000:FastAPI 监听端口;/api/health:健康检查接口路径。
完整本地请求为:
text
http://127.0.0.1:8000/api/health


其他电脑不能直接访问,常见原因包括电脑处于内网、没有公网 IP、路由器没有配置端口转发、防火墙没有开放端口等。
2. 内网穿透的工作方式
内网穿透客户端在本地主动连接穿透服务商,建立一条反向通道:
text
前端 / Apifox / 同事电脑
│
▼
公网地址
│
▼
穿透服务商
│
▼
本地穿透客户端
│
▼
127.0.0.1:8000
│
▼
FastAPI 后端
外部请求到达公网地址后,客户端会把请求转发给本机 FastAPI。
需要注意:内网穿透不是永久部署。FastAPI 和穿透客户端都必须保持运行,关闭其中任何一个,公网访问都会失效。
二、本文项目环境
text
项目目录:D:\deeplearning\PricePrediction_pro
Python:D:\anaconda3\envs\yyq_test\python.exe
FastAPI:127.0.0.1:8000
Swagger:http://127.0.0.1:8000/docs
启动 FastAPI:
bat
cd /d D:\deeplearning\PricePrediction_pro
D:\anaconda3\envs\yyq_test\python.exe -m uvicorn backend.app:app --host 127.0.0.1 --port 8000
启动后必须先验证本地接口:
bat
curl.exe -i http://127.0.0.1:8000/api/health
预期返回:
text
HTTP/1.1 200 OK
json
{"status":"ok"}
如果本地接口不通,应先修复 FastAPI、Python 环境或模型加载问题,不要直接排查穿透工具。
三、方案一:Cloudflare Quick Tunnel
1. 适用场景
Cloudflare Quick Tunnel 适合快速临时联调,优点是:
- 不需要购买域名;
- 不需要配置 DNS;
- 不需要路由器端口转发;
- 不需要创建固定 Tunnel;
- 启动命令简单。
启动后会生成随机公网地址,例如:
text
https://random-name.trycloudflare.com
每次重新启动可能得到不同地址,因此适合开发、演示和测试,不适合依赖固定域名的生产系统。Cloudflare 官方也将 Quick Tunnel 定位为开发和测试用途。Cloudflare Quick Tunnels 官方文档
2. 下载并验证 cloudflared
从官方页面下载 Windows 版本:
将程序重命名为:
text
cloudflared.exe
本文实际放置位置:
text
D:\tools\cloudflared\cloudflared.exe
CMD 验证:
bat
"D:\tools\cloudflared\cloudflared.exe" --version
如果输出版本号,说明客户端可以正常使用。也可以把 D:\tools\cloudflared 加入系统 PATH,重新打开 CMD 后直接执行 cloudflared --version。
3. CMD 启动 Quick Tunnel
第一个 CMD 保持 FastAPI 运行,第二个 CMD 执行:
bat
"D:\tools\cloudflared\cloudflared.exe" tunnel --url http://127.0.0.1:8000
启动成功后会打印:
text
https://random-name.trycloudflare.com
这就是给前端同事或 Apifox 使用的公网 Base URL。
PowerShell 写法为:
powershell
& "D:\tools\cloudflared\cloudflared.exe" tunnel --url http://127.0.0.1:8000
4. 验证 Cloudflare 公网接口
假设终端打印的地址为:
text
https://random-name.trycloudflare.com
CMD 中设置变量:
bat
set "PUBLIC_BASE_URL=https://random-name.trycloudflare.com"
测试健康检查和模型列表:
bat
curl.exe -i "%PUBLIC_BASE_URL%/api/health"
curl.exe -i "%PUBLIC_BASE_URL%/api/models"
Swagger 地址:
text
https://random-name.trycloudflare.com/docs
5. Cloudflare 530 问题
如果公网地址已经打印出来,但访问返回:
text
HTTP 530
常见原因是使用临时 PowerShell Job 或后台任务启动 cloudflared,外层命令结束后隧道进程也被回收。此时地址看似存在,实际上已经没有本地连接。
正确方式是在独立窗口前台运行:
bat
"D:\tools\cloudflared\cloudflared.exe" tunnel --url http://127.0.0.1:8000
排查顺序:
- 检查本地
/api/health; - 确认
cloudflared窗口仍然打开; - 使用最新一次启动打印的地址;
- 等待几秒后重试;
- 停止并重新启动客户端。
检查进程:
powershell
Get-Process cloudflared -ErrorAction SilentlyContinue
停止隧道:
bat
taskkill /IM cloudflared.exe /F
四、方案二:Natapp Web 隧道
1. Natapp 的使用流程
Natapp 的流程是:
- 注册 Natapp 账号;
- 购买或领取一个 Web 隧道;
- 获取该隧道的
authtoken; - 下载并启动
natapp.exe; - 使用客户端打印的公网地址访问本地服务。
官方资料:
2. 配置隧道
在 Natapp 隧道页面中选择:
text
隧道协议:Web
本地端口:8000
这里一定要注意端口。本项目 FastAPI 监听 127.0.0.1:8000,因此 Natapp 的本地端口必须配置为 8000。如果配置为 80,请求会被转发到本机 80 端口,通常会导致失败。
创建完成后,在隧道列表中复制对应的 authtoken。
3. 下载并启动客户端
Windows 客户端放置位置:
text
D:\tools\natapp\natapp.exe
打开 CMD:
bat
cd /d D:\tools\natapp
启动命令:
bat
natapp.exe -authtoken=你的authtoken -log=stdout
示例格式:
bat
natapp.exe -authtoken=xxxxxxxxxxxxxxxx -log=stdout

启动成功日志通常包括:
text
Authenticated with server
Tunnel established at http://xxxxxx.natappfree.cc
Tunnel established at https://xxxxxx.natappfree.cc
其中 Authenticated with server 表示认证成功,Tunnel established 表示公网隧道已经建立。
本次项目测试中,Natapp 曾打印过:
text
https://xa536ed3.natappfree.cc
这是历史测试地址,实际使用时必须以当前客户端最新打印的地址为准。
4. Natapp 本地管理页面
Natapp 客户端通常提供本地管理页面:
text
http://127.0.0.1:4040
它只能在本机打开,用于查看客户端状态和请求信息,不是给前端同事访问的公网地址。
5. 验证 Natapp 公网接口
假设当前公网地址为:
text
https://xxxxxx.natappfree.cc
执行:
bat
curl.exe -i https://xxxxxx.natappfree.cc/api/health
本次实际测试返回:
text
HTTP/1.1 200 OK
server: uvicorn
content-type: application/json
{"status":"ok"}
这证明公网请求已经经过 Natapp 转发到本地 FastAPI。

6. Natapp 日志说明
如果出现:
text
control recovering from failure EOF
Waiting 1 seconds before reconnecting
Authenticated with server
Tunnel established at ...
说明控制连接短暂断开,但客户端已经自动重连成功。后面重新出现认证和隧道建立日志时,通常不需要手动处理。
如果出现:
text
error io: read/write on closed pipe
通常表示某个请求在传输中提前关闭,可能是浏览器刷新、curl 中断、前端取消请求或连接超时。是否真正可用,应以公网接口返回结果为准。
停止 Natapp:
bat
taskkill /IM natapp.exe /F
也可以在 Natapp 窗口按 Ctrl+C。
五、联调 FastAPI 预测接口
1. 当前接口
text
GET /api/health
GET /api/models
POST /api/predict
2. 请求参数
请求参数根据自己的项目要求来写即可。
3. 使用项目测试脚本
项目已经提供完整测试脚本:
text
D:\deeplearning\PricePrediction_pro\backend\test_api_requests.py
测试 Natapp 公网服务:
bat
cd /d D:\deeplearning\PricePrediction_pro
D:\anaconda3\envs\yyq_test\python.exe backend\test_api_requests.py --base-url https://xxxxxx.natappfree.cc
测试 Cloudflare 公网服务时,只需替换 Base URL:
bat
D:\anaconda3\envs\yyq_test\python.exe backend\test_api_requests.py --base-url https://xxxxxx.trycloudflare.com
六、在 Apifox 中联调
1. 设置环境 Base URL
使用 Natapp 时:
text
https://xxxxxx.natappfree.cc
使用 Cloudflare 时:
text
https://xxxxxx.trycloudflare.com
2. 配置接口路径
接口中只保留路径,不要重复填写 Base URL:
text
GET /api/health
GET /api/models
POST /api/predict
3. 推荐测试顺序
GET /api/health:确认公网链路正常;GET /api/models:确认后端模型加载正常;POST /api/predict,output_len=1;POST /api/predict,output_len=3;POST /api/predict,output_len=7。
如果前两步失败,先排查服务和网络,不要直接修改预测请求体。
七、两种方案怎么选
| 对比项 | Cloudflare Quick Tunnel | Natapp Web 隧道 |
|---|---|---|
| 启动方式 | cloudflared tunnel --url ... |
natapp.exe -authtoken=... |
| 是否需要 token | Quick Tunnel 通常不需要 | 需要 authtoken |
| 公网域名 | 随机 trycloudflare.com |
Natapp 分配的域名 |
| 配置难度 | 很低,命令直接映射端口 | 需要先创建 Web 隧道 |
| 适合场景 | 快速演示、临时联调 | 已配置 Natapp 隧道的开发测试 |
| 地址特点 | 重启后通常变化 | 以当前隧道状态和地址为准 |
| 生产使用 | 不建议 | 不建议直接使用 |
选择建议:
- 只想快速把本地服务分享给同事:优先 Cloudflare Quick Tunnel;
- 已经注册 Natapp 并配置好隧道:继续使用 Natapp;
- 需要长期稳定域名、权限和监控:部署到服务器或配置正式的命名隧道。
八、最容易踩的坑
1. 把 127.0.0.1 发给同事
text
http://127.0.0.1:8000/api/health
这个地址对同事无效,必须发送穿透工具打印的公网地址。
2. 只启动了穿透客户端,没有启动 FastAPI
穿透工具只负责转发,不负责启动 Python 后端。FastAPI 和穿透客户端必须同时运行。
3. Natapp 端口配置错误
本项目后端是 8000,Natapp 的本地端口也必须是 8000,不要填写 80。
4. 使用旧的公网地址
Cloudflare Quick Tunnel 每次启动可能生成新地址,Natapp 也应以客户端当前打印的地址为准。
5. 只看日志不做接口验证
判断隧道是否可用,最可靠的方式是直接请求:
bat
curl.exe -i https://公网地址/api/health
返回 HTTP 200 和 {"status":"ok"},才说明完整链路打通。
九、安全边界:临时联调不等于生产部署
内网穿透会把本机服务暴露到公网。当前项目没有登录认证或 API Key,任何拿到公网地址的人都可能调用预测接口。
临时联调期间建议:
- 不要长期公开公网地址;
- 不要传输身份证号、手机号、内部业务数据等敏感信息;
- 不要泄露 Natapp
authtoken; - token 一旦泄露,应立即在控制台撤销或重新生成;
- 不要把 token 写入 Git;
- 测试完成后停止穿透客户端;
- 生产环境增加 API Key、访问控制、限流、日志审计和监控。
模型推理还可能占用较多 CPU、内存或显存,不建议把开发电脑直接当成生产服务器。
十、以后复盘时的执行清单
本地服务
- 启动 FastAPI;
- 打开
/docs; -
/api/health返回 200; -
/api/models返回模型列表。
Cloudflare
- 验证
cloudflared.exe; - 执行
cloudflared tunnel --url http://127.0.0.1:8000; - 复制最新
trycloudflare.com地址; - 保持隧道窗口打开;
- 验证公网
/api/health。
Natapp
- 隧道协议选择 Web;
- 本地端口设置为 8000;
- 获取正确
authtoken; - 执行
natapp.exe -authtoken=... -log=stdout; - 复制最新公网地址;
- 保持 Natapp 窗口打开;
- 验证公网
/api/health。
联调
- 在 Apifox 设置 Base URL;
- 测试
/api/health; - 测试
/api/models; - 测试完成后停止穿透客户端。
结语
内网穿透可以让后端在不部署服务器的情况下,快速和前端同事围绕真实接口进行联调。完整流程可以概括为:
text
启动 FastAPI
↓
验证本地接口
↓
启动 Cloudflare 或 Natapp
↓
复制公网地址
↓
用 curl、测试脚本或 Apifox 联调
最后记住两个原则:
- 先确认本地服务正常,再排查内网穿透;
- 临时公网地址只用于开发联调,不要直接当成生产环境。
如果这篇文章对你有帮助,一起记录开发实践,探索技术之道。