一招 ZTM,轻松搞定远程访问(如 NAS SMB、OpenWrt、Windows)

185 天前
 hanfengzxh

入手极空间 Z4Pro 快两个周了,使用体验文章还得再等一等,多一些深度体验的时间。到目前来看,还是很满意的。

虽然演示里用上 NAS 来运行 Docker ,实际上即使没有 NAS 设备,只要网络中存在任何可以运行 ZTM 组件的设备,都可以实现远程访问。

背景

今天来说说极空间的远程访问功能,产品页面对远程访问的描述是:

让极空间真正成为你家庭中的网络设备控制中心:

  • 无需公网 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 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

填入信息,并点击保存:

保存后在 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 保存:

使用同样的方式创建 win-11 服务:

到此,我们已经完成了家庭网络服务的注册。要想从外部网络访问家庭网的服务,我们需要在外网的设备进行类似的操作。

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 标签页中找到发现的服务,点击服务右上角的按钮。

在弹窗中输入端口的信息。

同样的方式,映射 win-11 服务到本地 13389 端口。

Local Ports 标签中可以看到创建的两个本地端口。

9. 测试

远程访问 OpenWrt

在浏览器中打开 http://localhost:18080 可以成功访问远程的 OpenWrt 。

远程访问 Windows 设备

使用 macOS 平台上的软件 Microsoft Remote Desktop 来访问远程桌面。

添加一台 PC ,地址为 127.0.0.1:13389,账号为 Windows 设备的登录账号。

登录完成后,就可以远程来操作 Windows 设备了。

2577 次点击
所在节点    NAS
36 条回复
gray0128
181 天前
请问 nas smb 怎么配置? 配 tcp ,端口 139 、445 吗?
hanfengzxh
181 天前
@gray0128 smb 的端口是 445 ,smb 的话可参考 https://mp.weixin.qq.com/s/uIwAiyfRP5Yp_U0G7gyBzg
hanfengzxh
181 天前
@gray0128 agent 的驱动加上参数 --listen=0.0.0.0:7777 ,因为默认是绑定在 127.0.0.1:7777 上的。
hanfengzxh
181 天前
@gray0128 看上面容器环境变量的设置
yafoo
176 天前
ztm-aio-v0.0.4-win-x86_64.zip 这个包怎么用?打开闪一下就没了,win10 系统。能在 windows 上直接创建 hub 不?
yafoo
175 天前
在 debian 上,hub 也没有部署成功啊,ztm: Connection Refused
hanfengzxh
173 天前
@yafoo 在 debian 上怎么部署的?
yafoo
171 天前
@hanfengzxh docker 里的 debian 。直接下载的 bin 文件,然后 ztm 命令启动 ca hub ,然后 ztm log 显示 Connection Refused
yafoo
171 天前
@yafoo win10 上直接 bin 命令,提示说不支持平台
hanfengzxh
171 天前
@yafoo debian 镜像里好像是没有 systemd 的,不能直接 ztm start xxx 命令,得换成 ztm run xxx 。

ca:ztm run ca --listen '127.0.0.1:9999' --database '/root/ztm-ca.db'
hub:ztm run hub --listen '0.0.0.0:8888' --ca 'localhost:9999'
agent:ztm run agent --listen '127.0.0.1:7777' --database '/root/ztm.db'
hanfengzxh
171 天前
yafoo
170 天前
@hanfengzxh 明白了,windows 上我也是用的 start 命令,换成 run 好了,谢谢
yafoo
170 天前
@hanfengzxh ca 服务的端口要不要开放?
hanfengzxh
170 天前
@yafoo ca 服务都是由 hub 本地调用,一般不用开放,绑定到 127.0.0.1 就行。
gray0128
146 天前
0.1.0 发布了,请问有教程更新吗?
waringid
144 天前
刚熟悉 0.0.4 版本的应用逻辑,换成 0.1.0 后又搞不明白了。和上一个版本相比
1 、CA 和 Hub 集成了,这个点赞
2 、注册和加入的逻辑沿用之前的,但调整了配置文件保存的指令,之前是单文件,新版本是目录
3 、集成了 app (感觉这个不好理解,还不如之前的端口和服务),有 4 类:tunnel\proxy\script\terminal ,其中 terminal 可以直接用(默认是 SSH ?反正 连 windows 3389 是不行)
4 、我还是没有搞明白 tunnel 和 proxy 怎么用。如果我需要在办公网访问 home 的 3389 ,以前的版本是在 home 发布服务(添加 3389 端口),然后办公电脑增加本地端口映射到 home 的服务端口,最后在办公网络访问办公电脑的本地端口即可

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1050886

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX