Cloudflare Zero Trust 实战:安全访问你的内网应用和服务器 – wiki基地


Cloudflare Zero Trust 实战:告别VPN,安全访问你的内网应用和服务器

在数字化转型和远程办公成为常态的今天,如何安全、高效地访问企业内网资源,成为了每一个IT管理者和开发者面临的核心挑战。传统的VPN(虚拟专用网络)虽然在过去几十年中扮演了重要角色,但其固有的弊端也日益凸显:配置复杂、速度缓慢、体验不佳,更重要的是,其“一旦登录,内网尽可访问”的边界安全模型,在面对日益复杂的网络攻击时显得力不从心。

正是在这样的背景下,“零信任”(Zero Trust)安全架构应运而生。其核心理念——“从不信任,永远验证”(Never Trust, Always Verify),彻底颠覆了传统的边界安全思想。它假设网络无时无刻不处于危险之中,无论是外部还是内部,任何访问请求都必须经过严格的身份验证、设备验证和权限授权,才能访问相应的资源。

而 Cloudflare Zero Trust,作为全球领先的零信任解决方案之一,以其强大的功能、简洁的配置和慷慨的免费套餐,为个人开发者、小型团队乃至大型企业提供了一套近乎完美的内网访问替代方案。本文将通过详尽的实战步骤,带你从零开始,一步步搭建起基于 Cloudflare Zero Trust 的安全访问体系,彻底告别传统VPN的束缚。

一、 核心概念:为什么选择 Cloudflare Zero Trust?

在深入实战之前,我们首先需要理解其背后的几个核心组件,这将帮助我们更好地规划和部署。

  1. Cloudflare Tunnel (前身为 Argo Tunnel): 这是连接你的内网服务与 Cloudflare 全球网络的“隧道”。你在内网服务器上运行一个轻量级的守护进程 cloudflared,它会主动与最近的 Cloudflare 数据中心建立一个加密的、持久的出站连接。由于是出站连接,你无需在防火墙上开放任何入站端口,也无需拥有公网IP。这从根本上杜绝了直接暴露内网服务于公网的风险。

  2. Cloudflare Access: 这是零信任架构的“门禁系统”。当用户尝试通过 Cloudflare 访问你的内网应用时,Access 会拦截该请求,并根据你设定的策略(Policy)对其进行验证。验证的维度可以非常丰富,例如:

    • 身份(Identity): 用户是谁?可以通过邮箱一次性密码(OTP)、Google、GitHub、Okta等多种身份提供商(IdP)进行验证。
    • 设备状态(Device Posture): 用户使用的设备是否安全?例如,设备是否开启了防火墙、系统是否为最新版本、是否存在特定文件等。
    • 地理位置(Location): 用户从哪里访问?
    • 其他信号: IP地址、请求时间等。
      只有完全满足策略要求的请求才会被放行。
  3. WARP Client: 这是 Cloudflare 提供的一个可选的客户端软件,安装在用户的电脑或手机上。它能将设备的所有流量(或特定流量)都通过安全的隧道发送到 Cloudflare 网络进行处理。当与 Zero Trust 结合时,它能实现比浏览器访问更强大的功能,例如直接通过IP地址访问内网服务、安全访问SSH/RDP等非HTTP应用,实现更接近传统VPN的无缝体验,但安全性远超后者。

相比传统VPN,Cloudflare Zero Trust 的优势是压倒性的:

特性 传统VPN Cloudflare Zero Trust
安全模型 边界信任模型,登录后可横向移动 零信任模型,对每个请求进行验证
暴露面 需要开放公网端口,易受攻击 无需公网IP和开放端口,零攻击面
性能 流量需绕行至中心VPN网关,延迟高 借助Cloudflare全球网络,就近接入,速度快
用户体验 连接繁琐,频繁断线,影响网速 无感连接(使用WARP)或简单的浏览器登录
管理维护 配置复杂,硬件/软件成本高 SaaS平台,Web界面配置,维护简单
访问粒度 粗粒度,通常是整个网段的访问权限 细粒度,可精确到单个应用、URL路径

