使用 ZTM 安全地跨互联网访问 SMB 共享文件

f478312a3bf6e3ad6f6dcdad6ad24310.jpeg

背景

SMB(Server Message Block)是一种网络文件共享协议,用于在网络上的计算机之间共享文件、打印机和其他资源。SMB 主要用于局域网,在局域网内能够提供高性能和低延迟的文件传输和共享服务,且不需要复杂的网络配置,适合办公室、家庭网络等场景。

1405be9c096d2ff479bac51d412194a8.png

而在实际的使用中, 出于跨地域协作的考虑、远程办公的普及,需要通过互联网访问共享资源。在互联网中传输数据,安全性是首要的挑战,存在数据窃听和中间人攻击等问题。虽然 SMB 3.0 中加入数据加密传输的支持,但要求升级服务端和客户端支持 SMB 3.0 并进行复杂的加密配置。

在这篇文章中将会介绍另一种方案:使用 ZTM 传输 SMB 协议数据( 以下简称 SMB via ZTM)实现安全的远程访问。这种方案相比 SMB 3.0 的加密传输有如下优势:

  • • 简化配置过程,无需升级现有客户端和服务器。

  • • 提供统一的加密和身份验证,简化管理并增强安全性。

  • • 原本没有使用认证的 SMB 服务也可以通过 ZTM 的安全认证来提升安全性。

  • • 提高传输效率,减少网络延迟和抖动。

  • • 适用于远程办公和跨地域访问,增强灵活性和兼容性。

关于 ZTM

ZTM[1](Zero Trust Mesh)是一款开源的网络基础设施软件。它基于 HTTP/2 隧道构建,可以在任何类型的 IP 网络上运行,例如局域网、容器化网络和互联网等。

ZTM 可以在各种环境中使用,从连接家庭和工作场所的 2 节点个人网络,到连接全球办公室和分支机构的 10,000 节点企业网络。

ZTM 可以支持多种 CPU 架构,如 x86, ARM, MIPS, RISC-V, LoongArch 等,以及多种操作系统,如 Linux, Windows, macOS, FreeBSD, Android。

49fa4de083346f3cc186a666ad8fc844.png

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. 1. 搭建 ZTM Hub

  2. 2. 为 Agent 颁发证书

  3. 3. 部署 Agent 并接入 Hub

  4. 4. 注册服务

  5. 5. 将服务映射到本地网络

391780e74cb54b4199ef769ea15a2e28.png

在这个 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 安装 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 颁发证书

注意: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. SMB 服务侧部署 Agent

我在 Homelab 的 Ubuntu 虚拟机上安装 Agent,同样要先安装 CLI,然后通过 CLI 启动 Agent。默认监听在 127.0.0.1:7777,可以通过参数 --listen 来指定 0.0.0.0:7777

sudo ztm start agent --listen 0.0.0.0:7777

该命令会将 Agent 配置为系统服务,可以通过 systemctl status ztm-agent 查看其运行状态。

4. Agent 接入 Hub

Agent 启动之后,最重要的一步就是将其连接到 ZTM Hub。这里有两种方法:命令行和 Web 界面。

方法一:使用命令行

在命令行窗口中执行下面的命令,与 Hub 建立安全隧道,命令格式 ztm join MESH_NAME --as AGENT_NAME --permit JSON_FILE

ztm join my-hub --as smb-server --permit home.json

可通过命令 ztm get mesh 查看隧道状态。

ztm get mesh
NAME    JOINED AS   USER  HUBS                 STATUS
my-hub  smb-server  home  13.229.223.113:8888  Connected

注:通过 ztm left MESH_NAME 可以断开与 Hub 的连接。

方法二:使用 Web 界面

在浏览器中打开 http://<虚拟机 IP>:7777

8730a870d1691e033787575567795eca.png

在 Meshes 标签页中点击 Join

填入信息,并点击保存:

  • • Mesh 输入你想要的名字,比如 my-hub

  • • Permit 中点击 + 选择前面颁发的 home.json

  • • Join AS 输入你想要的名字,比如 smb-server

