![使用 ZTM 增强极空间 NAS 的远程访问能力](https://atbug.oss-cn-hangzhou.aliyuncs.com/2024/06/13/pexels-kdry-yldz-1193591313-26065559.jpg)
使用 ZTM 增强极空间 NAS 的远程访问能力
入手极空间 Z4Pro 快两个周了,使用体验文章还得再等一等,多一些深度体验的时间。到目前来看,还是很满意的。
背景
今天这篇来说说极空间的远程访问功能,产品页面对远程访问的描述是:
让极空间真正成为你家庭中的网络设备控制中心:
- 无需公网 IP 就可以便捷访问家中路由器、Docker 和智能家居
- 不用学习网络知识也可以以轻松使用,快速添加
- 自定义名称及颜色,方便查找与收藏,配合容器使用,扩展丰富功能
比如借助该功能可以方便地管理家中的软路由,非常适合没有公网 IP 的用户。
然后就可以点击新添加的链接,在极空间的窗口内访问 OpenWrt 的 web 后台了。
细心的你可能会注意到它只能支持 HTTP 协议(官方的功能介绍),只能通过极空间窗口访问,并且只能为管理员账号下使用该功能,灵活性大打折扣。比如远程访问家中的 Windows 设备(Windows 的远程桌面协议 RDP);或者需要 ssh 远程访问 HomeLab 虚拟机。
这些极空间的远程访问就无能为力了,这里就要用到 ZTM 了。
关于 ZTM
ZTM(Zero Trust Mesh)是一款开源的网络基础设施软件。它基于 HTTP/2 隧道构建,可以在任何类型的 IP 网络上运行,例如局域网、容器化网络和互联网等。
ZTM 可以在各种环境中使用,从连接家庭和工作场所的 2 节点个人网络,到连接全球办公室和分支机构的 10,000 节点企业网络。
ZTM 可以支持多种 CPU 架构,如 x86, ARM, MIPS, RISC-V, LoongArch 等,以及多种操作系统,如 Linux, Windows, macOS, FreeBSD, Android。
ZTM 包含了几个核心组件:
- 流量转发程序 ZTM Agent:部署在要打通的网络,可以部署在个人计算机、服务器、边缘或者端侧设备中。用于连接 ZTM Hub 发起加密隧道,将设备的流量安全地转发到 Hub。
- 流量转发集群 ZTM Hub:与每个 Agent 建立加密隧道,转发来自 Agent 的请求,实现多点接入和高可用性。
- 证书管理服务器 ZTM CA:证书管理服务器。用于签发证书、吊销证书以及验证 Agent 用于访问的 TLS 证书。
方案
在远程访问中,我们需要在极空间中安装 ZTM Agent。其主动与部署在公有云的 ZTM Hub 建立加密隧道,然后将家庭网络中的服务注册到 Hub。
位于另一个网络中的电脑或者任意服务器,同样安装 ZTM Agent,在成功与 Hub 建立隧道后,就可以发现其他 Agent 注册的服务。然后就可以通过创建端口将发现的服务映射到本地。
接下来就开始我们的演示!
演示
在演示中我们将会用台有公网 IP 的云主机,可以购买云厂商 99 元的主机,通常都有 3-4M 的带宽,用来转发 1080P 甚至低码流的 4K 也没压力。
在极空间中,我们是使用 Docker 来运行 ZTM Agent。Agent 占用的资源非常低,我为容器分配 0.5 核的 CPU 和 128M 的内存,如果流量不大可以分配更少的资源。
1. 运行 ZTM Hub
首先 ssh 到云主机,通过 ZTM CLI 安装 ZTM CA 和 Hub。 当前最新的 ZTM 为 0.0.3 版本,通过下面的命令安装 CLI。
ZTM_VERSION=0.0.3
curl -sL https://github.com/flomesh-io/ztm/releases/download/v${ZTM_VERSION}/ztm-aio-v${ZTM_VERSION}-generic_linux-x86_64.tar.gz | tar -zxf -
sudo cp bin/ztm /usr/local/bin/ztm
通过命令 ztm help
可以查看 CLI 的使用方法。
通过下面的命令启动 ZTM 的 CA 服务,非常简单。
sudo ztm start ca --listen 127.0.0.1:9999
接下来是启动 Hub,默认监听在 8888
端口,同样可以通过参数 --listen
来修改,这里我们使用默认值。
sudo ztm start hub
2. 为 Agent 颁发证书
Agent 与 Hub 建立 HTTP/2 的加密隧道,使用 mTLS 进行双向认证。使用 CA 服务为 Agent 颁发证书,格式为 ztm invite USERNAME --bootstrap HUB_PUBLIC_IP:PORT
,这里我们为两个 Agent 颁发证书。将证书保存到 json
文件中并下载到本地,后面会用到。
注意:json 文件中包含了公钥和密钥,请妥善保存。如若遗失,通过 ztm evict USERNAME
吊销证书,然后颁发新的证书。
ztm invite home --bootstrap 13.229.223.113:8888 --output > home.json
ztm invite macbook --bootstrap 13.229.223.113:8888 --output > macbook.json
3. 极空间 Agent 部署
访问极空间 Docker,在仓库中搜索并下载 addozhang/ztm
镜像。若遇到镜像下载问题,可以从 这里 下载镜像 tar 文件并上传到极空间中,然后在 本地镜像中选择从极空间导入。
找到已经下载好的镜像,创建容器。
把前面颁发的证书 JSON 文件上传到极空间中,比如保存到存储的 /Docker/ZTM
目录中,然后在容器的文件夹路径中添加文件路径,装载到容器的 /tmp/ztm
中。
ZTM Agent 提供了 web 界面,为了方便使用可以将容器的 7777
端口映射到本地。
同样,为了便于容器外访问,将环境中的 LISTEN
修改为 0.0.0.0:7777
,其他保持默认。
点击应用创建容器。
4. Agent 接入 Hub
Agent 启动之后,最重要的一步就是将其连接到 ZTM Hub。这里有两种方法:命令行和 Web 界面。
方法一:使用命令行
点击容器的 SSH 按钮,在弹窗中用户输入 ztm
(ZTM 的运行不需要任何特权)。
在命令行窗口中执行下面的命令,与 Hub 建立安全隧道,命令格式 ztm join MESH_NAME --as AGENT_NAME --permit JSON_FILE
。
ztm join my-hub --as zspace --permit /tmp/ztm/home.json
可通过命令 ztm get mesh
查看隧道状态。
注:通过 ztm left MESH_NAME
可以断开与 Hub 的连接。
方法二:使用 Web 界面
在浏览器中打开 http://<极空间 IP>:7777
,如果是从外部访问可以使用极空间的远程访问功能添加新的连接:使用 http://127.0.0.1:7777
即可。
在 Meshes 标签页中点击 Join。
填入信息,并点击保存:
- Mesh 输入你想要的名字,比如
my-hub
- Permit 中点击 + 选择前面颁发的
home.json
- Join AS 输入你想要的名字,比如
zspace
保存后在 Meshes 标签页中可以看到刚添加的 Hub,以及其状态。如果状态不是 Connected 请检查颁发的 JSON 文件的内容。
注:点击 Hub 右侧的三个点,可以修改或者断开连接。
5. 注册服务
想要从外部访问内网的服务,我们需要在内网的 Agent 上将服务注册到 Hub,即创建两个服务。同样可以使用命令行,或者 Web 界面来操作。
方法一:使用命令行
命令格式为 ztm create service PROTOCOL/SERVICE_NAME --host SERVICE_IP --port SERVICE_PORT
。这里我们准备了两个服务:OpenWrt 的 Web 后面和一台开启了远程访问的 Windows 电脑。
ztm create service tcp/openwrt-web --host 192.168.11.1 --port 80
ztm create service tcp/win-11 --host 192.168.11.184 --port 3389
使用命令 ztm get service
可以查看注册的服务。
注:通过 ztm delete service PROTOCOL/SERVICE_NAME
可以注销服务。
方法二:使用 Web 界面
在 Services 标签页中,点击 Create。
填入服务的相关信息,然后点击 Save 保存:
- Service 服务名,比如
openwrt-web
- Protocol 协议,选择服务对应的协议
TCP
- Host 服务地址,这里是 OpenWrt 的地址
192.168.11.1
- Port服务端口, 这里是
80
使用同样的方式创建 win-11
服务:
- Service 服务名
win-11
- Protocol 协议
TCP
- Host 服务地址
192.168.11.184
- Port服务端口
3389
到此,我们已经完成了家庭网络服务的注册。要想从外部网络访问家庭网的服务,我们需要在外网的设备进行类似的操作。
6. 外网 Agent 部署
首先是安装 ZTM,可以从 这里 下载对应平台的 CLI,在 mac 平台有支持 x86 和 M 芯片的 CLI,win 平台上也有对应的 exe 下载。
我在外网的设备是一台 MacBook,下载的是 arm64 的 CLI。
curl -sL https://github.com/flomesh-io/ztm/releases/download/v0.0.3/ztm-aio-v0.0.3-macos-arm64.tar.gz | tar -zxf -
sudo cp bin/ztm /usr/local/bin/ztm
安装好 CLI 之后,执行命令启动 Agent,会自动加入系统服务。
sudo ztm start agent
7. Agent 接入 Hub
重复同样的步骤,使用前面颁发的证书 macbook.json
与 Hub 建立隧道。可以使用命令行或者 Web 界面(http://localhost:7777)来操作。这里使用命令行来完成,Web 界面的操作可以参考前面的操作。
ztm join my-hub --as macbook --permit macbook.json
检查隧道状态。
ztm get mesh
NAME JOINED AS USER HUBS STATUS
my-hub macbook macbook 13.229.223.113:8888 Connected
8. 映射服务到本地
服务的映射也是两种方式:命令行和 Web 界面。
方法一:使用命令行
通过下面命令可以查看 Hub 上注册的服务。
ztm get service
NAME ENDPOINTS
tcp/openwrt-web 1
tcp/win-11 1
服务的映射是通过创建一个本地端口来实现的,格式为 ztm create port LAN_IP/PROTOCOL/PORT --service PROTOCL/NAME
。
ztm create port 127.0.0.1/tcp/18080 --service tcp/openwrt-web
ztm create port 127.0.0.1/tcp/13389 --service tcp/win-11
检查创建的端口。
ztm get port
NAME ENDPOINT SERVICE
127.0.0.1/tcp/18080 macbook tcp/openwrt-web
127.0.0.1/tcp/13389 macbook tcp/win-11
注:通过 ztm delete port LAN_IP/PROTOCOL/PORT
可以删除端口。
方法二:使用 Web 界面
在 Services 标签页中找到发现的服务,点击服务右上角的按钮。
在弹窗中输入端口的信息。
- IP 服务的映射地址,如果仅提供当前设备访问,选择
127.0.0.1
;如果要提供给局域网的其他设备访问,输入当前设备的局域网地址。 - Port 服务的映射端口,不能与其他端口冲突,这里我们将
openwrt-web
服务映射到18080
端口。
同样的方式,映射 win-11
服务到本地 13389
端口。
在 Local Ports 标签中可以看到创建的两个本地端口。
9. 测试
远程访问 OpenWrt
在浏览器中打开 http://localhost:18080
可以成功访问远程的 OpenWrt。
远程访问 Windows 设备
使用 macOS 平台上的软件 Microsoft Remote Desktop 来访问远程桌面。
添加一台 PC,地址为 127.0.0.1:13389
,账号为 Windows 设备的登录账号。
登录完成后,就可以远程来操作 Windows 设备了。
总结
在本次演示中,展示了如何通过 ZTM 增强极空间 NAS 的远程访问功能。演示中利用了两个服务:Web 服务和 Windows 远程桌面,来展示 ZTM 对多种协议的支持。
即使没有 NAS 设备,只要网络中存在任何可以运行 ZTM Agent 的设备,都可以实现远程访问。ZTM 支持所有基于 TCP 或 UDP 的协议,确保更广泛的应用场景和更高的兼容性。
后面我将会分享更多的使用场景,还有极空间的深度体验,敬请期待。