二、 准备工作

在开始我们的实战之旅前,请确保你已准备好以下条件:

  1. 一个 Cloudflare 账户: 免费账户即可享受 Zero Trust 的大部分核心功能,包括50个免费席位。
  2. 一个你拥有的域名: 并已将该域名的 DNS 解析服务托管到 Cloudflare。这是必要条件,因为 Access 的所有应用都将通过该域名下的子域名进行访问。
  3. 一台内网服务器或虚拟机: 用来托管你希望发布的应用,例如一个Web服务、SSH服务、或者一个Jellyfin媒体服务器等。这台服务器可以是任何操作系统(Linux、Windows、macOS)。

三、 实战演练:三步构建你的安全访问通道

我们的目标是:将内网的一台服务器上运行的Web应用(例如:http://localhost:8000)和一个SSH服务(端口22)安全地发布出去,只有授权的用户才能访问。

第1步:创建并配置 Cloudflare Tunnel

这是打通内网与Cloudflare网络的第一步。

1. 安装 cloudflared

首先,登录到你的内网服务器。根据你的操作系统,从 Cloudflare 的官方文档下载并安装 cloudflared 守护进程。以 Linux (Debian/Ubuntu) 为例:

“`bash

下载安装包

wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb

安装

sudo dpkg -i cloudflared-linux-amd64.deb
“`

其他系统的安装方式请参考官方文档。

2. 认证 cloudflared

运行以下命令,它会打开一个浏览器窗口,要求你登录 Cloudflare 账户,并选择你要授权的域名。

bash
cloudflared tunnel login

授权成功后,会在你的用户主目录下生成一个 cert.pem 证书文件(通常在 ~/.cloudflared/cert.pem),这是你的 cloudflared 进程与 Cloudflare 通信的凭证。

3. 创建一个 Tunnel

现在,我们来创建一个命名的隧道。给它起一个有意义的名字,例如 my-home-lab

bash
cloudflared tunnel create my-home-lab

执行成功后,会返回一个隧道的 UUID,并同时在 ~/.cloudflared/ 目录下生成一个与该UUID同名的JSON凭证文件。请务必妥善保管这个UUID和JSON文件,它们是隧道的唯一标识。

4. 编写配置文件

为了让隧道知道要代理哪些内网服务,我们需要创建一个配置文件。这是最关键的一步。

~/.cloudflared/ 目录下创建一个名为 config.yml 的文件,并填入以下内容:

“`yaml

隧道的UUID,请替换为你上一步获取到的UUID

tunnel: a1b2c3d4-e5f6-7890-g1h2-i3j4k5l6m7n8

隧道连接凭证文件的路径

credentials-file: /root/.cloudflared/a1b2c3d4-e5f6-7890-g1h2-i3j4k5l6m7n8.json

定义入口规则(Ingress Rules)

ingress:
# 规则一:代理内网的Web应用
– hostname: dashboard.yourdomain.com # 你希望用来访问的公网域名
service: http://localhost:8000 # 对应的内网服务地址

# 规则二:代理内网的SSH服务
– hostname: ssh.yourdomain.com # 用来访问SSH的公网域名
service: ssh://localhost:22 # 对应的内网SSH服务地址

# 规则三:必须添加的默认规则,用于捕获所有不匹配的请求
– service: http_status:404
“`

配置文件解析:

  • tunnel: 填入你创建的隧道的UUID。
  • credentials-file: 指向隧道的JSON凭证文件,建议使用绝对路径。
  • ingress: 这是入口规则列表,定义了域名和内网服务的映射关系。
    • hostname: 这是用户在公网访问的地址。你必须在 Cloudflare 的 DNS 面板中为这个子域名创建一个 CNAME 记录,指向你的隧道。别担心,下一步 cloudflared 会帮你自动创建。
    • service: 这是 hostname 对应的内网服务地址。支持 httphttpstcpsshrdp 等多种协议。
  • 最后的 service: http_status:404 是一个安全兜底规则,确保任何未明确定义的访问都会被拒绝。

5. 运行 Tunnel 并创建 DNS 记录

现在,让我们把隧道跑起来,并让它自动为你在 Cloudflare DNS 中创建 CNAME 记录。

bash
cloudflared tunnel route dns my-home-lab dashboard.yourdomain.com
cloudflared tunnel route dns my-home-lab ssh.yourdomain.com

上述命令会为 dashboard.yourdomain.comssh.yourdomain.com 创建指向隧道的 CNAME 记录。

最后,正式运行隧道:

bash
cloudflared tunnel run my-home-lab

如果一切顺利,你会在终端看到 cloudflared 成功连接到 Cloudflare 网络的日志。现在,你的内网服务已经通过隧道连接到了 Cloudflare,但还未受保护,任何知道域名的人都可以访问。

6. (推荐) 将 Tunnel 安装为系统服务

为了让隧道在服务器重启后能自动运行,强烈建议将其安装为系统服务。

“`bash

先停止前台运行的隧道 (Ctrl+C)

将配置文件移动到推荐的系统位置

sudo mv ~/.cloudflared/config.yml /etc/cloudflared/config.yml

安装服务

sudo cloudflared service install

启动服务

sudo systemctl start cloudflared

查看服务状态

sudo systemctl status cloudflared
“`

至此,隧道的搭建工作完成。接下来进入最核心的安全配置环节。

第2步:配置 Cloudflare Access 策略

现在,我们要为刚刚创建的两个应用 (dashboardssh) 添加访问控制。

1. 登录 Zero Trust Dashboard

访问 one.dash.cloudflare.com,使用你的 Cloudflare 账户登录。

2. 添加一个自托管应用 (Self-hosted Application)

在左侧导航栏,选择 Access -> Applications,然后点击 Add an application 按钮。选择 Self-hosted 类型。

3. 配置Web应用 (dashboard.yourdomain.com)

  • Application name: 给应用起个名字,例如 “Internal Dashboard”。
  • Session Duration: 用户登录后会话保持的时间,例如 24 hours
  • Application domain: 在这里填写子域名 dashboard 和你的主域名 yourdomain.com
  • Identity providers: 选择允许的登录方式。默认的 One-Time Pin (邮件一次性验证码) 对个人和小团队非常友好。你也可以连接 Google、GitHub 等。我们保持默认。
  • 点击 Next

4. 创建访问策略 (Policy)

这是定义“谁可以访问”的地方。

  • Policy name: 给策略起个名字,例如 “Allow Admins”。
  • Action: 选择 Allow (允许)。
  • Configure rules: 这里是规则构建器。
    • 我们可以创建一个简单的规则:Selector 选择 EmailsValue 填入你自己的邮箱地址,例如 [email protected]
    • 这意味着,只有这个邮箱地址才能通过OTP验证后访问。
  • 你还可以点击 Add requirement 添加更复杂的“与”逻辑,例如:
    • Emails in [email protected]
    • AND Countries is United States
    • 这意味着,用户必须是指定的邮箱,并且必须从美国访问。
  • 点击 Next,再点击 Add application 完成创建。

现在,尝试在浏览器中访问 https://dashboard.yourdomain.com。你会被重定向到一个 Cloudflare 的登录页面。输入你授权的邮箱,接收并输入验证码后,你就能成功看到内网 localhost:8000 的页面了!

第3步:配置 SSH 访问

通过浏览器访问SSH并非最佳实践。Cloudflare Access 允许我们通过本地的 SSH 客户端,结合 cloudflared,以零信任的方式安全连接。

1. 创建 SSH 应用

重复第2步的过程,为 ssh.yourdomain.com 也创建一个 Self-hosted 应用。策略可以复用之前的,也可以单独创建。例如,创建一个只允许特定开发者访问SSH的策略。

2. 在客户端配置 SSH

现在,转到你希望发起SSH连接的本地电脑(不是内网服务器)。确保这台电脑上也安装了 cloudflared

修改你本地电脑的 SSH 配置文件 ~/.ssh/config,添加以下内容:

Host ssh.yourdomain.com
ProxyCommand /usr/local/bin/cloudflared access ssh --hostname %h

配置解析:

  • Host ssh.yourdomain.com: 定义了当你 SSH 连接这个主机名时,应用下面的规则。
  • ProxyCommand: 这是关键。它告诉你的 SSH 客户端,在建立连接前,先执行 cloudflared access ssh 命令。这个命令会:
    1. 自动打开浏览器,让你通过 Cloudflare Access 进行身份验证(就是你刚才配置的邮件OTP等)。
    2. 验证通过后,cloudflared 会在本地建立一个安全的代理,将你的SSH流量转发到 ssh.yourdomain.com 对应的内网隧道中。
    3. 注意:/usr/local/bin/cloudflaredcloudflared 的路径,请根据你的实际安装位置进行修改(Windows下可能是 C:\Cloudflared\bin\cloudflared.exe)。

3. 连接 SSH

现在,在你的本地终端里,像往常一样使用 SSH 命令:

bash
ssh [email protected]

其中 user 是你内网服务器上的用户名。

按下回车,你的浏览器会自动弹出一个登录页面。完成验证后,终端里的 SSH 连接就会建立成功!你已经实现了无需暴露22端口、无需VPN、基于身份验证的安全SSH访问。

四、 进阶玩法与最佳实践

掌握了基础之后,Cloudflare Zero Trust 还有更多强大的功能待你探索。

  • RDP 远程桌面: 与SSH类似,你可以为内网的Windows RDP服务(通常是 tcp://localhost:3389)创建一个隧道入口,并使用 cloudflared access rdp 命令进行安全连接。
  • 私有网络路由 (Private Network Routing): 如果你希望获得更像传统VPN的体验,直接通过内网IP(如 192.168.1.100)访问资源,可以在隧道中配置私有网段路由。这需要团队所有成员都在设备上安装并登录 WARP 客户端。WARP 会智能地将发往这些私有IP的流量通过 Cloudflare Tunnel 转发到你的内网。
  • 服务发现 (Service Discovery): 结合私有网络路由,你可以配置 Cloudflare 的 Gateway DNS,让团队成员可以直接通过内网主机名(如 nas.lan)访问服务,而无需记住IP。
  • 设备状态感知 (Device Posture): 在 Access 策略中,你可以添加对客户端设备的要求,例如必须运行某个版本的操作系统、必须开启防火墙、必须安装公司的根证书等。这进一步加强了安全性,确保只有合规的设备才能接入。
  • L4/L7 防火墙 (Gateway): 除了 Access 的身份验证,你还可以启用 Gateway 功能,对通过 WARP 或隧道的所有流量进行内容过滤、恶意软件扫描、DNS过滤等,构建一个完整的安全服务边缘(SSE)。
  • 详细的审计日志: 在 Zero Trust Dashboard 的 Logs -> Access 部分,你可以看到每一次访问请求的详细记录,包括谁在何时何地、使用什么设备、尝试访问哪个应用、以及最终结果(允许或拒绝),为安全审计提供了极大的便利。

总结

我们通过本文的实战演练,成功地利用 Cloudflare Tunnel 和 Access,将内网的Web应用和SSH服务安全地发布到了互联网上。我们没有修改一行防火墙规则,没有申请一个公网IP,却构建起了一套远比传统VPN更安全、更灵活、体验更佳的现代远程访问体系。

Cloudflare Zero Trust 的真正力量在于它将复杂的网络安全概念产品化、简单化,让个人和小型组织也能以极低的成本享受到企业级的安全防护。它不仅是一个VPN的替代品,更是一种全新的安全理念的实践。当你开始将更多的内网服务,如NAS、代码仓库、监控面板、数据库等,都迁移到这套体系下进行统一的身份和策略管理时,你将真正体会到零信任架构带来的颠覆性变革。

告别笨重的VPN,拥抱敏捷、安全的未来。你的零信任之旅,从今天开始。

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部