创建大内网是一件非常重要的事情。一旦有了安全的内网环境之后,我的服务器之间就可以使用私有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 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://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