前言家中有一台运行在内网的服务器（没有公网 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. 配置 DNScloudflared 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-appDomain: yourdomain.com4. 创建访问策略在同一页面向下滚动到 Policies 部分：创建策略的常用方式：方式 1：基于邮箱地址（推荐用于个人）Policy name：策略名称（如 allow-specific-users）Action：选择 AllowConfigure 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.com2. 登录流程系统会重定向到 Cloudflare Access 登录页面：输入你在策略中配置的邮箱地址点击 Send me a code查收邮件中的验证码（6 位数字）输入验证码验证成功后，会重定向回你的应用3. 会话管理登录成功后，在设置的会话时间内（如 24 小时）无需重复登录。会话过期后需要重新验证。第四部分：故障排查问题 1：收不到验证邮件可能原因和解决方法：1.1 邮件被拦截检查垃圾邮件文件夹（最常见）检查推广邮件或其他分类文件夹在邮箱中搜索发件人：noreply@cloudflareaccess.com 或 @cloudflare.com1.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:81882.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: CNAMEName: your-appTarget: <Tunnel-ID>.cfargotunnel.comProxy status: Proxied（橙色云朵）问题 4：策略配置问题4.1 查看访问日志进入 Logs → Access查看最近的认证尝试检查是否有错误信息4.2 使用 IP 白名单临时测试如果邮件验证一直有问题，可以临时改用 IP 白名单：访问 https://ip.sb 或 https://ifconfig.me 查看你的公网 IP编辑应用策略修改 Include 规则：删除 Emails 规则（或保留）添加 IP ranges输入你的公网 IP4.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，安全地远程访问你的内网服务！参考资源Cloudflare Tunnel 官方文档Cloudflare Access 官方文档cloudflared GitHub 仓库更新日志2026-01-28：初始版本发布
家里有个装了Windows的atom小电脑，因为没有独立ip，当人在外的时候没法直接通过远程桌面。通过使用frp和一个具有公网ip的vps就可以实现内网穿透，实现在任何地方都可以直接登陆atom小电脑。服务器端配置点击这里，在github上下载最新的frp软件，注意选择符合vps的硬件和软件版本。修改frps.ini中的配置文件，更改为如下：（其中7000是frp的服务器端和客户端之间的通信端口）[common] bind_port = 7000使用以下命令将frp服务器端在后台运行，注意文件路径（如将frps放在了/home/frp/文件夹下）：nohup /home/frp/frps -c /home/frp/frps.ini & &> /dev/null客户端配置还是在刚才的github页面上下载Windows版本的frp，注意软件要和Windows位数一致。修改frpc.ini中的配置文件，更改为如下：[common] server_addr = ip #这里是vps的ip server_port = 7000 [rdp] type = tcp local_ip = 127.0.0.1 local_port = 3389 remote_port = 5200在cmd或者powershell中，先cd到frp的文件夹，再运行以下命令：frpc -c frpc.ini连接到远程桌面使用vps的ip和端口5200，即可实现内网穿透并远程桌面连接。这里的远程桌面连接效果，取决于vps，本地和远程电脑三方的网络质量。frp客户端开机自启动(由hostloc的lop提供)1.新建vbs后缀的脚本（根据frpc的存放目录自行更改）set ws=WScript.CreateObject("WScript.Shell") ws.Run "c:\frp\frpc.exe -c c:\frp\frpc.ini",0 2.将此脚本放入C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp 即可添加开机自启动。如无法找到以上目录，可通过“运行”–“shell:startup”找到。