NAS(6)—— SMB & WebDAV
概述
经过前面几个模块的配置,我们已经能够在 NAS 上存放我们的数据,并且通过组建 RAID 与接入 UPS 等方式加强了数据存储的安全性。在这个部分,我们需要通过配置来实现通过各种设备来访问 NAS 中存储的数据,并且进一步加强数据存储的安全性。
SMB / Samba
SMB(Server Message Block)可用于在计算机间共享文件、打印机、串口等,电脑上的网上邻居就是靠它实现的。通过 SMB 协议,客户端应用程序可以在各种网络环境下读、写服务器上的文件,以及对服务器程序提出服务请求。此外通过 SMB 协议,应用程序可以访问远程服务器端的文件、以及打印机等资源。
Samba 能让 Linux 服务器实现文件服务器、身份授权和认证、名称解析和打印服务等功能。
Samba 也是 SMB 协议的实现,它允许 Windows 客户访问 Linux 系统上的目录、打印机和文件(就像访问 Windows 服务器时一样)。重要的是,Samba 可以将 Linux 服务器构建成一个域控制器。这样一来,就可以直接使用 Windows 域中的用户凭据,免去手动在 Linux 服务器上重新创建的麻烦。
相比于 NFS,SMB / Samba 对 Windows 系统有着更好的支持,兼容性更优。
但非常值得一提的是,SMB 协议本身是面向局域网连接的,尤其是 SMB1.0/CIFS 协议,它仍使用的 NetBIOS 协议(139 端口)存在很多安全漏洞。并且由于 Wannacry 勒索病毒利用永恒之蓝漏洞造成了巨大威胁,SMB1.0/CIFS 已经逐渐被弃用。即使是后续的 SMBv2 以及 SMBv3,也被报告过 CVE(Common Vulnerabilities and Exposures,公共漏洞和暴露),因此建议不要在公网使用 SMB 服务。
如果需要远程文件管理,可以使用 Tailscale 等方案搭建虚拟局域网,或者通过更安全的文件传输协议,如 WebDAV 等。
异地容灾
在数据存储与容灾方面,有一条重要的原则,3-2-1 原则:
- 3:同一数据至少保存 3 份,包括原数据;
- 2:保存到 2 种以上存储介质上,如机械硬盘 / 固态硬盘;
- 1:至少有 1 份异地备份,防止本地发生灾难时数据完全丢失,如选择保存到云服务器上。
SMB 配置
NAS 端 —— 45Drive’s File Sharing
首先确保安装了 45Drive’s 库的 File Sharing 包。
在 Cockpit 控制台中File Sharing - Shares
处添加 SMB 共享:
按照下图进行配置即可。
需要共享多个文件夹,就在 Shares 处创建多个共享配置。
为了让其他设备具有写入权限,请配置共享文件夹的权限为 744。
1 | sudo chmod 744 -R /dir |
在配置了 IPv6 后,我们的 SMB 服务相当于暴露在公网中,因此更应做好访问控制。建议在路由器上关闭 IPv6 的 139 与 445 端口。
Samba 有自己的用户系统,但与系统用户名一致的用户拥有相同的访问权限。
我们创建一个与当前用户一致的 Samba 用户:
1 | sudo smbpasswd -a <你正在使用的用户名> |
根据提示设置好密码后(请设置高强度密码),修改共享文件夹及其文件的拥有者以匹配 Samba 用户:
1 | sudo chown <你正在使用的用户名>:<所在用户组> -R /dir |
在 Cockpit 中的防火墙放行 TCP 445 端口的请求。
其他设备端
对于 Windows 系统,确认其已连接到 NAS 的局域网中。打开运行,输入\\<NAS IP>
,回车:
访问对应文件夹,确认能够正常读写其中的文件。
可以将文件夹映射到驱动器,便于访问。右键文件夹,选择映射网络驱动器:
指定驱动器号,即可在此电脑中看到对应文件夹。
WebDAV
随着云计算和移动互联网的快速发展,远程访问、编辑和共享文件的需求日益增强。为了满足这一需求,WebDAV(Web-based Distributed Authoring and Versioning)应运而生,成为了一种基于 HTTP 协议的通信协议,扩展了 HTTP 1.1,提供了应用程序直接对 Web 服务器进行读写操作的能力。
自建 WebDAV 服务
如果你恰好有一台云服务器,并且带宽足够,连接稳定,就可以在上面部署 WebDAV 服务。我们也可以在 NAS 上部署 WebDAV 服务,来实现安全的远程文件访问。远程访问时,请为 WebDAV 配置 HTTPS。
绑定挂载
如果我们希望将多个不在同一目录下的不同目录都挂载到 WebDAV,我们可以采用绑定挂载(Bind mount)的方式。绑定挂载是 Linux 提供的一种特殊挂载方式,它可以让一个已有的目录在另一个路径下“出现”。
新建一个用于 WebDAV 访问的目录:
1 | sudo mkdir -p /path/to/webdav/root # 创建总根目录 |
进行绑定挂载:
1 | sudo mount --bind /path/to/your/data1 /path/to/webdav/root/data1 |
可通过 ls
命令查看是否成功挂载。确认成功后,将挂载配置写入 /etc/fstab
文件中,实现开机自动挂载:
1 | sudo vim /etc/fstab |
将以下内容添加到文件末尾:
1 | # WebDAV Bind Mounts |
保存后,运行 sudo mount -a
来测试 fstab 配置是否正确。
Caddy WebDAV
关于 Caddy 的介绍,详见 反向代理 & HTTPS。
安装 WebDAV 插件
为了在 Caddy 上开启 WebDAV 服务,我们需要先安装 mholt/caddy-webdav
插件:
1 | sudo caddy add-package github.com/mholt/caddy-webdav |
安装完成后,重启 Caddy:
1 | sudo systemctl restart caddy |
WebDAV 配置
接下来编辑 Caddy 配置,搭建 WebDAV 服务:
1 | sudo vim /etc/caddy/Caddyfile |
1 | { |
Caddy 权限配置
如果 Caddy 通过 systemd 运行,需要额外编辑 service 配置以确保 Caddy 具有读写权限:
1 | sudo systemctl edit caddy.service |
在打开的编辑器中,添加以下内容:
1 | [Service] |
完成编辑后,重新加载 systemd 并重启 Caddy:
1 | sudo systemctl daemon-reload |
由于 Caddy 在运行时是通过 caddy 用户来操作,因此我们需要确保 caddy 用户至少对于数据文件具有读写权限,对于目录具有读写执行(进入)权限。
假设数据目录由 test:test
用户及用户组所有,我们希望保持数据的归属权:
1 | sudo chmod 775 -R /path/to/your/data |
Standalone WebDAV(不推荐,基于 hacdias/webdav)
我们采用 Go 语言实现的 Standalone WebDAV 服务。但经过笔者实测,在面对大文件读写时,该方案可能会出现内存溢出以及卡顿的问题,因此不推荐使用。
我们使用 Docker Compose 部署。关于 Docker 的介绍,详见 Docker 服务。
先在文件夹下创建配置文件:
1 | sudo vim config.yml |
输入以下内容,根据具体情况进行修改:
1 | address: 0.0.0.0 |
继续创建 docker-compose.yml
文件:
1 | services: |
WebDAV 服务商
目前国内支持 WebDAV 的云盘服务商只有坚果云。不过,阿里云盘通过开放平台接口可以实现 WebDAV 服务。这里是项目地址。
坚果云对于免费用户每月提供 1GB 的上传流量以及 3GB 的下载流量。可以在第三方应用管理处创建应用密码。
挂载 WebDAV 为本地磁盘
自动挂载
各平台都有较为好用的 WebDAV 图形化客户端,如 Windows 端的 RaiDrive,Linux 端的 Dolphin / Thunar,macOS 端的 Finder(虽然 Finder 可能会出现卡顿问题)。根据软件里的指示进行挂载与登录即可。
当然,也有一些较为方便的命令行自动挂载工具,如 cadaver,rclone 等。
命令行手动挂载- davfs2
以下部分来自于这篇文章。
安装
1 | sudo apt install davfs2 |
挂载 WebDAV 磁盘
先在 Linux 系统上创建要挂载的文件目录,名称自定:
1 | mkdir /Aliyun |
挂载远端 WebDAV 至本地的/Aliyun
目录下:
1 | mount -t davfs http(s)://<服务器地址/域名>:<端口>/ /Aliyun # 请根据实际情况配置 |
回车后输入自己的用户名和密码,完成。可以输入df -h
指令来查看是否成功。
挂载坚果云 WebDAV
如果使用上述方法挂载坚果云 WebDAV,会出现如下报错信息:
1 | /sbin/mount.davfs: mounting failed; the server does not support WebDAV |
出现此情况的原因是,mount.davfs 命令在挂载时和 WebDAV 服务器建立连接,并通过 libneon 库的 ne_options()
函数发送 HTTP OPTIONS 请求获取 WebDAV 服务器能力,虽然返回成功但判断坚果云 WebDAV 服务器不支持 Class 1 WebDAV,因此直接报错挂载失败。
解决办法:修改/etc/davfs2/davfs2.conf
:
1 | sudo vim /etc/davfs2/davfs2.conf |
将 ignore_dav_header
取消注释,并将 0 改为 1,保存并退出。
再次挂载,成功。
开机自动挂载 WebDAV
启用 davfs2 用户锁
编辑/etc/davfs2/davfs2.conf
文件:
1 | sudo vim /etc/davfs2/davfs2.conf |
将 use_locks
取消注释,并将 1 改为 0,保存并退出。
记住 WebDAV 账号密码
编辑/etc/davfs2/secrets
文件:
1 | sudo vim /etc/davfs2/secrets |
在末尾增加一行内容:
1 | http(s)://<服务器地址/域名>:<端口>/ <username> <password> |
这里的 username 和 password 请更改为 webdav.yaml 中对应的用户名和密码。
开机执行挂载
编辑/etc/rc.local
文件:
1 | sudo vim /etc/rc.local |
文件末尾加上挂载指令,与上文一致。
1 | mount -t davfs http(s)://<服务器地址/域名>:<端口>/ /Aliyun # 请根据实际情况配置 |
保存退出即可。