SMB 与 CIFS 协议详解:Windows 文件共享的核心
SMB(Server Message Block)是 Windows 环境中使用最广泛的文件共享协议。在企业内网中,用户只需在资源管理器地址栏输入 \\fileserver\project 就能访问共享目录,整个过程对使用者透明。这种"无感"的易用性,是 SMB 长期占据 Windows 文件共享主导地位的根本原因。
本文从协议演进、工作原理出发,涵盖服务器配置、Linux 客户端挂载、安全加固和常见攻击面,帮助你建立对 SMB/CIFS 协议的完整认知。
一、协议演进与版本脉络
理解 SMB 的第一步,是厘清 SMB、CIFS、Samba 三个概念之间的关系。
SMB(Server Message Block)最初由 IBM 在 1983 年设计,用于在局域网上共享文件和打印机。CIFS(Common Internet File System)是微软在 1996 年将 SMB 扩展到互联网场景时提出的名字,本质上是 SMB 的一种实现。由于微软的强势地位,“CIFS” 这个名称在很长时间内被等同于整个 SMB 协议族。但从技术角度看,CIFS 本身已经过时,现存的实现统称为 SMB。
SMB 经历了数次重大版本迭代:
| 版本 | 年份 | 关键改进 |
|---|---|---|
| SMB 1.0 | 1983-至今 | 原始版本,麻雀虽小但存在严重安全缺陷 |
| SMB 2.0 | 2006 | 重大重构,大幅简化协议头,支持更大读写块,显著提升性能 |
| SMB 2.1 | 2010 | 引入 oplock leasing(锁租约),改善并发性能 |
| SMB 3.0 | 2012 | 支持端到端加密( AES-128-GCM)、多通道、RDMA、集群故障转移 |
| SMB 3.0.2 | 2014 | 禁止 SMB1 默认启用,安全性大幅提升 |
| SMB 3.1.1 | 2015 | 引入 AES-256-GCM 加密、签名算法协商、Cluster Dialect Negotiation |
目前最值得关注的是 SMB1 的遗留问题。SMB1 存在多个严重漏洞,最著名的包括 EternalBlue(NSA 泄露的漏洞利用,被 WannaCry 勒索软件使用)。SMB1 在 2017 年之后的主流操作系统中已默认禁用,但在部分老旧设备上仍可能处于开启状态,这是企业内网中的一个常见风险点。
二、协议工作原理
2.1 两种传输方式:端口 139 与 445
SMB 可以在两种不同的传输通道上工作,理解它们的区别有助于排查连接问题。
NetBIOS over TCP 139:这是 SMB 的传统传输方式,通过 NetBIOS 协议封装后跑在 TCP 139 端口。NetBIOS 是一种古老的命名和会话层协议,提供名称注册、广播查询等功能。这种方式适用于需要 NetBIOS 名称解析的老旧网络环境。
Direct TCP 445:这是现代 SMB 的主流传输方式,SMB 报文直接封装在 TCP 报文中,无需 NetBIOS 层。端口 445 是当前所有主流 Windows 和 Samba 版本使用的默认端口。
在实际排查中,如果客户端无法连接,应同时检查 139 和 445 端口是否可达。
2.2 协议交互五阶段
SMB 的完整交互流程分为五个阶段:
第一阶段:连接协商
客户端向服务器 TCP 445 端口发起连接,双方交换各自支持的 SMB 版本(dialect)。服务器返回自己支持的最高版本,客户端从中选择一个双方都支持的版本进行后续通信。这就是所谓的"Dialect Negotiation"(方言协商)。
协商完成后,双方确定使用哪个 SMB 版本进行通信。SMB 2.0 及之后的版本协议头大幅简化(从复杂的 SMB1 头变为固定长度的简洁头),这是 SMB 2.0 性能提升的重要因素之一。
第二阶段:身份认证
客户端提交用户凭证,服务器完成身份验证。支持两种主流认证方式:
- NTLMv2:基于挑战-响应机制,密码以哈希形式传输,不会上传明文密码。在工作组(Workgroup)环境中使用。
- Kerberos:基于票据机制,在 Active Directory 域环境中为首选。优势在于支持单点登录(SSO),用户一次登录后可访问所有授权资源,无需重复输入密码。
第三阶段:树连接建立
客户端向服务器请求访问特定共享路径,例如 \\192.168.1.10\data。服务器根据共享级别的权限设置(Share Permissions)和 NTFS 级别的 ACL(访问控制列表)进行双重校验,验证通过后返回唯一句柄(Tree ID)。后续所有对这个共享的操作,都通过这个 Tree ID 标识。
第四阶段:文件操作执行
客户端通过这个树连接执行具体的文件操作。每条指令都封装为 SMB 报文,主要操作包括:
CONNECT → 建立树连接
TREE_CONNECT → 连接共享目录
CREATE → 打开或创建文件/目录
READ → 读取数据
WRITE → 写入数据
QUERY_INFO → 查询文件属性
SET_INFO → 修改文件属性
CLOSE → 关闭文件句柄
TREE_DISCONNECT → 断开树连接
第五阶段:会话终止
客户端发送会话结束请求,服务器释放分配的句柄和内存资源,TCP 连接关闭。
2.3 锁机制:Oplocks 与 Leasing
SMB 在网络环境下需要解决一个核心问题:客户


471

被折叠的 条评论
为什么被折叠?



