创建大内网是一件非常重要的事情。一旦有了安全的内网环境之后,我的服务器之间就可以使用私有 IP 进行通信,不用再考虑这个协议是否适合暴露在公网上、是否会被 MITM 等问题了。管他什么协议的,telnet 我都照样跑!
通常来说,我是使用 WireGuard 来创建内网的。选择一个机器作为 “服务器”,其他的节点作为客户端加进来就好了。这也是业界最为成熟的方案了
但是这样做仍有一些限制和缺陷,比如说:
- 如何暴露整个家庭内网,如
192.168.7.0/24
给出门在外的我,家里的每一个设备都要通过 WireGuard 加进来吗,或者写奇奇怪怪的 iptables 规则? - 所有的数据要通过 “服务器” 中转,两个美国的服务器明明直接就能沟通,50ms 解决,如果 WG 服务器在亚洲,那么就基本上 300ms 左右了
- 穷到买不起服务器,没有公网 IP
在这种情况下,最好的办法就是用 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 的规则,规则包括用户能否断开,自动重连等,其中最重要的是路由规则。
如图,在此我配置的[email protected]
这个用户的规则
Split tunnel 用来配置如何分发流量,分为两种模式,include 和 exclude,有点像黑名单白名单的概念。
- 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 表示法
同时在 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
在你的浏览器上打开链接,输入邮箱[email protected]
验证,但是并没有任何信息告诉你怎么打开终端里的 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 homewarp–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://help.teams.cloudflare.com/
https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/
https://developers.cloudflare.com/cloudflare-one/tutorials/warp-to-tunnel/