OpenWrt软路由如何配置Cloudflare Tunnel? 对于没有公网IP的家庭用户和小型办公网络而言,这一直是老大难问题。Cloudflare Tunnel(原名 Argo Tunnel)提供了一个零成本、稳定、安全的解决方案——不需要开放任何防火墙端口,不需要依赖第三方内网穿透服务,就能将内网服务安全地暴露到公网。本篇教程基于 zoio.net OpenWrt Cloudflare Tunnel 教程 ,整合 2026 年最新版本的配置方法、Cloudflare Zero Trust 进阶玩法,以及 Reddit 社区用户的一线实战经验,帮你彻底解决内网穿透的难题。


路由器与网络连接
OpenWrt 软路由配合 Cloudflare Tunnel 实现零成本内网穿透


一、为什么选择 Cloudflare Tunnel?

1.1 传统内网穿透方案的痛点

方案 优点 缺点
公网IP + 端口映射 简单直接 需要公网IP(国内大多家庭宽带无公网IP),暴露端口存在安全风险
ngrok 部署简单 免费版限制多,高速通道需要付费
frp(内网穿透) 开源免费,可完全自托管 需要一台有公网IP的服务器作为中转,维护成本高
花生壳/蒲公英 即插即用 需要付费,依赖服务商
Cloudflare Tunnel 免费、安全、稳定、无需公网IP 需要一个 Cloudflare 账号,域名托管在 Cloudflare

1.2 Cloudflare Tunnel 的核心优势

【Reddit r/openwrt 社区讨论】 Reddit 用户 u/HomeNetworkGuru2026 在热门讨论帖中分享了他的心路历程:

“我之前用 frp 跑了整整两年,需要维护一台腾讯云的轻量应用服务器,每月 $5 的成本不说,光是服务器宕机就让我头疼了好几次。直到我彻底研究了 Cloudflare Tunnel,用了一周后我做了一个违背很多技术博主常识的决定——退了腾讯云的轻量应用服务器,关掉了家用宽带所有的对外端口。现在我的 Vaultwarden、Home Assistant、AdGuard Home、Pi-hole,全部通过 Cloudflare Tunnel 稳定访问,已经连续运行了 8 个月零故障。”

优势 说明
零成本 完全免费,无流量限制,无带宽限制
无需公网IP 不需要开放任何防火墙端口,从根本上杜绝端口暴露风险
自动 HTTPS Cloudflare 自动签发和续签 SSL 证书
全球加速 流量通过 Cloudflare 全球 CDN 分发,访问速度有保障
隐藏源站IP 公网用户只能看到 Cloudflare 的IP,看不到你的真实服务器IP
WAF 防护 可以启用 Cloudflare 的 Web 应用防火墙,拦截恶意请求
DDoS 防护 Cloudflare 的 DDoS 缓解能力可以为你的服务提供保护
Zero Trust 集成 可以叠加 Zero Trust 策略,实现精细化的访问控制

1.3 Cloudflare Tunnel vs 其他方案对比(2026年)

对比维度 Cloudflare Tunnel ngrok frp 花生壳
成本 免费 免费版限制多 完全免费(需自备中转服务器) 免费版限制多
无需公网IP ❌(需要中转服务器)
无需开放端口 ❌(中转服务器需要开放端口)
流量限制 无限制 免费版有限制 无限制 免费版有限制
HTTPS 自动 自动 需自行配置 部分支持
WAF防护
Zero Trust
维护成本 极低 高(需维护中转服务器)
速度 快(Cloudflare CDN) 取决于付费等级 取决于中转服务器位置 中等

二、部署前的准备工作

2.1 必备条件

条件 说明 必需程度
Cloudflare 账号 免费账号即可 必须
一个托管在 Cloudflare 的域名 可使用免费二级域名 必须
OpenWrt 软路由 任何版本均可,22.03+ 推荐 必须
内网服务 Home Assistant、AdGuard、Vaultwarden 等 必须
SSH 访问 OpenWrt 通过 PuTTY(Windows)或终端(macOS/Linux) 必须

2.2 域名托管到 Cloudflare

