使用 Cloudflare for Teams 搭建出国隧道

去年 Cloudflare 发布了 Cloudflare for Teams 服务, 本意是接管团队所有流量, 从而提高网络安全性, 但这实际上也提供了一种搭建出国隧道的思路. 目前网上关于这一服务的用法资源甚少, 这篇日志记录我自己的一些探索.

前情提要

介绍 Cloudflare for Teams 之前, 先来看看在发布 Cloudflare for Teams 之前, Cloudflare 都提供了哪些与之相关的服务, 以及这些服务之间的区别.

1.1.1.1 DNS

这是 Cloudflare 自己的 DNS 服务1, 其宣称是世界上最快的 DNS 服务(不过在国内还是会受到一定影响). 使用起来也非常简单, 在网络配置中将 DNS 地址改为 1.1.1.1 即可.

WARP 家族

WARP 最早是 Cloudflare 为了保护用户隐私而推出的手机 APP2, 主要致力于解决两个问题:

  • 虽然用户与服务器之间的流量被加密, 但 DNS 查询往往并不是加密的, 因此存在隐私泄露风险
  • 用户与服务器之间的线路可能因为各种原因并不是最优的, 这会导致体验上的欠缺

WARP 中提供了几种不同的模式3, 用于解决上述问题:

  • 1.1.1.1 仅仅提供 DNS 查询保护功能, 解决上述问题1

  • WARP 包括了 1.1.1.1 提供的功能, 此外还利用 Cloudflare 的数据中心和协议优化提升网络体验, 实测可能会改变用户到某些服务器的网络路径, 可能对网络体验有提升

  • WARP+ 通过一种代价更高的方式提升用户的使用体验, 那就是将用户的所有流量全部接管到 Cloudflare 的数据中心, 再由这些数据中心发送到各个网站, 相当于提供了一个 VPN 服务. 因为 Cloudflare 强大的线路优化, 用户到 Cloudflare 服务器的连接体验很好(也许吧), 而 Cloudflare 数据中心到很多网站连接体验也很棒, 甚至很多网站就托管在 Cloudflare, 因此这种方式可以提高用户的上网体验

    不过, 代价如此高昂的服务必然不可能让你白嫖, 因此虽然 WARP+ 本身是免费的, 却限制了数据量, 邀请更多好友才能获得流量…

  • WARP+ Unlimited 则是 WARP+ 的付费版本, 通过可以享受 WARP+ 的所有服务并不限流量

那么这些又和 Cloudflare for Teams 有什么关系呢? 前面已经说过, Cloudflare for Teams 将团队的所有流量都接管到 Cloudflare 数据中心, 其实就相当于 WARP+ 的服务. 而 Cloudflare for Teams 对小型团队是免费的, 因此实际上相当于白嫖了 WARP+ 的服务.

NOTE: Cloudflare 接管你的所有 DNS 查询后, 也是完全有能力查看你的所有 DNS 查询记录的, 只是 Cloudflare 承诺不会侵犯或者泄露你的隐私4而已.

比较优势

普通人出国上网主要应该就是两种方式, 一种是花钱买别人搭好的代理服务, 另一种就是自己搭梯子. 前者经常要面临机场跑路的风险, 并且你的流量全部流经别人的服务器, 安全和隐私都存在一定风险. 后者则要求自己懂一些基本运维知识, 并且每逢佳节防火墙加大封禁力度的时候自建梯子可能会不稳定, 日常维护也得耗费不少精力. 此外, 这二者都不是免费的, 靠谱的机场或者线路不错的自建代理服务器往往价格不菲.

Cloudflare for Teams 可以说很好地解决了上面的一些痛点问题. 首先是数据安全性, Cloudflare 一般还是会比很多来路不明的机场主要靠谱很多的, 其次是线路稳定性, 至少到目前为止 Cloudflare 的使用体验还不错, 没有出现过长时间大规模的失联情况. 很多机场由于被无数人使用, 有的人甚至会利用机场做一些恶意爬虫等, 导致机场的服务器 IP 被标记, 极易导致你的账号被误杀, 最惨的事例是 Youtube 账号一登陆上去啥也没干就立刻被封号且很久无法解封…

