转发 SMB 流量与终结它是两件不同的工作,做其中一件的路由器未必能胜任另一件。转发意味着路由器搬运从不解析其内容的报文。挂载意味着路由器成为文件客户端,随之带来它未必随附的软件、必须保护的凭据,以及现在由它承担的故障模式。在两者之间做选择,问的是文件在哪里需要,而不是能说服路由平台安装什么。

转发与终结是两件不同的工作

在转发角色里,路由器只有一项责任:在应用路径所需策略的同时,在客户端与服务器之间投递报文。它不对共享进行身份验证,不缓存文件数据,也不关心服务器说的是 SMB2 还是 SMB3,因为它从不读到流里那么深的位置。如果共享变得不可达,用户会看到错误,而路由器继续转发。

在客户端角色里,路由器加入到协议对话中。它协商方言、完成身份验证、解析名称、持有挂载点,并把本地文件系统视图呈现给其上运行的一切。这是一项有生命周期的真实服务,它使网关成为文件工作流的依赖项。它也继承了该依赖项的全部故障模式,包括启动时的等待与过期凭据。

比较并不只关乎能力。能挂载共享的平台并不必然是该这么做的平台,而无法挂载任何一个共享的平台,仍可能是路由这些流量的正确位置。

内核 CIFS 挂载究竟需要什么

在基于 Linux 的设备上,内核 CIFS 客户端与用户空间客户端是两种不同的能力,小型镜像往往两者都没有。内核支持必须存在于正在运行的镜像中,挂载辅助程序必须存在,而与服务器协商的 SMB 方言必须是双方都接受的那一种。可参阅Linux CIFS 客户端指南,其中说明了内核的布置及其挂载选项;在假定厂商构建包含它之前,这是正确的参考。

在设计之前先确认这项能力,并确认版本,而不是确认某个命令名是否存在。软件包列表里的模块名与一个能工作的客户端并不是一回事。

lsmod | grep -w cifs
modinfo cifs | head -5
mount.cifs --version
smbclient -L //fs02.corp.internal -U svc-router -m SMB3

内核模块可以加载、用户空间工具能报告版本,仍然不能保证挂载能挺过 VPN 密钥更新,因此把这次探测当作起始条件,而不是证据。如果镜像只提供 SMB1 支持,那是停下的理由,而不是在服务器上启用它的理由。

凭据与来源身份和笔记本电脑并不相同

被转发的请求带着笔记本电脑的身份穿过隧道,而在路由器上生成的请求则带着它自己的源地址、解析器路径与出站过滤。这些请求可能落在另一条防火墙规则、另一个 DNS 视图以及服务器侧的另一份允许列表里。因此,从工作站上能用的副本,并不能证明路由器自身的挂载可行。要从路由器自己的 shell 上测试挂载,而不是从它身后的工作站测试。

如果这个角色获批,就给路由器一个权限很窄的服务身份。绝不要把口令直接写在挂载命令行里,因为它会留在 shell 历史中,并在挂载运行期间出现在进程表里。

通过平台提供的受保护机制存放凭据,并从权限受限的文件里读取。除执行挂载的账号外,其他账号都不应能读取该文件。

install -m 600 /dev/null /etc/cifs-reports.creds
printf 'username=svc-router\npassword=REPLACE_ME\ndomain=CORP\n' > /etc/cifs-reports.creds
mount -t cifs //fs02.corp.internal/reports /mnt/reports -o credentials=/etc/cifs-reports.creds,vers=3.1.1,ro

共享消失时,故障归谁

缺失的远程文件系统与缺失的路由表现不同。挂载可能阻塞接触它的进程,可能在隧道尚不存在时的启动阶段失败,而原本发给服务器的写入,如果挂载点下存在本地目录,就可能落到错误的位置。这些现在是网络团队名下的存储故障,无论该团队是否愿意。没有人同意承担这种归属,但它随挂载一起到来。

围绕这一现实来设计启动顺序与挂载选项。带短超时和成文恢复步骤的只读挂载,比一切都依赖的可写挂载更容易辩护。确认隧道在有任何东西尝试挂载之前就已就绪,否则断电后的第一次启动会卡住。

对于大量文件处理,或任何把数据继续再导出的工作,单独的主机通常能给出更清晰的归属边界。路由器继续路由,文件工作流则得到一台可以在不牵连网络的情况下重启的机器。

用实际任务来检验这个决定

写下哪个任务需要这些文件,以及该任务在哪里运行。如果答案是工作站,那就路由这个共享并到此为止。如果答案是设备上的某项服务,那么在首次挂载前确认客户端能力、受支持的方言与凭据路径,然后再判断这台设备是否真的是合适的主机。

从路由器本身确认挂载后的视图与可用空间,因为工作负载看到的就是那里的结果。在重新连接之后再重复检查,而不只是干净启动后检查一次。

findmnt -t cifs -o TARGET,SOURCE,OPTIONS
df -h /mnt/reports
ls -l /mnt/reports | head

列出文件却报告文件系统已满或只读的挂载,已经告诉你凌晨 2 点会碰上哪种故障。也要确认恢复路径:干净卸载、放下隧道、再把它拉起来并在不重启设备的情况下重新挂载。如果这套流程每次都需要开支持单,那么路由器就不是承担客户端角色的合适位置。

相关文章