在 ZTM 0.1 中引入了 zt-app 框架 之后,原有的 ZTM 隧道功能交由 zt-tunnel[1] 来实现。在刚发布的 ZTM 0.2[2] 中加强了基于证书的访问控制并增强了底层的文件系统来支持更加复杂的 zt-apps。
借着 ZTM 0.2 的发布,将之前的这篇进行更新:使用 zt-tunnel 来实现跨互联网的 SMB 访问。
背景
SMB(Server Message Block)是一种网络文件共享协议,用于在网络上的计算机之间共享文件、打印机和其他资源。SMB 主要用于局域网,在局域网内能够提供高性能和低延迟的文件传输和共享服务,且不需要复杂的网络配置,适合办公室、家庭网络等场景。
而在实际的使用中, 出于跨地域协作的考虑、远程办公的普及,需要通过互联网访问共享资源。在互联网中传输数据,安全性是首要的挑战,存在数据窃听和中间人攻击等问题。虽然 SMB 3.0 中加入数据加密传输的支持,但要求升级服务端和客户端支持 SMB 3.0 并进行复杂的加密配置。
在这篇文章中将会介绍另一种方案:使用 ZTM 传输 SMB 协议数据( 以下简称 SMB via ZTM)实现安全的远程访问。这种方案相比 SMB 3.0 的加密传输有如下优势:
•简化配置过程,无需升级现有客户端和服务器。•提供统一的加密和身份验证,简化管理并增强安全性。•原本没有使用认证的 SMB 服务也可以通过 ZTM 的安全认证来提升安全性。•提高传输效率,减少网络延迟和抖动。•适用于远程办公和跨地域访问,增强灵活性和兼容性。
关于 ZTM
ZTM[3](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 时,通常需要按照以下步骤进行。步骤 1、2、3 是基础设施的搭建,每个需要接入 Hub 的网络都必须执行步骤 2 和 3。一旦接入 Hub,步骤 4 和 5 将根据需要重复执行:
1.搭建 ZTM Hub2.为 Agent 颁发证书3.部署 Agent 并接入 Hub4.注册服务5.将服务映射到本地网络
在这个 SMB via ZTM 的方案中,在 SMB 客户端和服务端所在的网络中安装 ZTM Agent。Agent 与公有云中的 ZTM Hub 建立加密的 HTTP/2 隧道。
服务端侧的 Agent 将 SMB 服务注册到 Hub;客户端侧的 Agent 将 Hub 上的服务映射到本地端口,对本地局域网内的客户端提供 SMB 服务(在下面的演示中,我们会在 SMB 客户端所在设备上安装 Agent)。
同时你应该会发现,加密隧道的建立是有 Agent 主动发起的,SMB 服务并不会直接暴露在互联网中。即使 SMB 服务本身不具备认证功能,客户端侧的 Agent 的访问仍需要使用证书完成强身份认证。
演示
在演示中我们将会用台有公网 IP 的云主机,可以购买云厂商 99 元的主机,通常都有 3-4M 的带宽,用来转发 1080P 甚至低码流的 4K 也没压力。
SMB 服务运行在我的家庭网络中,而我的电脑接入的是一个公共网络。
1. 运行 ZTM Hub
首先 ssh 到云主机,通过 ZTM CLI 安装 Hub。当前最新的 ZTM 为 0.2.0 版本,通过下面的命令安装 CLI。
ZTM_VERSION=0.2.0
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 的使用方法。
通过下面的命令启动 Hub,默认监听在 8888
端口,同样可以通过参数 --listen
来修改,这里我们使用默认值。ztm start hub
会将 ztm-hub
添加到系统服务中,因为需要使用 sudo
。
首次启动 hub 时生成的 root 用户许可内包含有 root 用户的私钥,请妥善保存。
sudo ztm start hub --listen 0.0.0.0:8888 --names 52.175.28.72:8888 --permit root.json
通过 systemctl
可以查看服务运行状态。
systemctl status ztm-hub
启动 Hub 之后生成的用户许可,可以用其来将 Agent 接入到 Mesh 网络中,这个 Agent 就是 Root Agent。使用 Root Agent,我们可以为其他的 Agent 颁发许可。当然所有的 Agent 都可以使用 root 用户许可接入 Mesh 网络,但不利于进行用户权限的管理。
2. 启动 Root Agent
可以在云主机或者任何一台设备上启动 Root Agent,这里我选择在本机上启动。
同 Hub 的启动一样,使用 ztm start
来启动 Agent。其默认监听在 127.0.0.1:7777
,也可以通过 --listen
参数修改。
sudo ztm start agent
3. Root Agent 接入到 Mesh 网络
参考 官方文档[4] 使用前面生成 root.json
将 Agent 接入到网格。
ztm join smb-demo --as ep-1 --permit root.json
查看是否接入成功。
ztm get mesh
NAME JOINED AS USER HUBS STATUS
smb-demo ep-1 root 52.175.28.72:8888 Connected
以 root
的身份接入到 Mesh 网格后,就可以为其他设备颁发许可了。
4. 启动 SMB 侧 Agent
接下来,我们在 SMB 服务所在的网络中启动 SMB 侧的 Agent。运行 Agent 的设备可以是位于 SMB 服务同一网络的任意设备,即能访问到 SMB 服务即可。
sudo ztm start agent
只有获得许可的 Agent 才被允许接入到 Mesh 中。要为用户颁发许可,需要使用接入到 Mesh 的 root 用户来颁发更多的许可,以及被邀请用户(Agent)的公钥。被邀请用户(Agent)的公钥可以通过命令 ztm identity
命令获取。
在 SMB 服务侧启动 Agent 之后,可以通过 ztm identity
来获取公钥了。
ztm identity > pub.pem
有了 Agent 的公钥之后,就可以交由 Root Agent 来颁发许可了。
5. 颁发许可
使用 Root Agent,为 SMB 的 Agent 颁发许可,用户名设置为 smb
。
ztm invite smb --permit smb.json --identity pub.pem
6. SMB 侧 Agent 接入到 Mesh 网络
让我们回到 SMB 服务侧的 Agent,使用上面颁发的证书接入到 Mesh 网络。
ztm join smb-demo --as ep-2 --permit smb.json
通过下面的命令查看已经入到的 Mesh 网络的 Agent。
ztm get ep
NAME USER IP PORT STATUS
ep-1 root 103.116.72.25 15265 Online
ep-2 (local) smb 45.62.167.231 56859 Online
当 Agent 接入到 Mesh 网络之后,我们就可以通过 zt-tunnel[5] 为 SMB 服务创建隧道。
在 zt-tunnel
中,有两个资源:inbound
和 outbound
,分别对应隧道的入口和出口。通过 inbound
和 outbound
可以连接位于不同网络的设备。
7. 打开隧道出口
参考 zt-tunnel[6] 的文档,在 SMB 侧的 Agent 开启隧道出口,将其指向 SMB 服务 192.168.11.104:445
。
ztm tunnel open outbound tcp/smb --targets 192.168.11.104:445
8. 打开隧道入口
为了便于演示,我们假设从 Root Agent 这侧来访问 SMB 服务。当然你可以从其他的设备来访问,并为其颁发许可。
ztm tunnel open inbound tcp/smb --listen 1445
9. 测试
在 macOS 中打开 Finder,菜单中选择 Go -? Connect to Server...。在弹窗中输入 smb://127.0.0.1:1445/nvme11
启动 /nvme11
是我的 smb 服务的目录名。
点击 Connect 后,在 Finder 侧边栏可以看到连接的 SMB 服务,查看信息可以看到其网络地址。
接下来就可以像操作本地文件系统一样管理远程 SMB 服务了。
关于 Flomesh
Flomesh(易衡科技)成立于 2018 年,自主研发并开源了高性能可编程代理 Pipy(https://github.com/flomesh-io/pipy)。以 Pipy 为基础,Flomesh 研发了软件负载均衡、服务网格两款软件产品。为工信部认证的可信云产品、可信开源项目。
Flomesh 核心竞争力来自完全自研的核心组件 Pipy,该组件高性能、高可靠、低延迟、可编程、可扩展、低依赖,采用 C++ 开发,内置自研的 JS 引擎,支持使用 JS 脚本做扩展开发。支持包括 x86、arm、龙芯、海光等硬件 CPU 架构;支持 Linux、FreeBSD、macOS、Windows、OpenWrt 等多种核心的操作系统。
Flomesh 成立以来,以技术为根基、以客户为导向,产品被应用在头部股份制商业银行总行、大型保险公司、运营商总部以及研究院等众多客户和多个场景。
加入 Flomesh 社区
添加小 P 成为好友,参与社区互动,享受丰富互动并获取独家周边礼品!
引用链接
[1]
zt-tunnel: https://github.com/flomesh-io/ztm/blob/main/docs/ZT-App.md#zt-tunnel[2]
ZTM 0.2: https://github.com/flomesh-io/ztm/releases/tag/v0.2.0[3]
ZTM: https://github.com/flomesh-io/ztm[4]
官方文档: https://github.com/flomesh-io/ztm/blob/main/docs/CLI_zh.md#接入-mesh[5]
zt-tunnel: https://github.com/flomesh-io/ztm/blob/main/docs/ZT-App_zh.md#zt-tunnel[6]
zt-tunnel: https://github.com/flomesh-io/ztm/blob/main/docs/ZT-App_zh.md#zt-tunnel
文章评论