此外, 教育网环境中实测通过 IPv6 连接到的是 Cloudflare 的香港节点, 无论是速度还是延迟都有极佳的表现, 实测速度在 300Mbps 以上, 延迟在 70ms 以下, 市面上能达到这一表现的机场并不多. 江苏地区通过电信 IPv6 连接到的是美国洛杉矶的节点, 速度和延迟也都差强人意. 如此优秀的服务却能给你白嫖, 难道还没有心动吗?

如何使用

Cloudflare for Teams 目前是免费开放的, 在下面的页面即可免费注册:
Web 安全网关_零信任程序访问_Cloudflare for Teams| Cloudflare中国官网 | Cloudflare

按照提示注册完成即可, 略去不表.

注册完成后可以进入 Teams [管理面板](Cloudflare | Web Performance & Security):

image-20211124230954380

在 Settings-Authentication-Login methods 中点击 Add new 添加新的认证方式, 按照提示添加完成后即可通过这些认证方式使用你的 Cloudflare for Teams 服务. 其中 One-time PIN 是最基本的方式, 发送一个含有验证码的邮件到邮箱进行验证登录. 其他方式可以按照自己的实际情况添加, 目前支持下面这些平台:

image-20211124231227082

各个平台上的客户端使用起来都非常简单, 毕竟 Cloudflare 自己也说他们的目标是让即使不熟悉 VPN 是什么的人也能轻松使用5:

WARP was built on the philosophy that even people who don’t know what “VPN” stands for should be able to still easily get the protection a VPN offers. For those of us unfortunately very familiar with traditional corporate VPNs, something better was needed. Enter our own WireGuard implementation called BoringTun.

各个平台的使用指南可以参考 Cloudflare 的官方文档:

Cloudflare WARP client · Cloudflare WARP client docs

疑难杂症

手机上使用一般不会出什么问题, 但是我在使用 macOS 和 Windows 客户端的时候遇到了不少问题, 差点让我放弃. 现将我遇到的问题记录如下:

  • 中国大陆网络无法注册设备

    使用 Cloudflare for Teams 的时候, 在完成团队登录认证之后有一个注册设备的过程, 这一步具体在进行什么工作还没有探明.

    问题就出在这个注册的步骤, 如果设备注册的时候你的设备处于中国大陆网络中, 注册将会失败, macOS 和 Windows 都遇到了这个问题. 要解决问题, 必须要将设备中所有流量全部代理到国外, 例如将设备连接到某软路由, 或者使用 VPN, 或者使用 clash 等可以创建虚拟网卡的软件接管全部流量. Windows 平台还更加麻烦, 每次启动 WARP 客户端的时候都需要注册设备, 这就导致你无法全面转向 Cloudflare for Teams 而完全放弃其他机场或者自建代理服务. 猜测可能是 Cloudflare 并不愿意让中国大陆用户使用该服务, 或者 Cloudflare 也是被制裁的对象…

    不过, Windows 平台也可以使用命令行版本的 WARP 客户端来避免每次运行时都要注册设备, 可惜命令行的操作还是麻烦了许多.

  • Windows 平台断连问题. 在 Windows 平台使用 WARP 客户端时, 偶尔会出现连接中断问题, 原因未知. 虽然重新连接并不麻烦, 但是这还是会极大影响使用体验.

  • 以 Proxy Mode 运行 WARP 时速度极慢. 具体情况将在下一节详述.

以上这些问题都极其影响使用体验, 具体原因不明, 网上找不到解决方案, 论坛里发帖也没有回复, 因此只得想办法绕过这些问题, 这才有了下一节的”奇技淫巧”.

奇技淫巧

前面已经提到国内网络环境下无法进行通过“设备注册”的问题, 也简单提了一嘴解决方案, 这一节里稍微详细地说一说.

Windows 平台下使用 Cloudflare 官方的 WARP 客户端每次运行都要重新注册设备也很麻烦, 通过一些手段可以避免该问题, 具体方法并列于此.

此外, 在国内网络生态躲进小楼, 自成一统的现状之下, 如果你使用的代理软件没有分流功能那么使用起来一定是很难受的, 很多资源加载速度会很慢, 甚至根本无法加载, 并且很多视频和图片也会因为版权原因不支持其他地区访问. 但是 WARP 作为一个仅仅用来接管所有流量保护用户隐私和安全的软件, 显然不具备也不需要具备很多国产代理软件已经被玩出花的分流功能. 因此, 为了实现网络分流, 同样需要一些稍微麻烦一点的手段.

设备注册

