前言

家中有一台运行在内网的服务器(没有公网 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 --version

2. 登录 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 ID
  • credentials-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. 创建应用程序

  1. 在左侧菜单中,进入 AccessApplications
  2. 点击 Add an application
  3. 选择 Self-hosted(自托管应用)

3. 配置应用信息

在应用配置页面填写以下信息:

Basic information(基本信息)

  • Application name:应用名称(如 comfyui
  • Session Duration:会话持续时间(如 24 hours
  • Application domain

    • Subdomain: your-app
    • Domain: yourdomain.com

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.100203.0.113.0/24

方式 4:组合多个条件

你可以添加多个 Include 规则,用户满足任一条件即可访问。也可以添加 Exclude 规则来排除特定用户。

5. 配置登录方式

在应用配置页面,点击 Login methods 标签:

  • One-time PIN:通过邮件发送验证码(默认启用,如果没有启用需要在编辑状态下手动启用
  • GoogleGitHub 等:OAuth 登录方式
  • SAMLOIDC:企业级单点登录

对于个人用户,推荐使用 One-time PIN(邮件验证码)或 Google 登录。

6. 保存配置

点击 Save application 完成配置。

第三部分:测试访问

1. 访问你的应用

打开浏览器,访问:https://your-app.yourdomain.com

2. 登录流程

系统会重定向到 Cloudflare Access 登录页面:

  1. 输入你在策略中配置的邮箱地址
  2. 点击 Send me a code
  3. 查收邮件中的验证码(6 位数字)
  4. 输入验证码
  5. 验证成功后,会重定向回你的应用

3. 会话管理

登录成功后,在设置的会话时间内(如 24 小时)无需重复登录。会话过期后需要重新验证。

第四部分:故障排查

问题 1:收不到验证邮件

可能原因和解决方法

1.1 邮件被拦截

  • 检查垃圾邮件文件夹(最常见)
  • 检查推广邮件或其他分类文件夹
  • 在邮箱中搜索发件人:noreply@cloudflareaccess.com@cloudflare.com

1.2 策略未关联到应用

这是最常见的问题。确认方法:

  1. 进入 AccessApplications
  2. 点击你的应用
  3. 查看 Overview 页面
  4. 确认 Used by applications 字段不是 --

如果策略未关联:

  1. 编辑应用
  2. 进入 Policies 标签
  3. 确认你创建的策略已添加到应用中

1.3 One-time PIN 未启用

  1. 访问 SettingsAuthentication
  2. 查看 Login methods
  3. 确认 One-time PIN 已启用(绿色)
  4. 如果未启用,点击 Add new 添加

1.4 Outlook/Hotmail 邮箱特殊问题

Outlook/Hotmail 有时会严格拦截 Cloudflare 邮件:

  • 尝试使用 Gmail 等其他邮箱测试
  • 检查 Outlook 的 "其他"文件夹
  • noreply@cloudflareaccess.com 添加到白名单

1.5 测试策略配置

使用 Policy Tester 功能:

  1. 在应用的 Policies 标签页
  2. 点击 Test policies
  3. 输入测试邮箱
  4. 查看是否匹配策略

问题 2:Tunnel 连接失败

2.1 检查服务状态

# 查看服务状态
sudo systemctl status cloudflared

# 查看实时日志
sudo journalctl -u cloudflared -f

# 查看最近 50 条日志
sudo journalctl -u cloudflared -n 50

2.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 更改可能需要几分钟到几小时才能全球生效。可以:

3.3 手动添加 DNS 记录

如果 cloudflared tunnel route dns 命令失败,可以手动添加:

  1. 登录 Cloudflare 控制台
  2. 选择你的域名
  3. 进入 DNSRecords
  4. 点击 Add record

    • Type: CNAME
    • Name: your-app
    • Target: <Tunnel-ID>.cfargotunnel.com
    • Proxy status: Proxied(橙色云朵)

问题 4:策略配置问题

4.1 查看访问日志

  1. 进入 LogsAccess
  2. 查看最近的认证尝试
  3. 检查是否有错误信息

4.2 使用 IP 白名单临时测试

如果邮件验证一直有问题,可以临时改用 IP 白名单:

  1. 访问 https://ip.sbhttps://ifconfig.me 查看你的公网 IP
  2. 编辑应用策略
  3. 修改 Include 规则:

    • 删除 Emails 规则(或保留)
    • 添加 IP ranges
    • 输入你的公网 IP

4.3 添加其他登录方式

如果 One-time PIN 持续有问题,可以添加其他登录方式:

  1. 在应用的 Login methods
  2. 点击 Add new
  3. 选择 GoogleGitHub 等 OAuth 提供商
  4. 按提示完成配置

问题 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
EOF

5.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:8188

2. 使用强会话策略

根据安全需求调整会话时长:

  • 高安全: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 cloudflared

5. 使用不同策略管理不同应用

如果你有多个内网服务,可以为每个服务创建独立的应用和策略:

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 组

如果需要管理多个用户,可以创建组:

  1. 进入 SettingsAccountUsers
  2. 创建用户组(如 developers, admins
  3. 在策略中使用组而不是单独的邮箱

2. 配置 WARP 客户端

对于需要频繁访问的用户,可以使用 WARP 客户端实现更好的体验:

  1. 下载 Cloudflare WARP 客户端
  2. 使用 Zero Trust 模式连接
  3. 无需每次打开浏览器都登录

3. 使用 Service Auth

对于 API 或自动化访问,可以使用 Service Token:

  1. 进入 AccessService Auth
  2. 创建 Service Token
  3. 在请求头中使用 Token 访问

4. 配置设备信任

可以要求设备安装 WARP 客户端并满足特定条件才能访问:

  1. 进入 SettingsDevices
  2. 配置设备策略(如要求操作系统更新、防火墙开启等)
  3. 在应用策略中添加设备信任要求

常见使用场景

场景 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:初始版本发布

标签: 内网穿透, cloudflare

添加新评论