Cloudflare Zero Trust 实战:告别VPN,安全访问你的内网应用和服务器
在数字化转型和远程办公成为常态的今天,如何安全、高效地访问企业内网资源,成为了每一个IT管理者和开发者面临的核心挑战。传统的VPN(虚拟专用网络)虽然在过去几十年中扮演了重要角色,但其固有的弊端也日益凸显:配置复杂、速度缓慢、体验不佳,更重要的是,其“一旦登录,内网尽可访问”的边界安全模型,在面对日益复杂的网络攻击时显得力不从心。
正是在这样的背景下,“零信任”(Zero Trust)安全架构应运而生。其核心理念——“从不信任,永远验证”(Never Trust, Always Verify),彻底颠覆了传统的边界安全思想。它假设网络无时无刻不处于危险之中,无论是外部还是内部,任何访问请求都必须经过严格的身份验证、设备验证和权限授权,才能访问相应的资源。
而 Cloudflare Zero Trust,作为全球领先的零信任解决方案之一,以其强大的功能、简洁的配置和慷慨的免费套餐,为个人开发者、小型团队乃至大型企业提供了一套近乎完美的内网访问替代方案。本文将通过详尽的实战步骤,带你从零开始,一步步搭建起基于 Cloudflare Zero Trust 的安全访问体系,彻底告别传统VPN的束缚。
一、 核心概念:为什么选择 Cloudflare Zero Trust?
在深入实战之前,我们首先需要理解其背后的几个核心组件,这将帮助我们更好地规划和部署。
-
Cloudflare Tunnel (前身为 Argo Tunnel): 这是连接你的内网服务与 Cloudflare 全球网络的“隧道”。你在内网服务器上运行一个轻量级的守护进程
cloudflared
,它会主动与最近的 Cloudflare 数据中心建立一个加密的、持久的出站连接。由于是出站连接,你无需在防火墙上开放任何入站端口,也无需拥有公网IP。这从根本上杜绝了直接暴露内网服务于公网的风险。 -
Cloudflare Access: 这是零信任架构的“门禁系统”。当用户尝试通过 Cloudflare 访问你的内网应用时,Access 会拦截该请求,并根据你设定的策略(Policy)对其进行验证。验证的维度可以非常丰富,例如:
- 身份(Identity): 用户是谁?可以通过邮箱一次性密码(OTP)、Google、GitHub、Okta等多种身份提供商(IdP)进行验证。
- 设备状态(Device Posture): 用户使用的设备是否安全?例如,设备是否开启了防火墙、系统是否为最新版本、是否存在特定文件等。
- 地理位置(Location): 用户从哪里访问?
- 其他信号: IP地址、请求时间等。
只有完全满足策略要求的请求才会被放行。
-
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路径 |
二、 准备工作
在开始我们的实战之旅前,请确保你已准备好以下条件:
- 一个 Cloudflare 账户: 免费账户即可享受 Zero Trust 的大部分核心功能,包括50个免费席位。
- 一个你拥有的域名: 并已将该域名的 DNS 解析服务托管到 Cloudflare。这是必要条件,因为 Access 的所有应用都将通过该域名下的子域名进行访问。
- 一台内网服务器或虚拟机: 用来托管你希望发布的应用,例如一个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
对应的内网服务地址。支持http
、https
、tcp
、ssh
、rdp
等多种协议。
- 最后的
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.com
和 ssh.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 策略
现在,我们要为刚刚创建的两个应用 (dashboard
和 ssh
) 添加访问控制。
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
选择Emails
,Value
填入你自己的邮箱地址,例如[email protected]
。 - 这意味着,只有这个邮箱地址才能通过OTP验证后访问。
- 我们可以创建一个简单的规则:
- 你还可以点击
Add requirement
添加更复杂的“与”逻辑,例如:Emails
in[email protected]
- AND
Countries
isUnited 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
命令。这个命令会:- 自动打开浏览器,让你通过 Cloudflare Access 进行身份验证(就是你刚才配置的邮件OTP等)。
- 验证通过后,
cloudflared
会在本地建立一个安全的代理,将你的SSH流量转发到ssh.yourdomain.com
对应的内网隧道中。 - 注意:
/usr/local/bin/cloudflared
是cloudflared
的路径,请根据你的实际安装位置进行修改(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,拥抱敏捷、安全的未来。你的零信任之旅,从今天开始。