视频加载失败

飞牛 FnOS + Cloudflare Tunnel 内网穿透完整教程

1287 字
6 分钟
飞牛 FnOS + Cloudflare Tunnel 内网穿透完整教程

飞牛 FnOS + Cloudflare Tunnel 内网穿透完整教程#

一、前置准备#

  • 一个域名,已托管到 Cloudflare(NS 已切换)
  • 飞牛 FnOS 已安装 Docker / Docker Compose
  • 需要穿透的服务在 FnOS 上正常运行

二、Cloudflare 端配置#

1. 开通 Zero Trust#

  1. 登录 Cloudflare 后台,左侧点 Zero Trust
  2. 设置团队名称(随意),到付款页面选 Free 计划,完成开通

Free 计划支持 50 用户以内免费使用 Access,个人用完全够。如果当时跳过了套餐选择,后续在 Access → 应用程序 页面会提示”选择计划”,点进去选 Free 即可。

2. 创建隧道#

  1. Zero Trust 后台 → 左侧 Networks → Tunnels
  2. 点 Create a tunnel → 选 Cloudflared → 下一步
  3. 给隧道命名(比如 fnos-tunnel)→ 保存
  4. 安装方式选 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

启动:

Terminal window
docker compose up -d

验证容器运行状态:

Terminal window
docker ps | grep cloudflared

确认网络模式是 host:

Terminal window
docker inspect cloudflared | grep NetworkMode

输出必须是 "NetworkMode": "host"。

回到 Cloudflare 隧道页面,等连接器状态变绿,点 Next。


四、配置公共主机名#

在隧道详情页 → Public Hostnames → Add a public hostname:

字段填写说明
Subdomain子域名前缀,比如 nas
Domain选择你的域名
Path留空
TypeHTTP
URL127.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 执行):

Terminal window
curl http://127.0.0.1:你的服务端口

能返回内容说明服务正常。


六、多服务配置#

在 Public Hostnames 里逐个添加,每个服务对应一个子域名:

子域名URL
nas127.0.0.1:5666(飞牛管理界面)
music127.0.0.1:8080(音乐服务)
download127.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,重建容器。

Terminal window
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 日志#

Terminal window
docker logs cloudflared --tail 50

日志里会明确写清楚连哪个地址失败,根据报错对应上面的问题处理。


八、安全加固:Cloudflare Access 身份验证#

给隧道服务加登录验证,只有你授权的人能访问,防止公网裸奔。

配置步骤#

  1. 进入 Zero Trust 后台 → 左侧 访问控制 → 应用程序
  2. 点 Add an application → 选 Self-hosted
  3. 填写:
    • Application name:随意,比如 我的NAS
    • Session duration:选 24 hours 或更久
    • Application domain:选你的域名,子域名填你要保护的那个(比如 music)
  4. 点 Next
  5. Policy name:随意,比如 允许我自己
  6. Action:选 Allow
  7. Include 规则里:
    • 选 Email
    • 填你的邮箱地址(只有这个邮箱能登录访问)
  8. 点 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 计划未选套餐

附:本次踩坑总结#

  1. 同虚拟机内不能用本机局域网 IP(ESXI 回流拦截),要用 127.0.0.1
  2. cloudflared 容器必须 host 网络,否则容器里的 127.0.0.1 是容器自己,不是宿主机
  3. 后端服务校验 Host 头时,需要在隧道里配置 HTTP Host Header
  4. Cloudflare Access 需要先选 Free 套餐才能使用

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!

打赏
飞牛 FnOS + Cloudflare Tunnel 内网穿透完整教程
https://blog.xile.eu.org/posts/fnos-cloudflare-tunnel/
作者
七月流火
发布于
2026-10-22
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
七月流火
Hello, I'm Fire in July.
公告
欢迎来到七月流火!
分类
标签
最新动态
站点统计
文章
26
分类
3
标签
42
总字数
25,313
运行时长
0 天
最后活动
0 天前
站点信息
构建平台
EdgeOne Pages
博客版本
Firefly v6.16.8
文章许可
CC BY-NC-SA 4.0
文章目录