飞牛 FnOS + Cloudflare Tunnel 内网穿透完整教程
飞牛 FnOS + Cloudflare Tunnel 内网穿透完整教程
一、前置准备
- 一个域名,已托管到 Cloudflare(NS 已切换)
- 飞牛 FnOS 已安装 Docker / Docker Compose
- 需要穿透的服务在 FnOS 上正常运行
二、Cloudflare 端配置
1. 开通 Zero Trust
- 登录 Cloudflare 后台,左侧点 Zero Trust
- 设置团队名称(随意),到付款页面选 Free 计划,完成开通
Free 计划支持 50 用户以内免费使用 Access,个人用完全够。如果当时跳过了套餐选择,后续在 Access → 应用程序 页面会提示”选择计划”,点进去选 Free 即可。
2. 创建隧道
- Zero Trust 后台 → 左侧 Networks → Tunnels
- 点 Create a tunnel → 选 Cloudflared → 下一步
- 给隧道命名(比如
fnos-tunnel)→ 保存 - 安装方式选 Docker,复制页面给出的 token(后面要用)
三、FnOS 端部署 cloudflared
关键:必须用 host 网络模式
如果用默认 bridge 网络,容器里的
127.0.0.1是容器自己,访问不到宿主机上的服务,会报connection refused。
在 FnOS 上创建 docker-compose.yml:
version: '3'services: cloudflared: image: cloudflare/cloudflared:latest container_name: cloudflared network_mode: host restart: unless-stopped command: tunnel --no-autoupdate run --token 这里替换成你的token启动:
docker compose up -d验证容器运行状态:
docker ps | grep cloudflared确认网络模式是 host:
docker inspect cloudflared | grep NetworkMode输出必须是 "NetworkMode": "host"。
回到 Cloudflare 隧道页面,等连接器状态变绿,点 Next。
四、配置公共主机名
在隧道详情页 → Public Hostnames → Add a public hostname:
| 字段 | 填写说明 |
|---|---|
| Subdomain | 子域名前缀,比如 nas |
| Domain | 选择你的域名 |
| Path | 留空 |
| Type | HTTP |
| URL | 127.0.0.1:你的服务端口 |
关键:URL 用 127.0.0.1,不要用本机局域网 IP
ESXI 虚拟机内,程序访问本机网卡 IP(如
10.0.0.4:8080)会触发虚拟交换机回流拦截,导致超时。用127.0.0.1走本地回环,不走网卡,避开这个问题。
点 Save hostname 保存,配置立即生效,不用重启容器。
五、验证
浏览器访问 https://子域名.你的域名,能正常打开页面即成功。
本地验证服务是否正常(FnOS SSH 执行):
curl http://127.0.0.1:你的服务端口能返回内容说明服务正常。
六、多服务配置
在 Public Hostnames 里逐个添加,每个服务对应一个子域名:
| 子域名 | URL |
|---|---|
nas | 127.0.0.1:5666(飞牛管理界面) |
music | 127.0.0.1:8080(音乐服务) |
download | 127.0.0.1:9000(下载服务) |
每个都用 127.0.0.1:端口,host 网络模式下都能正常访问。
七、常见问题排查
问题 1:502 Bad Gateway,日志报 dial tcp 127.0.0.1:端口: connect: connection refused
原因:cloudflared 容器不是 host 网络模式。
解决:确认 docker-compose.yml 里有 network_mode: host,重建容器。
docker compose down && docker compose up -d问题 2:502,日志报 dial tcp 10.0.0.x:端口: i/o timeout
原因:URL 填了本机局域网 IP,ESXI 虚拟交换机拦截回流流量。
解决:隧道后台把 URL 改成 127.0.0.1:端口。
问题 3:502,日志报 Host validation failed
原因:后端服务强制校验 Host 头。
解决:隧道后台编辑该域名 → Additional application settings → HTTP Host Header 填入后端服务认可的域名。
问题 4:查看 cloudflared 日志
docker logs cloudflared --tail 50日志里会明确写清楚连哪个地址失败,根据报错对应上面的问题处理。
八、安全加固:Cloudflare Access 身份验证
给隧道服务加登录验证,只有你授权的人能访问,防止公网裸奔。
配置步骤
- 进入 Zero Trust 后台 → 左侧 访问控制 → 应用程序
- 点 Add an application → 选 Self-hosted
- 填写:
- Application name:随意,比如
我的NAS - Session duration:选
24 hours或更久 - Application domain:选你的域名,子域名填你要保护的那个(比如
music)
- Application name:随意,比如
- 点 Next
- Policy name:随意,比如
允许我自己 - Action:选
Allow - Include 规则里:
- 选
Email - 填你的邮箱地址(只有这个邮箱能登录访问)
- 选
- 点 Next → 点 Add application 保存
效果
以后访问受保护的子域名,会先跳转到 Cloudflare 登录页,输入你授权的邮箱,收验证码登录后才能进入服务。
多个服务
每个子域名单独建一个 Application,分别保护。或者建一个 Application,domain 那里选 *.你的域名,一次性保护所有子域名。
九、其他安全建议
| 措施 | 说明 |
|---|---|
| 不用飞牛默认端口 | 改管理界面默认端口,避免被扫 |
| 强密码 | 飞牛账号、各服务账号用强密码 |
| 不开不必要的服务 | 只穿透真正需要外网访问的 |
| 定期更新 | cloudflared 镜像、FnOS 系统、各容器保持更新 |
| 配合 Access | 敏感服务一定要加 Access 身份验证 |
十、配置速查表
| 配置项 | 正确值 | 错误值 |
|---|---|---|
| 容器网络模式 | network_mode: host | 默认 bridge |
| 后端服务地址 | http://127.0.0.1:端口 | http://10.0.0.x:端口 |
| Host 校验服务 | 填 HTTP Host Header | 留空 |
| 普通服务 | Host Header 留空 | 乱填 |
| Zero Trust 套餐 | Free 计划 | 未选套餐 |
附:本次踩坑总结
- 同虚拟机内不能用本机局域网 IP(ESXI 回流拦截),要用
127.0.0.1 - cloudflared 容器必须 host 网络,否则容器里的
127.0.0.1是容器自己,不是宿主机 - 后端服务校验 Host 头时,需要在隧道里配置 HTTP Host Header
- Cloudflare Access 需要先选 Free 套餐才能使用
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!














