使用 Cloudflare Zero Trust 实现内网服务外网访问
前言
家中有一台运行在内网的服务器(没有公网 IP),上面运行着一些服务(Home Assistant等),想要从外网访问,但又不希望所有人都能访问,于是选择使用 Cloudflare Zero Trust 实现内网穿透。注:如果有独立IP的服务器,也可以直接使用easytier实现内网穿透,更方便但限制于中转服务器的网速。
本文将详细介绍如何在 Debian 13 Linux 服务器上配置 Cloudflare Zero Trust,实现:
- 内网服务暴露到公网
- 通过身份验证控制访问权限
- 无需公网 IP 或路由器端口转发
什么是 Cloudflare Zero Trust?
Cloudflare Zero Trust 是 Cloudflare 提供的零信任网络访问解决方案,包括:
- Cloudflare Tunnel:安全地将内网服务暴露到互联网
- Access:身份验证和访问控制策略
- Gateway:网络安全和流量过滤
对于个人用户,最常用的是 Tunnel + Access 组合,可以实现安全的远程访问。
环境要求
- 一台 Linux 服务器(本文以 Debian 13 为例)
- 服务器上运行的服务(本文以 8188 端口为例)
- 一个域名(需要使用 Cloudflare DNS)
- Cloudflare 账号(免费)
第一部分:安装和配置
1. 安装 cloudflared
在你的 Debian 服务器上安装 cloudflared 客户端:
# 下载最新版本的 cloudflared
wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
# 安装
sudo dpkg -i cloudflared-linux-amd64.deb
# 验证安装
cloudflared --version2. 登录 Cloudflare 账户
cloudflared tunnel login执行后会出现以下情况之一:
- 有桌面环境:自动打开浏览器进行授权
- 无桌面环境:显示一个 URL,需要在其他设备上打开这个 URL 完成授权
授权成功后,会在 ~/.cloudflared/ 目录下生成证书文件。
3. 创建 Tunnel
# 创建一个 tunnel(名称可以自定义)
cloudflared tunnel create my-app-tunnel执行成功后,会返回类似以下信息:
Tunnel credentials written to /home/xxx/.cloudflared/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.json # 这里的xxx是用户名
Created tunnel my-app-tunnel with id xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx重要:记录返回的 Tunnel ID,后续配置需要用到。
4. 配置 Tunnel
创建配置文件 /etc/cloudflared/config.yml:
sudo mkdir -p /etc/cloudflared
sudo nano /etc/cloudflared/config.yml添加以下内容:
tunnel: <你的Tunnel-ID>
credentials-file: /home/xxx/.cloudflared/<你的Tunnel-ID>.json
ingress:
- hostname: your-app.yourdomain.com
service: http://localhost:8188
- service: http_status:404配置说明:
tunnel:填写步骤 3 中获得的 Tunnel IDcredentials-file:凭证文件路径(使用步骤 3 中显示的路径)hostname:你想使用的域名(需要提前在 Cloudflare 添加域名)service:本地服务地址(本文是http://localhost:8188)- 最后一行
service: http_status:404是必需的,用于处理未匹配的请求
5. 配置 DNS
cloudflared tunnel route dns <你的Tunnel-ID> your-app.yourdomain.com这个命令会自动在 Cloudflare DNS 中创建一条 CNAME 记录,指向你的 Tunnel。
你也可以手动在 Cloudflare 控制台添加:
- 类型:CNAME
- 名称:your-app
- 内容:
<Tunnel-ID>.cfargotunnel.com - 代理状态:已代理(橙色云朵)
6. 设置为系统服务
将 cloudflared 设置为开机自启动的系统服务:
# 安装服务
sudo cloudflared service install
# 启动服务
sudo systemctl start cloudflared
# 设置开机自启
sudo systemctl enable cloudflared
# 查看服务状态
sudo systemctl status cloudflared如果一切正常,状态应该显示 active (running)。
7. 测试 Tunnel 连接
此时,你应该可以通过域名访问你的服务:
https://your-app.yourdomain.com注意:由于还没有配置访问策略,此时任何人都可以访问。接下来我们将配置身份验证。
第二部分:配置访问控制
1. 访问 Cloudflare Zero Trust 控制台
打开浏览器,访问:https://one.dash.cloudflare.com/
首次使用需要设置团队名称(Team name),这个名称会成为你的 Zero Trust 域名的一部分。
2. 创建应用程序
- 在左侧菜单中,进入 Access → Applications
- 点击 Add an application
- 选择 Self-hosted(自托管应用)
3. 配置应用信息
在应用配置页面填写以下信息:
Basic information(基本信息):
- Application name:应用名称(如
comfyui) - Session Duration:会话持续时间(如
24 hours) Application domain:
- Subdomain:
your-app - Domain:
yourdomain.com
- Subdomain:
4. 创建访问策略
在同一页面向下滚动到 Policies 部分:
创建策略的常用方式:
方式 1:基于邮箱地址(推荐用于个人)
- Policy name:策略名称(如
allow-specific-users) - Action:选择
Allow Configure rules:
Include:
- 选择
Emails - 输入允许访问的邮箱地址(可以添加多个)
- 例如:
user1@example.com,user2@example.com
- 选择
方式 2:基于邮箱域名(适合团队)
Include:
- 选择
Email domains - 输入允许的邮箱域名
- 例如:
@yourcompany.com(允许所有该域名下的邮箱)
- 选择
方式 3:基于 IP 地址
Include:
- 选择
IP ranges - 输入允许的 IP 地址或 IP 段
- 例如:
192.168.1.100或203.0.113.0/24
- 选择
方式 4:组合多个条件
你可以添加多个 Include 规则,用户满足任一条件即可访问。也可以添加 Exclude 规则来排除特定用户。
5. 配置登录方式
在应用配置页面,点击 Login methods 标签:
- One-time PIN:通过邮件发送验证码(默认启用,如果没有启用需要在编辑状态下手动启用)
- Google、GitHub 等:OAuth 登录方式
- SAML、OIDC:企业级单点登录
对于个人用户,推荐使用 One-time PIN(邮件验证码)或 Google 登录。
6. 保存配置
点击 Save application 完成配置。
第三部分:测试访问
1. 访问你的应用
打开浏览器,访问:https://your-app.yourdomain.com
2. 登录流程
系统会重定向到 Cloudflare Access 登录页面:
- 输入你在策略中配置的邮箱地址
- 点击 Send me a code
- 查收邮件中的验证码(6 位数字)
- 输入验证码
- 验证成功后,会重定向回你的应用
3. 会话管理
登录成功后,在设置的会话时间内(如 24 小时)无需重复登录。会话过期后需要重新验证。
第四部分:故障排查
问题 1:收不到验证邮件
可能原因和解决方法:
1.1 邮件被拦截
- 检查垃圾邮件文件夹(最常见)
- 检查推广邮件或其他分类文件夹
- 在邮箱中搜索发件人:
noreply@cloudflareaccess.com或@cloudflare.com
1.2 策略未关联到应用
这是最常见的问题。确认方法:
- 进入 Access → Applications
- 点击你的应用
- 查看 Overview 页面
- 确认 Used by applications 字段不是
--
如果策略未关联:
- 编辑应用
- 进入 Policies 标签
- 确认你创建的策略已添加到应用中
1.3 One-time PIN 未启用
- 访问 Settings → Authentication
- 查看 Login methods
- 确认 One-time PIN 已启用(绿色)
- 如果未启用,点击 Add new 添加
1.4 Outlook/Hotmail 邮箱特殊问题
Outlook/Hotmail 有时会严格拦截 Cloudflare 邮件:
- 尝试使用 Gmail 等其他邮箱测试
- 检查 Outlook 的 "其他"文件夹
- 将
noreply@cloudflareaccess.com添加到白名单
1.5 测试策略配置
使用 Policy Tester 功能:
- 在应用的 Policies 标签页
- 点击 Test policies
- 输入测试邮箱
- 查看是否匹配策略
问题 2:Tunnel 连接失败
2.1 检查服务状态
# 查看服务状态
sudo systemctl status cloudflared
# 查看实时日志
sudo journalctl -u cloudflared -f
# 查看最近 50 条日志
sudo journalctl -u cloudflared -n 502.2 常见错误和解决方法
错误:failed to connect to the edge
- 检查服务器网络连接
- 确认防火墙未阻止 cloudflared 出站连接
- 尝试重启服务:
sudo systemctl restart cloudflared
错误:config validation error
- 检查
/etc/cloudflared/config.yml格式 - 确认 Tunnel ID 正确
- 确认凭证文件路径存在
错误:connection refused
- 确认本地服务(如 8188 端口)正在运行
- 测试本地访问:
curl http://localhost:8188
2.3 重新配置 Tunnel
如果问题持续,可以删除并重新创建:
# 停止服务
sudo systemctl stop cloudflared
# 删除 tunnel
cloudflared tunnel delete my-app-tunnel
# 重新创建(从步骤 3 开始)
cloudflared tunnel create my-app-tunnel问题 3:DNS 解析失败
3.1 检查 DNS 记录
# Linux/macOS
nslookup your-app.yourdomain.com
# 或使用 dig
dig your-app.yourdomain.com应该返回类似 xxxx.cfargotunnel.com 的 CNAME 记录。
3.2 DNS 传播延迟
DNS 更改可能需要几分钟到几小时才能全球生效。可以:
- 等待 5-10 分钟后重试
- 使用在线工具检查 DNS 传播:https://dnschecker.org/
3.3 手动添加 DNS 记录
如果 cloudflared tunnel route dns 命令失败,可以手动添加:
- 登录 Cloudflare 控制台
- 选择你的域名
- 进入 DNS → Records
点击 Add record:
- Type:
CNAME - Name:
your-app - Target:
<Tunnel-ID>.cfargotunnel.com - Proxy status: Proxied(橙色云朵)
- Type:
问题 4:策略配置问题
4.1 查看访问日志
- 进入 Logs → Access
- 查看最近的认证尝试
- 检查是否有错误信息
4.2 使用 IP 白名单临时测试
如果邮件验证一直有问题,可以临时改用 IP 白名单:
- 访问 https://ip.sb 或 https://ifconfig.me 查看你的公网 IP
- 编辑应用策略
修改 Include 规则:
- 删除 Emails 规则(或保留)
- 添加 IP ranges
- 输入你的公网 IP
4.3 添加其他登录方式
如果 One-time PIN 持续有问题,可以添加其他登录方式:
- 在应用的 Login methods 中
- 点击 Add new
- 选择 Google、GitHub 等 OAuth 提供商
- 按提示完成配置
问题 5:服务访问慢或不稳定
5.1 检查本地服务性能
# 测试本地访问速度
curl -w "@-" -o /dev/null -s http://localhost:8188 <<'EOF'
time_namelookup: %{time_namelookup}\n
time_connect: %{time_connect}\n
time_total: %{time_total}\n
EOF5.2 优化 Tunnel 配置
在 /etc/cloudflared/config.yml 中添加:
tunnel: <你的Tunnel-ID>
credentials-file: /root/.cloudflared/<你的Tunnel-ID>.json
# 添加以下优化配置
protocol: quic
no-autoupdate: true
ingress:
- hostname: your-app.yourdomain.com
service: http://localhost:8188
originRequest:
noTLSVerify: true
connectTimeout: 30s
keepAliveTimeout: 90s
- service: http_status:404修改后重启服务:
sudo systemctl restart cloudflared第五部分:安全建议
1. 限制本地访问
既然已经通过 Cloudflare Zero Trust 控制访问,建议将本地服务改为只监听 127.0.0.1,避免本地网络直接访问绕过认证。
例如,如果你的服务支持配置监听地址:
# 从
0.0.0.0:8188
# 改为
127.0.0.1:81882. 使用强会话策略
根据安全需求调整会话时长:
- 高安全:1 小时或更短
- 日常使用:24 小时
- 低敏感服务:1 周
3. 启用审计日志
在 Zero Trust 控制台,你可以查看所有访问记录:
- 谁在什么时间访问了应用
- 使用了哪种认证方式
- 访问是否成功
4. 定期更新 cloudflared
# 更新到最新版本
wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
sudo dpkg -i cloudflared-linux-amd64.deb
sudo systemctl restart cloudflared5. 使用不同策略管理不同应用
如果你有多个内网服务,可以为每个服务创建独立的应用和策略:
ingress:
- hostname: app1.yourdomain.com
service: http://localhost:8188
- hostname: app2.yourdomain.com
service: http://localhost:3000
- hostname: app3.yourdomain.com
service: http://localhost:8080
- service: http_status:404然后在 Zero Trust 控制台为每个域名创建单独的应用,设置不同的访问策略。
第六部分:高级配置
1. 使用 Cloudflare Access 组
如果需要管理多个用户,可以创建组:
- 进入 Settings → Account → Users
- 创建用户组(如
developers,admins) - 在策略中使用组而不是单独的邮箱
2. 配置 WARP 客户端
对于需要频繁访问的用户,可以使用 WARP 客户端实现更好的体验:
- 下载 Cloudflare WARP 客户端
- 使用 Zero Trust 模式连接
- 无需每次打开浏览器都登录
3. 使用 Service Auth
对于 API 或自动化访问,可以使用 Service Token:
- 进入 Access → Service Auth
- 创建 Service Token
- 在请求头中使用 Token 访问
4. 配置设备信任
可以要求设备安装 WARP 客户端并满足特定条件才能访问:
- 进入 Settings → Devices
- 配置设备策略(如要求操作系统更新、防火墙开启等)
- 在应用策略中添加设备信任要求
常见使用场景
场景 1:个人 ComfyUI 服务器
# /etc/cloudflared/config.yml
tunnel: abc123...
credentials-file: /root/.cloudflared/abc123...json
ingress:
- hostname: comfyui.example.com
service: http://localhost:8188
- service: http_status:404访问策略:只允许你自己的邮箱
场景 2:团队内部工具
# /etc/cloudflared/config.yml
tunnel: abc123...
credentials-file: /root/.cloudflared/abc123...json
ingress:
- hostname: tools.company.com
service: http://localhost:8080
- service: http_status:404访问策略:允许 @company.com 域名下的所有邮箱
场景 3:多个服务
# /etc/cloudflared/config.yml
tunnel: abc123...
credentials-file: /root/.cloudflared/abc123...json
ingress:
- hostname: jupyter.example.com
service: http://localhost:8888
- hostname: grafana.example.com
service: http://localhost:3000
- hostname: portainer.example.com
service: https://localhost:9443
originRequest:
noTLSVerify: true
- service: http_status:404为每个服务在 Zero Trust 控制台创建独立应用和策略。
总结
通过 Cloudflare Zero Trust,我们可以:
✅ 无需公网 IP:内网服务器也能对外提供服务
✅ 安全访问控制:通过邮箱、IP、设备等多种方式控制访问
✅ 免费使用:个人用户可以免费使用(有一定的使用限制)
✅ 易于管理:图形化界面,配置简单
✅ 高可用性:依托 Cloudflare 全球网络
希望本文能帮助你成功配置 Cloudflare Zero Trust,安全地远程访问你的内网服务!
参考资源
更新日志
- 2026-01-28:初始版本发布