使用 Cloudflare Zero Trust 创建大内网

创建大内网是一件非常重要的事情。一旦有了安全的内网环境之后,我的服务器之间就可以使用私有 IP 进行通信,不用再考虑这个协议是否适合暴露在公网上、是否会被 MITM 等问题了。管他什么协议的,telnet 我都照样跑!

通常来说,我是使用 WireGuard 来创建内网的。选择一个机器作为 “服务器”,其他的节点作为客户端加进来就好了。这也是业界最为成熟的方案了

但是这样做仍有一些限制和缺陷,比如说:

  • 如何暴露整个家庭内网,如192.168.7.0/24 给出门在外的我,家里的每一个设备都要通过 WireGuard 加进来吗,或者写奇奇怪怪的 iptables 规则?
  • 所有的数据要通过 “服务器” 中转,两个美国的服务器明明直接就能沟通,50ms 解决,如果 WG 服务器在亚洲,那么就基本上 300ms 左右了
  • 穷到买不起服务器,没有公网 IP

在这种情况下,最好的办法就是用 Cloudflare Zero Trust 中的 tunnel 啦!

之前简单的提过我已经把所有的 web 服务都通过 argo tunnel 暴露了,拓扑图大概是这样,从 Cloudflare 那边偷过来的:

2023040101321423

在我的服务器上安装cloudflared,然后添加 Public Hostname,所有的访问直接从 Cloudflare 的网络来。安全且环保!

那么 Cloudflare tunnel 还有那些有趣的用法呢?先从暴露整个家庭内网来说吧!同样的道理,我们需要在家里运行一个 cloudflared connector,然后其他终端设备通过 WARP 连接到 Cloudflare,然后把整个网络暴露给终端设备,拓扑图如下:

2023040101323051


暴露家庭内网

获取 team domain

打开 Cloudflare Zero Trust,设置里就可以看到你的 team name,我这里就是bennythink

202304010132311

配置网络协议

Settings-network,找到 proxy,把 TCP、UDP、ICMP 和 WARP to WARP 都打开(这个后续要用)

2023040101323257

创建 WARP 设备注册权限

首先要定义如何注册设备,简单的来说通过邮箱就好了。比如说一个公司的人,用公司后缀的邮箱连接到同一个内网。在 Zero Trust 的面板中,Settings – WARP client – Dvice enrollment permission

2023040101323341

2023040101323478

创建 WARP Profile

所谓 Profile,就是定义什么用户使用什么样的 WARP 的规则,规则包括用户能否断开,自动重连等,其中最重要的是路由规则。

如图,在此我配置的home@dmesg.app 这个用户的规则

2023040101323579

Split tunnel 用来配置如何分发流量,分为两种模式,include 和 exclude,有点像黑名单白名单的概念。

2023040101323644

  • Include,就像 WireGuard allowIP配置为192.168.6.0/24一样,只有这个网段的流量会走 WireGuard,其他流量会直接出去,不走 cloudflare
  • Exclude,就是所有流量都要走 cloudflare,因此192.168.7.0/24走了 cloudflare 所以可以访问,列表中的直接连接

说人话的话,比如你在外面,要访问家里192.168.7.0/24,并且所有其他流量要走 cloudflare,那么你要用 exclude 模式;

你在外面,要访问家里的192.168.7.0/24其他流量直接出 以方便真人快打,那么就要用 include 模式。

这里我就选择 include 模式,因此上图切换到 include,然后添加 IP 段,CIDR 表示法

2023040101323785

同时在 tunnel 的 Private Network 也要创建一样的 CIDR

2023040101323865

看 cloudflared 日志可以看到已经自动更新了配置

2023040101323951

配置客户端连接

客户端需要下载 WARP,然后  Login to Cloudflare Zero Trust,输入 team name

2023040101323984

进行邮件验证

2023040101324032

然后你的 warp 就会接收到新的配置,连接起来,就会发现192.168.7.0/24已经通啦

2023040101324165

并且路由器的管理界面是打得开的

2023040101325018


创建大内网

拓扑图如下,所有同一个 organization(team)的 WARP 都有一个独立的内网,可以安全进行数据交换。还记得上面开的 TCP、UDP、WARP to WRAP 吗?这里用到的就是 WARP to WARP