解决问题很简单, 只需要让设备全局处于非国内网络环境即可. 为此, 你可能首先想到的是在系统设置中配置代理, 无论是使用本机运行的代理软件作为服务器, 还是局域网中其他机器作为服务器. 遗憾的是, 使用这种方式并不能 WARP 的设备注册. 这是因为所谓“系统代理”运行的位置不够底层, 很多流量是不走所谓的“系统代理”的, 例如 Windows 上的 UWP 应用等, 都是不受系统设置里的代理配置影响的.

解决该问题最理想的方案是, 使用一台软路由, 上面运行诸如 clash 等代理软件, 将你需要注册的设备连接到软路由(被忘了把软路由的分流方式设置为全局代理), 这样你需要注册的设备就会“以为”自己完全处于外网环境中, 而完全“感受不到”代理的存在了.

要是没有软路由怎么办呢? 某些强大的代理软件早已实现了胜似软路由的功能, 基本原理是在设备上通过软件方式创建一个虚拟网卡, 将设备中所有流量全部交给虚拟网卡处理. 由于网卡运行在相当底层的位置, 因此通过这种方式就可以接管设备中的所有流量.

这方面做得比较好、使用也比较广泛的软件当推 clash, clash-core 本身有全平台支持, 且对 Windows、macOS 等平台还有好用的图形客户端, 各大机场也都有支持. 项目地址如下:

注意 clash-core 本身有开源版和闭源的 Premium 两个版本, 只有 Premium 版本才支持虚拟网卡功能. 相应的, 下游的 clashX 也分为两个版本, 只有闭源的 [clashX Pro](App Center) 才支持使用虚拟网卡的方式进行全局代理.

关于全局代理的使用方法, clashX Pro 使用比较简单, 打开 Enhanced Mode(增强模式)即刻. Windows 平台的 CFW 稍微麻烦一点, 具体操作参考文档:

TUN 模式 | Clash for Windows (lbyczf.com)

Win客户端

绕过 Windows 平台每次打开 WARP Client 都要重新注册设备问题的方法非常简单粗暴, 那就是不用 Cloudflare 的官方客户端. WARP 本身是基于 wireguard 的, 后者是一个开源的代理软件, 目前是可以通过 wireguard 客户端连接到 Cloudflare 的数据中心使用 for Teams 服务的. wireguard 主页如下:

https://www.wireguard.com

要使用 wireguard 连接到 Cloudflare, 只需要获取一份配置文件即可. 一份最基本的配置文件如下:

1
2
3
4
5
6
7
8
9
10
11
[Interface]
PrivateKey = your-private-key-here
ListenPort = 12345
Address = 172.16.0.2/32, fd01:5ca1:ab1e:819c:1099:903f:1f44:84e8/128
DNS = 1.1.1.1
MTU = 1280

[Peer]
PublicKey = your-public-key-here
AllowedIPs = 0.0.0.0/1, 128.0.0.0/1, ::/1, 8000::/1
Endpoint = [2606:4700:100::a29f:c107]:2408

其中最关键的是这三条信息:

  • 本机私钥(PrivateKey)
  • 远端公钥(PublicKey)
  • 远端计算机名(Endpoint)

其余就是一些诸如端口等信息, 不重要.

如何才能获得上述三个重要信息? 这回需要用到一个更加繁琐方法. 大致思路是这样, 在安卓系统中安装 WARP Client for Android, 完成团队认证之后该设备中就会生成连接信息. 此时我们只需要找到连接信息所在位置并 pull 下来即可.

但是安卓 5.0 之后想获取这一配置信息需要设备拥有 root 权限, 而一般手机是没有开放 root 权限的. 为此, 比较保险的方法是下载 Android Studio, 在其中安装一个安卓虚拟机, 在虚拟机中完成所有操作.

具体操作可以参考这篇日志, 讲得比较详细:

Cloudflare for Teams Wireguard Config (parkercs.tech)

如果文字教程不够清晰的话可以参考视频:

OpenWRT - Setup Cloudflare WARP+ VPN on OpenWRT (Wireguard) - YouTube

完成日志中的所有步骤之后你应该会得到一个 com.cloudflare.onedotonedotonedotone_preferences.xml 文件, 其中有你到 Cloudflare 的连接的所有相关信息. 在文件中搜索很容易发现我们所要的几个关键信息:

  • 本机私钥: warp_private_key
  • 远端公钥: peers -> public_key
  • 远端计算名: peers -> endpoint

