理解并排查服务器消息块 (SMB) 协议

服务器消息块 (SMB) 是一种关键的网络文件共享协议,使用户和应用程序能够通过网络访问文件、打印机和其他共享资源。SMB 常用于 Windows 环境,可实现客户端与服务器系统之间的无缝通信。本文将探讨 SMB 的工作原理、组成部分、常见的故障排除步骤,以及解决 SMB 相关问题的最佳实践。



什么是 SMB?

服务器消息块 (SMB)是一种网络协议,允许用户像操作本地文件一样读取、写入和管理远程服务器上的文件。SMB 广泛用于 Windows 网络,实现对文件、打印机和串行端口的共享访问。它还受到 Linux 和 macOS 系统的支持,因此成为跨平台通信的一种通用协议。


SMB 的工作原理

  1. 客户端请求:SMB 客户端(例如 Windows、Linux 或 macOS)向 SMB 服务器发送请求,以访问共享资源。
  2. 服务器响应:SMB 服务器根据身份验证和权限验证该请求。
  3. 资源访问:一旦获得访问权限,客户端就可以像操作本地驱动器上的文件一样读取、写入或修改文件。

关键 SMB 术语

  • SMB 服务器 (SRV):托管共享文件系统的系统。
  • SMB 客户端 (CLI):访问共享文件系统的系统。

例如,如果一台 Windows Server 2016 计算机访问 SMB 共享\\MyWorkstation\Data(位于一台 Windows 10 计算机上),该服务器是SMB 客户端,而该工作站是SMB 服务器.


SMB 版本

1. SMB 1.0(旧版)

  • 易受 WannaCry 和 EternalBlue 等攻击的影响。
  • 缺乏现代安全功能。

2. SMB 2.0 / 2.1

  • 性能和安全性均有提升。
  • 支持更大的缓冲区大小,以实现更高的数据传输速率。

3. SMB 3.0+

  • 引入加密以增强安全性。
  • 功能包括 SMB Multichannel 和 SMB Direct,可实现高速文件传输。

SMB 组件

1. 二进制文件

  • SMB 客户端二进制文件:位于%windir%\system32\Drivers:
    • RDBSS.sys
    • MRXSMB.sys
    • MRXSMB10.sys
    • MRXSMB20.sys
    • MUP.sys
    • SMBdirect.sys
  • SMB 服务器二进制文件:
    • %windir%\system32: Srvsvc.dll
    • %windir%\system32\Drivers: SRVNET.sys, SRV.sys, SRV2.sys, SMBdirect.sys

2. 绑定

  • SMB 客户端绑定: Client for Microsoft Networks
  • SMB 服务器绑定: File and Printer Sharing for Microsoft Networks

SMB 端口与通信

根据所使用的协议,SMB 可以通过不同的端口运行:

协议端口说明
NetBIOS over TCP/IPUDP 137名称解析
NetBIOS over TCP/IPUDP 138数据报服务
NetBIOS over TCP/IPTCP 139会话服务
通过 TCP 的直接 SMBTCP 445默认 SMB 通信

现代网络主要使用TCP 445,而较旧的系统可能依赖 NetBIOS。


如何排查 SMB 问题

1. 验证连接

  • 确保客户端能够通过TCP 445:
Test-NetConnection <server_IP_or_hostname> -Port 445
  • 如果失败,请检查 Azure 防火墙、NSG 或本地防火墙是否阻止了 SMB 流量。

2. 检查名称解析

  • 通过主机名和 IP 测试服务器访问:
nslookup <server_hostname>
  • 如果主机名解析失败,请验证 DNS 配置。

3. 验证 SMB 服务

  • 确保所需的服务正在运行:
Get-Service -Name LanmanServer, LanmanWorkstation
  • 如果服务已停止,请启动服务:
Start-Service -Name LanmanServer, LanmanWorkstation

4. 检查防火墙规则

  • 确认 SMB 规则已启用:
netsh advfirewall firewall show rule name="File and Printer Sharing (SMB-In)"

5. 验证权限

  • 通过文件夹属性或 CMD 检查共享权限和 NTFS 权限:
net share <sharename>
icacls <folder_path>

6. 使用 UNC 路径测试访问

  • 打开Run (Win + R) 并输入:
\\<server_IP_or_hostname>\sharename

高级故障排除与数据收集

1. 检查 SMB 会话

  • 显示活动的 SMB 会话:
Get-SmbSession

2. 重置 SMB 配置

  • 禁用并重新启用 SMB 2 和 SMB 3:
Set-SmbServerConfiguration -EnableSMB2Protocol $true -Force

3. 网络跟踪

  • 使用 Wireshark 收集与 SMB 相关的网络数据包:
    1. 开始在 SMB 客户端和服务器上同时捕获流量。
    2. 重现该问题。
    3. 分析数据包,查找 SMB 错误或超时。

4. 收集事件日志

  • 导出与 SMB 相关的事件日志以供进一步分析:
    • SMB 客户端日志。
    • SMB 服务器日志。
SMB

参考文档:

服务器消息块 (SMB) 高级故障排除 | Microsoft Learn

SMB 已知问题 | Microsoft Learn

SMB 故障排除指南 – Windows Server | Microsoft Learn

Microsoft SMB 协议和 CIFS 协议概述 – Win32 应用 | Microsoft Learn

在 Windows 中检测、启用和禁用 SMBv1、SMBv2 和 SMBv3 | Microsoft Learn

Windows Server 中使用 SMB 3 协议进行文件共享的概述 | Microsoft Learn

服务器消息块签名概述 – Windows Server | Microsoft Learn

SMB 安全增强功能 | Microsoft Learn


结论

SMB 是一种功能强大的文件共享和资源访问协议,但由于配置错误、网络限制或组件过时,可能会出现问题。按照上述故障排除步骤操作,您可以有效地识别和解决 SMB 相关问题。对于复杂的问题,网络跟踪和事件日志等高级诊断方法可以提供更深入的见解。

发表评论