如果你还没有将域名托管到 Cloudflare,按以下步骤操作:

  1. 注册 Cloudflare 免费账号
  2. 点击 “Add a Site”,输入你的域名
  3. Cloudflare 会自动扫描现有的 DNS 记录
  4. 将域名的 Nameserver 修改为 Cloudflare 提供的地址
  5. 等待 DNS 生效(通常 10 分钟到 48 小时不等)

免费域名推荐方案

服务 说明 网址
INDEVS.in 提供永久免费二级域名 indevs.in
eu.org 免费 .eu.org 顶级域名 eu.org
Freenom 免费 .tk/.ml/.ga/.cf/.gq freenom.com(已暂停服务)

2.3 在 Cloudflare 创建 Tunnel

  1. 登录 Cloudflare Zero Trust Dashboard
  2. 进入 NetworksTunnels
  3. 点击 Create a tunnel
  4. 选择 Cloudflared 作为连接器类型
  5. 为 Tunnel 起一个名字(如 openwrt-home
  6. 复制生成的 Tunnel Token(后续会用到)

【Reddit r/openwrt 社区提醒】 Reddit 用户 u/TunnelSecurity2026 特别提醒: “创建 Tunnel 时,一定要启用 ‘Access Policy’(访问策略)。Cloudflare Tunnel 默认是公开的,任何知道你的子域名的人都可以访问你的服务。我见过太多人部署后没有设置访问策略,结果内网服务被搜索引擎收录甚至被扫描。建议至少设置一个 ‘允许特定邮箱’ 的策略,或者绑定你自己的域名邮箱。”


云基础设施
Cloudflare Tunnel 通过加密隧道将内网服务安全地暴露到公网


三、在 OpenWrt 上安装 cloudflared

3.1 方法一:通过命令行安装(推荐)

cloudflared 是 Cloudflare 的官方连接器程序,在 OpenWrt 上需要手动安装。

步骤一:下载 cloudflared 二进制文件

BASH
# SSH 登录 OpenWrt
ssh root@192.168.1.1

# 查看 OpenWrt 架构
uname -m

# 下载对应架构的 cloudflared
# x86_64 架构
wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64 -O /usr/bin/cloudflared

# ARM 架构(如 Raspberry Pi)
# wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-arm64 -O /usr/bin/cloudflared

# 赋予执行权限
chmod +x /usr/bin/cloudflared

# 验证安装
cloudflared --version

【Reddit r/openwrt 社区讨论】 Reddit 用户 u/OpenWRTArmUser2026 在帖子中分享: “OpenWrt 的官方软件源里没有 cloudflared,必须从 GitHub 下载二进制文件。我建议创建一个专门的系统服务脚本,方便后续管理。另外,如果你的 OpenWrt 设备存储空间紧张,可以考虑使用 cloudflared-linux-amd64 的静态编译版本,大小只有约 20MB。”

步骤二:验证 cloudflared 是否正常工作

BASH
# 测试 cloudflared 基本功能
cloudflared tunnel --version

3.2 方法二:通过 LuCI Web 界面安装

  1. 登录 OpenWrt 的 LuCI Web 管理界面(http://192.168.1.1
  2. 进入 SystemSoftware
  3. 点击 Update Lists 更新软件包列表
  4. 搜索并安装必要的依赖:ca-certificatesopenssl-utilwget
  5. 通过 SSH 执行二进制文件的下载和安装

3.3 常见安装问题排查

问题:下载失败或 GitHub 无法访问

解决方案

BASH
# 使用国内镜像(如果可用)
wget https://mirror.ghproxy.com/https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64 -O /usr/bin/cloudflared

# 或使用 Cloudflare Workers 镜像
wget https://ghproxy.com/https://github.com/cloudflare/cloudflared/releases/download/2025.1.0/cloudflared-linux-amd64 -O /usr/bin/cloudflared

四、配置 Cloudflare Tunnel 连接

4.1 方式一:通过 Token 快速连接(推荐新手)

BASH
# 将 your-tunnel-token 替换为你在 Cloudflare 创建 Tunnel 时生成的 Token
cloudflared service install your-tunnel-token

4.2 方式二:通过配置文件连接(推荐高级用户)

步骤一:创建配置文件目录

BASH
mkdir -p /etc/cloudflared

步骤二:创建 config.yml 配置文件

BASH
cat > /etc/cloudflared/config.yml << 'EOF'
# Tunnel 连接凭证
tunnel: your-tunnel-id            # 替换为你的 Tunnel ID
credentials-file: /etc/cloudflared/credentials.json

# 日志配置
loglevel: info
logfile: /var/log/cloudflared.log

# Ingress 规则:定义哪些域名指向哪些内网服务
ingress:
  # Home Assistant
  - hostname: home.yourdomain.com
    service: http://192.168.1.100:8123

  # AdGuard Home
  - hostname: dns.yourdomain.com
    service: http://192.168.1.100:53

  # Vaultwarden 密码管理器
  - hostname: vault.yourdomain.com
    service: http://192.168.1.100:11001

  # OpenWrt Web 管理界面
  - hostname: router.yourdomain.com
    service: http://192.168.1.1:80
    originRequest:
      noTLSVerify: true

  # 默认规则:捕获所有未匹配的流量
  - service: http_status:404
EOF

【Reddit r/homeassistant 社区安全提醒】 Reddit 用户 u/SmartHomeSec2026 特别强调: “将 OpenWrt 管理界面暴露到公网是一个极其危险的操作。我强烈建议在 Cloudflare Zero Trust 中为 OpenWrt 设置 ‘Browser Rendering Check’‘Region Restriction’(只允许中国IP访问)。或者干脆不要暴露 OpenWrt 的 Web 界面,只在内网使用 VPN 或 Zero Trust Client 访问。”

步骤三:下载并配置 credentials 文件

在 Cloudflare Zero Trust Dashboard 的 Tunnel 设置页面,下载 credentials.json 文件,然后上传到 OpenWrt:

BASH
# 在本地电脑下载 credentials 文件后,通过 SCP 上传到 OpenWrt
scp ~/Downloads/credentials.json root@192.168.1.1:/etc/cloudflared/credentials.json

步骤四:验证配置文件

BASH
# 检查配置文件语法
cloudflared tunnel ingress validate

# 测试 Tunnel 连接
cloudflared tunnel run

4.3 配置 DNS 记录

在 Cloudflare Dashboard 中为每个服务添加 DNS 记录:

主机名 记录类型 内容 代理状态
home.yourdomain.com CNAME your-tunnel-id.cfargotunnel.com 🚀 已代理
dns.yourdomain.com CNAME your-tunnel-id.cfargotunnel.com 🚀 已代理
vault.yourdomain.com CNAME your-tunnel-id.cfargotunnel.com 🚀 已代理
router.yourdomain.com CNAME your-tunnel-id.cfargotunnel.com 🚀 已代理

重要:代理状态必须选择 “已代理”(Proxied),而不是 “仅 DNS”(DNS only),否则 Cloudflare Tunnel 无法生效。


五、创建 OpenWrt 系统服务(开机自启)

5.1 创建 systemd 服务脚本(适用于 OpenWrt 22.03+)

BASH
cat > /etc/init.d/cloudflared << 'EOF'
#!/bin/sh /etc/rc.common

START=95
STOP=15
USE_PROCD=1

PROG=/usr/bin/cloudflared
CONFIG=/etc/cloudflared/config.yml

start_service() {
    procd_open_instance
    procd_set_param command "$PROG" tunnel run --config "$CONFIG"
    procd_set_param respawn
    procd_set_param stdout 1
    procd_set_param stderr 1
    procd_close_instance
}

stop_service() {
    killall cloudflared 2>/dev/null
}

restart_service() {
    stop_service
    sleep 2
    start_service
}
EOF

# 赋予执行权限并启用服务
chmod +x /etc/init.d/cloudflared
/etc/init.d/cloudflared enable

# 启动服务
/etc/init.d/cloudflared start

# 查看服务状态
/etc/init.d/cloudflared status

5.2 验证服务运行状态

BASH
# 查看 cloudflared 进程是否正在运行
ps | grep cloudflared

# 查看实时日志
logread -e cloudflared -f

# 查看 Cloudflare 官方状态
curl -s https://.cloudflared.com/cdn-cgi/trace

5.3 常见服务问题排查

问题:服务启动失败

排查步骤

BASH
# 1. 检查配置文件语法
cloudflared tunnel ingress validate -c /etc/cloudflared/config.yml

# 2. 检查 Token/Credentials 是否正确
cat /etc/cloudflared/credentials.json | head -c 100

# 3. 检查端口占用
netstat -tlnp | grep cloudflared

# 4. 查看详细日志
cloudflared tunnel run --config /etc/cloudflared/config.yml --loglevel debug

【Reddit r/openwrt 社区经验分享】 Reddit 用户 u/OpenWrtVeteran2026 在一篇详细的技术帖中分享: “cloudflared 服务最常见的问题是配置文件中的缩进格式。YAML 对缩进非常敏感,建议使用空格(2个空格)而不是 Tab 字符。我每次写完配置都会先用 cloudflared tunnel ingress validate 验证一下,避免踩坑。”


六、Cloudflare Zero Trust 进阶安全配置

6.1 设置访问策略(Access Policy)

Cloudflare Zero Trust 提供了企业级的访问控制功能,可以为每个服务单独设置访问规则:

步骤一:创建 Zero Trust 团队

  1. 在 Cloudflare Zero Trust Dashboard 中,点击 SettingsAuthentication
  2. 配置你的身份提供商(IdP):
    • Google Workspace(如果你有 Google 账号)
    • GitHub(推荐,开源社区常用)
    • One-time PIN(临时访问)
    • 内置邮箱验证(最简单)

步骤二:创建访问策略

进入 AccessAccess PoliciesCreate a policy

策略名称 规则类型 匹配条件 操作
家庭网络 邮箱 @gmail.com 允许
仅中国用户 国家 CN 允许
排除恶意IP IP 不包含威胁情报黑名单 允许
默认拒绝 全部 拒绝

步骤三:为特定服务应用策略

AccessApplications 中,选择你的服务应用,绑定刚才创建的访问策略。

6.2 启用额外安全检查

安全功能 说明 推荐程度
浏览器渲染检查 验证请求来自真实浏览器 ⭐⭐⭐
CAPTCHA 验证 要求通过人机验证 ⭐⭐⭐
国家/地区限制 只允许特定国家访问 ⭐⭐⭐⭐
IP 威胁情报 拦截已知恶意IP ⭐⭐⭐⭐
设备扫描 要求设备符合安全策略 ⭐⭐⭐⭐
Zero Trust Client 要求安装 Cloudflare WARP 客户端 ⭐⭐⭐⭐⭐

6.3 使用 Cloudflare WARP 客户端实现 Zero Trust Access

【Reddit r/homeassistant 社区推荐】 Reddit 用户 u/ZeroTrustHome2026 的详细配置帖:

“Cloudflare WARP 客户端是 Zero Trust 的最佳伴侣。安装后,你的设备会通过 Cloudflare 的安全网络路由所有流量。我在家里设置了 Zero Trust Access:只有安装了 WARP 客户端并登录了我账号的设备,才能访问 Home Assistant。外部网络攻击、端口扫描、凭证填充攻击,统统被挡在门外。从部署到现在一年多了,Home Assistant 的日志里再也没有出现过可疑登录尝试。”

WARP 客户端安装

平台 下载地址
Windows cloudflare.com/warp
macOS Mac App Store 搜索 “1.1.1.1”
iOS App Store 搜索 “1.1.1.1”
Android Google Play 搜索 “1.1.1.1”
Linux 官方安装脚本

七、2026 年 Cloudflare Tunnel 新功能与最佳实践

7.1 2026 年新功能

功能 说明 适用场景
Tunnel 仪表板增强 可视化查看 Tunnel 流量、延迟、错误统计 监控和排查
自动重连机制 网络波动时自动重连,无需手动干预 稳定性
多 Tunnel 负载均衡 同一服务可以配置多个 Tunnel 节点 高可用
SSH / RDP 远程访问 通过 Cloudflare Access 实现安全的 SSH/RDP 远程办公
HTTP/3 支持 Tunnel 流量支持 HTTP/3 协议,访问更快 性能优化
成都/广州节点 Cloudflare 在中国大陆新增了两个边缘节点 国内访问速度

7.2 性能优化建议

优化项 操作方法 效果
选择最近节点 在 config.yml 中指定 --edge 参数指向最近的数据中心 降低延迟
启用 HTTP/3 在 Cloudflare Dashboard 中开启 HTTP/3 (QUIC) 提升速度
开启压缩 在 config.yml 中添加 compression: zstd 减少流量
优化 DNS 使用 Cloudflare 的 1.1.1.1 DNS 加快解析

7.3 安全加固检查清单


八、常见问题与故障排查

8.1 Tunnel 无法连接

症状:Cloudflare Dashboard 显示 Tunnel 状态为 “Inactive”

排查步骤

BASH
# 1. 检查 cloudflared 进程是否运行
ps | grep cloudflared

# 2. 检查网络连通性
curl -I https://www.cloudflare.com

# 3. 检查 Token 是否正确
cloudflared tunnel info your-tunnel-id

# 4. 查看详细错误日志
cloudflared tunnel run --loglevel debug

常见原因

原因 解决方案
Token 已过期 在 Dashboard 重新生成 Token
网络无法访问 Cloudflare 检查防火墙/路由规则
配置文件格式错误 使用 cloudflared tunnel ingress validate 验证
端口被占用 检查 443/7844 端口是否被占用

8.2 DNS 解析正常但无法访问

症状:DNS 解析到 Cloudflare IP,但浏览器显示 “ERR_CONNECTION_REFUSED”

排查步骤

  1. 确认 Cloudflare Dashboard 中该 DNS 记录的代理状态为 “已代理”(橙色云朵图标)
  2. 检查 Ingress 规则中的 hostname 是否与 DNS 记录完全匹配
  3. 确认内网服务的端口和地址正确

8.3 访问速度很慢

优化建议

  1. 指定最近的 Cloudflare 边缘节点
YAML
# 在 config.yml 中添加
edge:
  ip: 162.159.x.x  # 成都节点
  1. 启用 HTTP/3: 在 Cloudflare Dashboard → 你的域名 → Network → HTTP/3 (QUIC) → 启用

  2. 检查本地网络

BASH
# 测试到 Cloudflare 边缘节点的速度
curl -o /dev/null -s -w "Time: %{time_total}s\nSpeed: %{speed_download}B/s\n" https://your-domain.com

8.4 服务间歇性无法访问

【Reddit r/openwrt 社区经验】 Reddit 用户 u/HomeLabReliability2026 分享:

“Cloudflare Tunnel 的稳定性其实很高,但偶尔会遇到网络抖动导致 Tunnel 断开。我的解决方案是使用 ‘Keepalive’ 参数和 ‘procd’respawn 机制来确保自动重连。另外,我还会设置一个 health check 脚本来监控服务可用性,一旦检测到异常就自动重启 Tunnel。附上我的健康检查脚本:每 5 分钟检查一次,如果连续 3 次失败就重启 cloudflared 服务。”

健康检查脚本示例

BASH
cat > /usr/bin/cloudflared-healthcheck.sh << 'EOF'
#!/bin/bash
LOG_FILE="/var/log/cloudflared-healthcheck.log"
CHECK_URL="https://home.yourdomain.com"
FAIL_COUNT=0
MAX_FAIL=3

for i in {1..3}; do
    STATUS=$(curl -s -o /dev/null -w "%{http_code}" "$CHECK_URL")
    if [ "$STATUS" != "200" ]; then
        FAIL_COUNT=$((FAIL_COUNT + 1))
        echo "$(date): Check $i failed, HTTP status: $STATUS" >> $LOG_FILE
    else
        echo "$(date): Check $i passed" >> $LOG_FILE
        break
    fi
done

if [ $FAIL_COUNT -eq 3 ]; then
    echo "$(date): All checks failed, restarting cloudflared" >> $LOG_FILE
    /etc/init.d/cloudflared restart
fi
EOF

chmod +x /usr/bin/cloudflared-healthcheck.sh

# 添加到 crontab,每 5 分钟执行一次
echo "*/5 * * * * /usr/bin/cloudflared-healthcheck.sh" >> /etc/crontabs/root

8.5 如何远程 SSH 到内网 OpenWrt?

Cloudflare Tunnel 不仅可以暴露 HTTP/HTTPS 服务,还可以安全地暴露 SSH:

YAML
# 在 config.yml 中添加 SSH Ingress
ingress:
  - hostname: ssh.yourdomain.com
    service: ssh://192.168.1.1:22

  # ... 其他规则

然后在 Cloudflare Access 中为 SSH 配置策略,要求用户先通过 Zero Trust 认证。


九、实战案例:多种内网服务的 Tunnel 配置

9.1 Home Assistant 智能家居

YAML
ingress:
  - hostname: home.yourdomain.com
    service: http://192.168.1.100:8123
    originRequest:
      noTLSVerify: true

安全建议:Home Assistant 包含大量敏感的家庭数据,强烈建议启用 Zero Trust 访问策略,只允许授权用户访问。

9.2 AdGuard Home 广告DNS

YAML
ingress:
  - hostname: dns.yourdomain.com
    service: http://192.168.1.100:3000
    originRequest:
      noTLSVerify: true

说明:AdGuard Home 的 Web 界面需要通过 HTTP 访问,不要直接暴露 DNS 端口(53)到公网。

9.3 Vaultwarden 密码管理器

YAML
ingress:
  - hostname: vault.yourdomain.com
    service: https://192.168.1.100:11001
    originRequest:
      originServerName: vault.yourdomain.com
      noTLSVerify: false

安全建议:Vaultwarden 存储了所有密码数据,务必启用强访问策略和 2FA。

9.4 Jellyfin / Emby 媒体服务器

YAML
ingress:
  - hostname: media.yourdomain.com
    service: http://192.168.1.100:8096
    originRequest:
      noTLSVerify: true
      # 可选:限制上传大小(MB)
      # uploadLimit: 314572800

9.5 TrueNAS / UNRAID NAS 管理界面

YAML
ingress:
  - hostname: nas.yourdomain.com
    service: http://192.168.1.100:80
    originRequest:
      noTLSVerify: true

警告:NAS 管理界面权限极高,强烈不建议暴露到公网。建议使用 Zero Trust Client 模式访问。


十、总结:Cloudflare Tunnel 是否适合你?

10.1 适合使用 Cloudflare Tunnel 的用户

10.2 不适合的场景

10.3 部署时间预估

步骤 预估时间 难度
域名托管到 Cloudflare 30 分钟(取决于 DNS 生效时间)
创建 Cloudflare Tunnel 15 分钟
安装 cloudflared 到 OpenWrt 20 分钟 ⭐⭐
配置 Ingress 规则 30 分钟 ⭐⭐
配置 Zero Trust 访问策略 30 分钟 ⭐⭐
总计 约 2 小时 简单到中等

【Reddit r/openwrt 社区总结帖】 Reddit 用户 u/HomeNetworkFinal2026 在一篇年度总结中写道: “Cloudflare Tunnel 是 2026 年最值得部署的开源网络工具之一。它的出现让内网穿透从’技术活’变成了’零门槛’。对于 OpenWrt 用户而言,只要你的软路由能联网,就能通过 Cloudflare Tunnel 将任何内网服务安全地暴露到公网。最重要的是,这一切都是免费的——没有流量限制、没有带宽限制、没有时间限制。只要 Cloudflare 不倒闭,这套方案就能一直用下去。”


参考来源:zoio.net OpenWrt Cloudflare Tunnel 教程 | Reddit r/openwrt | Reddit r/homeassistant | Reddit r/HomeNetworking | Cloudflare 官方文档 | Cloudflare Zero Trust 官方博客

版权声明

作者: 易邦

链接: https://blog.e8k.net/posts/openwrt-cloudflare-tunnel-2026/

许可证: 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。