其中 endpoint 一般包含两个地址, 一个 IPv4 和一个 IPv6. 直接用 Cloudflare 的域名也可以: engage.cloudflare.com:2408 . 三种方式都可以尝试一下, 选择体验最好的来.

拿到这些信息之后就是用这些信息填入 wireguard 配置模版了.

全部配置完成之后可以连接测试一下.

分流策略

按照前面的步骤操作下来, 你应该已经能比较顺畅地在各个平台上使用 Cloudflare for Teams了. 但是由于其不具备分流功能, 因此某些场景下使用起来还是有诸多不便. 好在有多种方式可以实现分流.

一种比较简单直白的方式是修改系统路由表, 将所有国内 IP 地址路由到原来的物理网卡, 将所有国外 IP 路由到软件创建的虚拟网卡. 打开VPN 连接的时候将这些信息写入到路由表, 断开连接的时候再删除即可. 不知道哪些 IP 在国内哪些在国外? 早就有做好的项目了:

lmc999/auto-add-routes: China Route for VPN (github.com)

这个项目使用 .bat 脚本的方式进行路由表的写删, 为了能在 VPN 连接/断开的时候自动执行脚本使用了一个基于 wireguard 的 VPN 客户端 TUNsafe. 跟着项目里的说明操作就好. 相信有了前面的经验操作起来应该很容易.

这种方法好处是简单直接, 但是也会遇到不少问题. 首先一个根本性的问题是, 这种分流方式是根据 IP 而不是域名来的, 某些网站提供海外节点(例如B站), 而你的 DNS 是 Cloudflare 提供的海外 DNS. 这就导致你的 DNS 请求实际上是从海外发出的, 自然也就得到的是网站的海外节点的 IP, 这样这个本该直连网站就自然而然地被分配到使用代理访问了. 这可能会导致某些网站加载速度变慢、版权原因无法播放(某些资源只在大陆地区有版权, 海外版权在其他服务商手里)等问题.

其次, IP 表难免有错漏, 因此可能会造成误分流. 此时你想自己添加点规则就很麻烦了, 你首先需要知道目标网站的 IP, 有的具有 CDN 的网站可能还得知道其所有网段的地址, 相当麻烦.

以上两个问题都导致某些情况下你只能断开 VPN 连接才能正常使用服务.

另一种方案是使用 Overtrue 实现基于域名分流. 这种方法相比基于 IP 的分流就灵活了很多, 有需求要添加规则也方便很多. 具体使用方法可以参考:

[overture] 无污染的智能 DNS 折腾记 #4 - 神代綺凛の随波逐流 (moe.best)

当然, 如果你有运行着 openwrt 等系统的软路由, 还可以在路由器上运行 wireguard 并配置代理规则, 将所有设备的流量全部接管, 对于设备较多, 尤其是某些设备不支持复杂配置的情况而言非常有用.

良心结语

  • “免费的就是最贵的”, 为了优雅地白嫖 Cloudflare for Teams 的优质线路, 你需要懂得一些网络相关知识, 还需要花费不少时间用于排除问题, 不过折腾本身也是一种乐趣.

  • 上一节介绍的方法并非 Cloudflare 官方支持的使用方法, 可能会遇到未知问题, 且后续随时可能失去兼容.

  • Cloudflare for Teams 作为出国隧道目前还算好用, 后续会变成什么样还是未知数, 且用且珍惜.

  • Cloudflare for Teams 的功能远不止于此, 更多用法可以自行探索.

使用 Cloudflare for Teams 的过程中遇到的问题不少, 解决方案也都比较复杂, 不少问题在网上都没有解答甚至没人提过, 出现错漏在所难免, 且篇幅所限, 很多具体操作没有展开演示. 如果发现任何错误, 或是有更好的解决方案, 欢迎联系我一起交流.

参考资料

[1] Introducing DNS Resolver, 1.1.1.1 (not a joke) (cloudflare.com)

[2] WARP is here (sorry it took so long) (cloudflare.com)

[3] What is the difference between WARP, WARP+, and WARP+ Unlimited? – 1.1.1.1 (cloudflarewarp.com)

[4] Announcing the Results of the 1.1.1.1 Public DNS Resolver Privacy Examination (cloudflare.com)

[5] Introducing WARP for Desktop and Cloudflare for Teams