认识 Cloudflare Zero Trust
Cloudflare Zero Trush是一个综合性的虚拟网系统,对我而言它最主要的功能有2个:
- 内网服务发布。让任何一个客户端可以访问内网某个基于TCP/UDP等协议的应用服务,其中基于HTTP的web服务是最简单的,对客户端没有任何要求,只需要一个域名。这有点类似带内网穿透的DDNS。
- 多网互联。将若干个内网通过 Tunnels 连接到cloudflare构成虚拟专网,接入到其中的客户端可以像局域网一样访问内网资源,有些类似日常使用的VPN。
现在正需要访问一台内网的 Redis ,就分别用这2种方式逐一实现了一遍。
方式一:Tunnels应用程序路由与client access隧道
在连接器创建隧道
在 Cloudflare Zero Trust 控制台创建一个远程管理隧道,有两种类型可选:
- cloudflared Tunnel 仅出站应用程序和网络连接。
- WARP Connector 高级双向用例。
由于现在只是连接到内网中的 redis,所以选择 cloudflared Tunnels。

产品文档:https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/
配置应用程序路由
在 Cloudflare Zero Trust 控制台,选择刚创建的 tunnels 进行配置,选择“已发布应用程序路由“项,添加一个应用程序路由。
- 子域:子域前缀命名
- 域:你在CF注册或管理的域名
- 路径(可选):可用于同子域的路径区分
- 类型:内网服务的类型,这里填写 TCP,如果你需要发web应用可选择HTTP/HTTPS
- URL:一般是内网服务的监听地址和端口,这里停歇 127.0.0.1:6379

可支持的后端服务类型说明:https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/routing-to-tunnel/protocols/
在内网服务器上安装和启用连接器
打开以上配置的 tunnels “概述”项,有详细的在各系统中安装和启用连接的指令说明。
登录到 redis 所在的 centos 服务器上运行:
# This requires yum config-manager
sudo yum install yum-utils
# Add cloudflared.repo to config-manager
# Stable
sudo yum-config-manager --add-repo https://pkg.cloudflare.com/cloudflared.repo
# Nightly
sudo yum-config-manager --add-repo https://next.pkg.cloudflare.com/cloudflared.repo
# install cloudflared
yum install cloudflared
如果遇到linux老版本密钥过期的问题,可以在此直接下载软件包安装。https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/downloads/#linux
cloudflared 安装完成后启用连接器。
//在当前终端会话中手动运行隧道(使用创建 tunnels 生成的 Token)
cloudflared tunnel run --token *******
//也可以配置到服务,每次启动时自动运行隧道
cloudflared service install ******
如果运行正常,这台服务器应已建立隧道连接至 cloudflare 网络,在控制台中当前 tunnels 状态会显示为“正常”,否则可检查日志查找原因。
在客户端创建一个端口代理
如果发布的是内网的web应用,那么此时通过“子域+域+路径”就可以访问配置的内网web应用服务了,但我们现在要连接的是TCP应用,并不能如HTTP/HTTPS直接访问,需要在客户端建立一条本地到 Cloudflare 的“隧道”才行。
//在客户端本地也安装 cloudflared cli(安装如上一步),我的客户端是 macos
brew install cloudflared
//hostname是前一步配置的应用程序路由中的主机名
cloudflared access tcp --hostname xxx.xxx.com --listener 127.0.0.1:16379
这条命令会在本地电脑上开启一个转发器,它会监听本地的 16379 端口,并把数据加密通过 Cloudflare 隧道传送到对应的 Linux 服务器的后端应用端口了。
这样在我的本地客户端就可以使用 redis-cli://127.0.0.1:16379 来连接那台内网中的 redis 了,但这种模式有巨大的数据库暴露风险,所以就有了下面的第二种方式。😄
方式二:通过CIDR和WARP client实现虚拟路由
神奇的 cloudflared 私有网络

在方式一中,我们在内网服务器上安装启用了 cloudfalred tunnels,它不仅可以将本机的应用服务发布到 cloudflare,而且可以当作一个虚拟路由器将本地子网接入到 cloudflare 的虚拟网络中,使登录到这个虚拟网络中的 WARP 设备都能无缝访问,这不仅规避了方式一的公网暴露服务的问题,而且访问方式更无感。
//需要在安装了 cloudflared 的内网服务器打开路由转发,这是所有准备工作的前提 🤭
sysctl -w net.ipv4.ip_forward=1
配置私有网段路由CIDR
在 Cloudflare Zero Trust 控制台,打开方式一中已创建的 tunnels 的 CIDR 选项,添加 CIDR 路由,即要加入到虚拟网络中的IP或子网范围。

如果我们仅想访问内网中这台服务器,可以只填写一个IP范围,如 172.31.0.100/32。如果你想要访问整个内网,可以填写整个子网,如 172.31.0.0/16。总之,你可以根据需要设定你需要访问的IP范围。
定义流量和防火墙策略
由于我们所有的流量都通过 cloudflare 代理了,需要在 cloudflare 后台打开全局的流量设置,定义允许穿透的流量协议,进入“流量策略 – 流量设置 – 代理和检查设置”,选择要转发的协议并启用。

同时还需要创建对应的防火墙策略,建议对应的IP或协议安全规则。进入“流量策略 – 防火墙策略 – 网络”,创建网络策略,如:Allow Destination IP in 172.31.0.0/16,可做颗粒度更细的控制。

设备配置文件及分流策略(Split Tunnels)
完成了虚拟网络的基础设置后,需要在 Cloudflare Zero Trust 管理后台定义“设备配置文件”及其“分流策略”。因为在默认情况下,WARP 客户端会排除私有 IP 访问,需要将其访问流量交给“隧道”。
进入“团队和资源 – 设备 – 设备配置文件”,创建新的设备配置文件,类似于定义哪些用户可以访问哪些资源。
- 表达式。定义的是设备对象,如用户电子邮件/用户组等匹配,用户及用户组权限在 cloudflare 控制台“管理账号 – 成员”中配置,不再叙述。
- 拆分隧道。类似白名单和黑名单机制,在目标IP范围内的流量,将通过 WARP 定向到 cloudflare。这里定义的是包括 IP 和域:172.31.0.0/16

安装 WARP 客户端
WARP 客户端下载地址:
https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/warp/download-warp/
安装完成 WARP 客户端后,需要登录上述设定的 cloudflare 团队成员账号。
- 打开 WARP 设置 -> Account -> Login to Cloudflare Zero Trust。
- 输入你的 Team Domain 并完成浏览器验证。可在 Zero Trust 控制台的“管理”中查看
- 验证成功后,WARP 状态应显示为 Zero Trust。

连接成功后,可以在 Zero Trust 控制台的“设备”中查看设备详细信息。
这样 WARP 客户端设备如同在一个子网中,可以用 redis-cli://172.16.0.100:6379 来连接那台内网中的 redis,当然也可以连接内网中的其他的可用应用服务了。
两种方式的小结
- 使用 access 命令是建立针对一个应用服务的代理隧道,你每访问一个服务(SSH、Mongo、Redis),就得手动开一个命令窗口挂着代理。
- 使用 WARP 相当于部署了一个代理网关,它直接在系统网络层接管流量。只要目标 IP 是你配置的内网段,它自动就会走 Tunnel 转发,不在乎目标 IP 在哪一个内网中。