2023040101325762

创建 profile

同样创建一个新的 profile

2023040101330798

Split tunnel 的原理相信大家已经懂了,简单起见,同样选择 include,只不过 IP 段写100.64.0.0/10,这个是 Cloudflare 默认的 Virtual Network,使用了 WARP 的设备会被分配到这个 IP 段里。这里一共有 400 多万个可用的 IP,沃尔玛员工人手 2 个 WARP,或者克罗地亚人一人一个都足够

2023040101331898

注册设备

安装 warp-cli,然后

warpcli teamsenroll bennythink

在你的浏览器上打开链接,输入邮箱wg@dmesg.app验证,但是并没有任何信息告诉你怎么打开终端里的 warp-cli,那怎么办呢?别怕,打开 F12,找到 Open Cloudflare WARP 那个按钮的元素,找到onclick事件,复制从com.cloudflare.warp开始的信息到结尾的单引号

2023040101333518

然后在终端中:

warpcli teamsenrolltoken com.cloudflare.warp://bennythink.cloudflareaccess.com/auth?token=

警告:
如果你使用的是 zsh,记得给那段 token 上用引号包起来 “your-token-with?weird/=+stuff” 或者切换到 bash

连接设备

λ mariapl ~ warpcli status
Status update: Disconnected. Reason: Manual Disconnection
Success

λ mariapl ~ warpcli connect
Success

在 Zero Trust – My team – Devices 中就可以看到你的这个设备的 IP 地址了!

2023040101352637

同理,连接另外一个设备,同样的邮箱就可以。

测试内网互联

直接 ssh 过去试试看

λ mariapl ~ nc v 100.96.0.14 22
Connection to 100.96.0.14 22 port [tcp/ssh] succeeded!
SSH2.0OpenSSH_8.9p1 Ubuntu3
^C

 λ mariapl ~ ssh 100.96.0.14
The authenticity of host ‘100.96.0.14 (100.96.0.14)’ can‘t be established.
ED25519 key fingerprint is SHA256:Gffeu3+72Z9pwZDawOHGSN7M2JxrbBub1hZoueKGJ1o.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])?

2023040101352719

iperf3 测试

速度也还不错,本来带宽也是 100Mbps

2023040101352925

延迟测试

延迟略有增大,可能是 peer 连接到了不同的数据中心导致的。但是肯定不会出现美国 – 日本 – 美国这种绕圈圈的模式了。

202304010135315

如何使用自定义的网段

如果不喜欢上面的100.96.0.0/10网段,怎么切换到自己的网段呢,比如192.168.6.0/24

根据文档来说,似乎是可以通过创建自己的 Virtual network(还不能在网页上创建),然后 WARP 连接的时候选择这个 network,然后 IP 就应该是你定义的而不是100.96之类的了

cloudflared tunnel vnet add private
cloudflared tunnel route ip add vnet private 192.168.89.0/24 home

 warpcli getvirtualnetworks
warpcli setvirtualnetwork UUID
warpcli connect

但是我测试的时候,无论是 CLI 还是 macOS WARP,即使选择了新建的网络,网页上看到的 IP 也始终是100.96,不知道为何,可能是他们的 bug

2023040101354065

其他

Zero Trust 还有很多好玩的玩法,比如可以给不同用户配置不同的网络访问规则,私有 DNS,可控网络(就是在家里连到 VPN,在公司直接走内网,不是根据 SSID 判断),以及大家都爱的中转梯子等等玩法。有空可以再探索探索。

Cloudflare 的 WARP 直接用起来也不错,比如在公司、外面的公共 Wi-Fi,我都是直接打开的,体验非常好,在不需要换 IP 的情况下,可比买的那个 Surfshark VPN 好多了

再次感叹,Cloudflare 真是一家伟大的公司。Cloudflare 的使命是帮助建立一个更好的互联网

https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/private-net/create-private-networks/

https://help.teams.cloudflare.com/

https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/

https://developers.cloudflare.com/cloudflare-one/tutorials/warp-to-tunnel/

https://dash.cloudflare.com/argotunnel

Related Post

发表回复