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

从本地到公网: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 方案:

  1. Cloudflare Quick Tunnel;
  2. 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 版本:

cloudflared 官方下载页面

将程序重命名为:

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

排查顺序:

  1. 检查本地 /api/health
  2. 确认 cloudflared 窗口仍然打开;
  3. 使用最新一次启动打印的地址;
  4. 等待几秒后重试;
  5. 停止并重新启动客户端。

检查进程:

powershell 复制代码
Get-Process cloudflared -ErrorAction SilentlyContinue

停止隧道:

bat 复制代码
taskkill /IM cloudflared.exe /F

四、方案二:Natapp Web 隧道

1. Natapp 的使用流程

Natapp 的流程是:

  1. 注册 Natapp 账号;
  2. 购买或领取一个 Web 隧道;
  3. 获取该隧道的 authtoken
  4. 下载并启动 natapp.exe
  5. 使用客户端打印的公网地址访问本地服务。

官方资料:

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. 推荐测试顺序

  1. GET /api/health:确认公网链路正常;
  2. GET /api/models:确认后端模型加载正常;
  3. POST /api/predictoutput_len=1
  4. POST /api/predictoutput_len=3
  5. POST /api/predictoutput_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 联调

最后记住两个原则:

  1. 先确认本地服务正常,再排查内网穿透;
  2. 临时公网地址只用于开发联调,不要直接当成生产环境。

如果这篇文章对你有帮助,一起记录开发实践,探索技术之道。

参考资料

相关推荐
心如鉄补4 小时前
FastAPI Agent 函数调用实战:我让 AI 学会了“自己动手查天气“
人工智能·fastapi
2601_960906727 小时前
科技“无人区”跋涉,难度高、不确定性大
windows·macos·pycharm·myeclipse
会飞的大鱼人8 小时前
一文搞懂 Java HashSet:把它想成游乐园里只允许一次入场的盖章名单
java·开发语言·windows
ziguo11229 小时前
C/C++ 错误处理全解:从 errno 到 C++ 异常
linux·c语言·c++·windows·visual studio
王维同学10 小时前
IFEO Debugger、VerifierDlls 与 SilentProcessExit 配置
c++·windows·安全·注册表
您^_^12 小时前
使用技巧(十一):Claude Code 最强审问官 —— grill-me 深度指南,装完先别写代码
人工智能·windows·个人开发·claudecode·deepseek v4 pro
ye小杰榨 问鼎中原ZP12 小时前
初探:用 FastAPI 搭建你的第一个 AI Agent 接口
人工智能·fastapi
酉鬼女又兒13 小时前
[特殊字符]零基础入门AI:归纳演绎、假设空间、归纳偏好、NFL、过拟合与欠拟合、模型评估选择、超参数、性能度量、混淆矩阵、P-R曲线和F1
人工智能·windows·python·深度学习·安全·机器学习·矩阵
山城码农笑松哥14 小时前
C盘空间救星:一键无损迁移软件数据到其他盘
windows·c盘清理迁移