入手极空间 Z4Pro 快两个周了,使用体验文章还得再等一等,多一些深度体验的时间。到目前来看,还是很满意的。
虽然演示里用上 NAS 来运行 Docker ,实际上即使没有 NAS 设备,只要网络中存在任何可以运行 ZTM 组件的设备,都可以实现远程访问。
今天来说说极空间的远程访问功能,产品页面对远程访问的描述是:
让极空间真正成为你家庭中的网络设备控制中心:
- 无需公网 IP 就可以便捷访问家中路由器、Docker 和智能家居
- 不用学习网络知识也可以以轻松使用,快速添加
- 自定义名称及颜色,方便查找与收藏,配合容器使用,扩展丰富功能
比如借助该功能可以方便地管理家中的软路由,非常适合没有公网 IP 的用户。
然后就可以点击新添加的链接,在极空间的窗口内访问 OpenWrt 的 web 后台了。
细心的你可能会注意到它只能支持 HTTP 协议(官方的功能介绍),只能通过极空间窗口访问,并且只能为管理员账号下使用该功能,灵活性大打折扣。比如远程访问家中的 Windows 设备( Windows 的远程桌面协议 RDP );或者需要 ssh 远程访问 HomeLab 虚拟机。
这些极空间的远程访问就无能为力了,这里就要用到 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 Agent ,在成功与 Hub 建立隧道后,就可以发现其他 Agent 注册的服务。然后就可以通过创建端口将发现的服务映射到本地。
接下来就开始我们的演示!
在演示中我们将会用台有公网 IP 的云主机,可以购买云厂商 99 元的主机,通常都有 3-4M 的带宽,用来转发 1080P 甚至低码流的 4K 也没压力。
在极空间中,我们是使用 Docker 来运行 ZTM Agent 。Agent 占用的资源非常低,我为容器分配 0.5 核的 CPU 和 128M 的内存,如果流量不大可以分配更少的资源。
首先 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
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
访问极空间 Docker ,在仓库中搜索并下载 addozhang/ztm
镜像。若遇到镜像下载问题,可以从 这里 下载镜像 tar 文件并上传到极空间中,然后在 本地镜像中选择从极空间导入。
找到已经下载好的镜像,创建容器。
把前面颁发的证书 JSON 文件上传到极空间中,比如保存到存储的 /Docker/ZTM
目录中,然后在容器的文件夹路径中添加文件路径,装载到容器的 /tmp/ztm
中。
ZTM Agent 提供了 web 界面,为了方便使用可以将容器的 7777
端口映射到本地。
同样,为了便于容器外访问,将环境中的 LISTEN
修改为 0.0.0.0:7777
,其他保持默认。
点击应用创建容器。
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 的连接。
在浏览器中打开 http://<极空间 IP>:7777
,如果是从外部访问可以使用极空间的远程访问功能添加新的连接:使用 http://127.0.0.1:7777
即可。
在 Meshes 标签页中点击 Join。
填入信息,并点击保存:
my-hub
home.json
zspace
保存后在 Meshes 标签页中可以看到刚添加的 Hub ,以及其状态。如果状态不是 Connected 请检查颁发的 JSON 文件的内容。
注:点击 Hub 右侧的三个点,可以修改或者断开连接。
想要从外部访问内网的服务,我们需要在内网的 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
可以注销服务。
在 Services 标签页中,点击 Create。
填入服务的相关信息,然后点击 Save 保存:
openwrt-web
TCP
192.168.11.1
80
使用同样的方式创建 win-11
服务:
win-11
TCP
192.168.11.184
3389
到此,我们已经完成了家庭网络服务的注册。要想从外部网络访问家庭网的服务,我们需要在外网的设备进行类似的操作。
首先是安装 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
重复同样的步骤,使用前面颁发的证书 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
服务的映射也是两种方式:命令行和 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
可以删除端口。
在 Services 标签页中找到发现的服务,点击服务右上角的按钮。
在弹窗中输入端口的信息。
127.0.0.1
;如果要提供给局域网的其他设备访问,输入当前设备的局域网地址。openwrt-web
服务映射到 18080
端口。同样的方式,映射 win-11
服务到本地 13389
端口。
在 Local Ports 标签中可以看到创建的两个本地端口。
在浏览器中打开 http://localhost:18080
可以成功访问远程的 OpenWrt 。
使用 macOS 平台上的软件 Microsoft Remote Desktop 来访问远程桌面。
添加一台 PC ,地址为 127.0.0.1:13389
,账号为 Windows 设备的登录账号。
登录完成后,就可以远程来操作 Windows 设备了。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.