b7e07a0153e9a1f6087a0e101f456f36.png

保存后在 Meshes 标签页中可以看到刚添加的 Hub,以及其状态。如果状态不是 Connected 请检查颁发的 JSON 文件的内容。

2186baddc4cfa513d63914f1e818290c.png

注:点击 Hub 右侧的三个点,可以修改或者断开连接。

5. 注册服务

想要从外部访问 SMB 服务,我们需要在 Agent 上将 SMB 服务注册到 Hub。同样可以使用命令行,或者 Web 界面来操作。

方法一:使用命令行

命令格式为 ztm create service PROTOCOL/SERVICE_NAME --host SERVICE_IP --port SERVICE_PORT。这里我们使用已有的 SMB 服务,默认端口 445。

ztm create service tcp/smb-server --host 192.168.11.104 --port 445

使用命令 ztm get service 可以查看注册的服务。

ztm get service
NAME            ENDPOINTS
tcp/smb-server  1

注:通过 ztm delete service PROTOCOL/SERVICE_NAME 可以注销服务。

方法二:使用 Web 界面

在 Services 标签页中,点击 Create

7c8b9a1eacc1f721343fc1a89234e2f3.png

填入服务的相关信息,然后点击 Save 保存:

  • • Service 服务名,比如 smb-server

  • • Protocol 协议,选择服务对应的协议 TCP

  • • Host 服务地址,这里是 SMB 服务的地址 192.168.11.104

  • • Port服务端口, 这里是 445

76d2eff3277c6d7beea4369cd0bf9892.png

保存后,可以在 Services 标签看到创建的服务。

1187f69c71849215f2c469dc017e446f.png

6. SMB 客户端侧部署 Agent

首先是安装 ZTM,可以从 这里[2] 下载对应平台的 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/smb-server  1

服务的映射是通过创建一个本地端口来实现的,格式为 ztm create port LAN_IP/PROTOCOL/PORT --service PROTOCL/NAME

ztm create port 127.0.0.1/tcp/1445 --service tcp/smb-server

检查创建的端口。

ztm get port
NAME                ENDPOINT  SERVICE
127.0.0.1/tcp/1445  macbook   tcp/smb-server

注:通过 ztm delete port LAN_IP/PROTOCOL/PORT 可以删除端口。

方法二:使用 Web 界面

在 Services 标签页中找到发现的服务,点击服务右上角的按钮。

b0af5482599491c951875cbcb5678b54.png

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

  • • IP 服务的映射地址,如果仅提供当前设备访问,选择 127.0.0.1;如果要提供给局域网的其他设备访问,输入当前设备的局域网地址。

  • • Port 服务的映射端口,不能与其他端口冲突,这里我们将 smb-server 服务映射到 1445 端口。

7bb95bc0fe7372b65bd10a7d4b7e16ef.png

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

3038b78a26ecd06602de96ee1cce12c8.png

9. 测试

在 macOS 中打开 Finder,菜单中选择 **Go -? Connect to Server...**。在弹窗中输入 smb://127.0.0.1:1445/nvme11 启动 /nvme11 是我的 smb 服务的目录名。

0e4961c2948ce7591ad954baee51967f.png

点击 Connect 后,在 Finder 侧边栏可以看到连接的 SMB 服务,查看信息可以看到其网络地址。

4727259246ce0b4ba306a0623c35323e.png

接下来就可以像操作本地文件系统一样管理远程 SMB 服务了。

总结

在 ZTM 环境中传输 SMB 协议数据是一种更加简单、高效和安全的解决方案,特别适合需要在广域网或不可信网络中传输数据的场景。这种方法不仅提升了原本 SMB 服务的安全性,还简化了管理和部署的复杂性。

引用链接

[1] ZTM: https://github.com/flomesh-io/ztm
[2] 这里: https://github.com/flomesh-io/ztm/releases/tag/v0.0.3

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值