土豆不好吃

使用Cloudflare Zero Trust创建大内网

文章目录[显示]
这篇文章在 2023年04月21日20:51:15 更新了哦~

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

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

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

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

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

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

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


暴露家庭内网

获取team domain

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

配置网络协议

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

创建WARP 设备注册权限

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

创建 WARP Profile

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

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

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

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

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

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

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

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

配置客户端连接

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

进行邮件验证

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

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


创建大内网

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

创建profile

同样创建一个新的profile

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

注册设备

安装warp-cli,然后

warp-cli teams-enroll bennythink

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

然后在终端中:

warp-cli teams-enroll-token com.cloudflare.warp://bennythink.cloudflareaccess.com/auth?token=
警告:
如果你使用的是zsh,记得给那段token上用引号包起来 "your-token-with?weird/=+stuff"或者切换到bash

连接设备

λ maria-pl ~ → warp-cli status
Status update: Disconnected. Reason: Manual Disconnection
Success

λ maria-pl ~ → warp-cli connect
Success

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

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

测试内网互联

直接ssh过去试试看

λ maria-pl ~ → nc -v 100.96.0.14 22
Connection to 100.96.0.14 22 port [tcp/ssh] succeeded!
SSH-2.0-OpenSSH_8.9p1 Ubuntu-3
^C

λ maria-pl ~ → 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])?

iperf3测试

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

延迟测试

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

如何使用自定义的网段

如果不喜欢上面的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

warp-cli get-virtual-networks
warp-cli set-virtual-network UUID
warp-cli connect

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

其他

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


文章版权归原作者所有丨本站默认采用CC-BY-NC-SA 4.0协议进行授权|
转载必须包含本声明,并以超链接形式注明原作者和本文原始地址:
https://dmesg.app/cf-zero-trust.html
退出移动版