
SMB 与 CIFS 协议详解Windows 文件共享的核心SMBServer Message Block是 Windows 环境中使用最广泛的文件共享协议。在企业内网中用户只需在资源管理器地址栏输入\\fileserver\project就能访问共享目录整个过程对使用者透明。这种无感的易用性是 SMB 长期占据 Windows 文件共享主导地位的根本原因。本文从协议演进、工作原理出发涵盖服务器配置、Linux 客户端挂载、安全加固和常见攻击面帮助你建立对 SMB/CIFS 协议的完整认知。一、协议演进与版本脉络理解 SMB 的第一步是厘清 SMB、CIFS、Samba 三个概念之间的关系。SMBServer Message Block最初由 IBM 在 1983 年设计用于在局域网上共享文件和打印机。CIFSCommon Internet File System是微软在 1996 年将 SMB 扩展到互联网场景时提出的名字本质上是 SMB 的一种实现。由于微软的强势地位“CIFS” 这个名称在很长时间内被等同于整个 SMB 协议族。但从技术角度看CIFS 本身已经过时现存的实现统称为 SMB。SMB 经历了数次重大版本迭代版本年份关键改进SMB 1.01983-至今原始版本麻雀虽小但存在严重安全缺陷SMB 2.02006重大重构大幅简化协议头支持更大读写块显著提升性能SMB 2.12010引入 oplock leasing锁租约改善并发性能SMB 3.02012支持端到端加密 AES-128-GCM、多通道、RDMA、集群故障转移SMB 3.0.22014禁止 SMB1 默认启用安全性大幅提升SMB 3.1.12015引入 AES-256-GCM 加密、签名算法协商、Cluster Dialect Negotiation目前最值得关注的是 SMB1 的遗留问题。SMB1 存在多个严重漏洞最著名的包括 EternalBlueNSA 泄露的漏洞利用被 WannaCry 勒索软件使用。SMB1 在 2017 年之后的主流操作系统中已默认禁用但在部分老旧设备上仍可能处于开启状态这是企业内网中的一个常见风险点。二、协议工作原理2.1 两种传输方式端口 139 与 445SMB 可以在两种不同的传输通道上工作理解它们的区别有助于排查连接问题。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 与 LeasingSMB 在网络环境下需要解决一个核心问题客户端本地会缓存文件数据以提升性能但当多个客户端同时访问同一个文件时如何保证数据一致性Oplocks机会锁是 SMB1 引入的机制允许客户端在本地缓存文件并获得独占访问的承诺。当另一个客户端请求访问同一文件时服务器通知前一个客户端Break Oplock强制其刷新缓存、释放锁。Oplocks 分为三级exclusive独占、batch批量和 level-II共享。Leases租约是 SMB 2.1 引入的改进机制针对目录级别的缓存做了优化。相比 Oplocks 的文件粒度租约可以在目录级别生效显著减少锁冲突和通知消息的数量。在高并发访问场景下租约的性能优势明显。三、SMB 协议的安全性3.1 签名与加密的区别SMB 的安全机制分为两个层次容易混淆SMB Signing签名在每个 SMB 报文尾部附加 HMAC 验证码接收方校验报文的完整性和发送方身份。签名的目的是防止中间人篡改和伪造报文但报文本身是明文传输的。SMB2 之后默认开启 signing。SMB Encryption加密在 SMB 3.0 中引入对通信内容进行端到端 AES 加密。加密后即使攻击者截获流量也无法读取内容。这是真正的传输层加密不需要依赖外部 SSL/TLS 层。SMB 加密默认使用 AES-128-GCMSMB 3.1.1 起支持 AES-256-GCM。两者可以独立启用也可以同时启用以获得最大保护。3.2 SMB 加密的适用场景SMB 加密特别适合以下场景跨不信任网络的文件共享例如通过 VPN 或专线连接但仍需额外保护存储敏感数据的文件服务器金融和医疗等对数据安全有合规要求的行业SMB 加密的性能开销在现代 CPU 上已经很小通常不超过 5-10%在安全与性能的权衡中加密的收益远大于成本。四、Samba 服务端配置4.1 核心组件在 Linux 上提供 SMB 共享服务Samba 是最成熟的解决方案。Samba 包含三个核心守护进程smbd处理文件与打印共享请求维护文件锁、连接管理等是 Samba 的核心。nmbd提供 NetBIOS 名称解析服务可选端口 137/138负责在工作组环境中让其他机器通过主机名发现共享。winbindd将 Linux 系统接入 Active Directory 域实现与 Windows 域控制器的身份认证互通。4.2 基础配置示例以下是一个面向内部团队的共享目录配置适用于 Ubuntu 或其他主流 Linux 发行版。安装软件包sudoaptinstallsamba cifs-utils编辑主配置文件/etc/samba/smb.confsudo nano /etc/samba/smb.conf滑到文件最底部,把全部配置粘贴进去[global] workgroup WORKGROUP server string Samba Server %v netbios name ubuntu-server security user map to guest bad user log file /var/log/samba/log.%m max log size 1000 # 禁止 SMB1 协议安全性要求 min protocol SMB2 [shared] path /srv/samba/shared browsable yes writable yes guest ok no read only no create mask 0644 directory mask 0755 valid users alice, bob几个关键参数的理解security user启用本地账户认证模式依赖系统账户。适合没有 AD 域的小型网络。若接入 AD 域应改为security domain。valid users明确允许访问的用户列表白名单模式。未列出的账户即使密码正确也无法访问。create mask与directory mask控制新建文件和目录的权限。八进制 0644 表示文件对所有者可读写、组和其他用户只读目录则允许所有人执行进入目录的权限。min protocol SMB2强制使用 SMB2 及以上版本从根本上禁用存在安全漏洞的 SMB1。这是生产环境的标准安全配置。创建系统账户并添加 Samba 密码sudoadduser alicesudosmbpasswd-aalice重启服务使配置生效sudosystemctl restart smbd nmbd配置完成后Windows 客户端可在资源管理器地址栏输入\\ubuntu-server\shared访问共享输入预设的 Samba 账户和密码即可。4.3 SELinux 上下文如果服务器启用了 SELinux如 CentOS、RHEL还需要额外配置安全上下文# 开放 Samba 读写权限setsebool-Psamba_export_all_rw on# 为共享目录设置正确上下文semanage fcontext-a-tsamba_share_t/srv/samba/shared(/.*)?restorecon-Rv/srv/samba/shared五、Linux 访问 Windows 共享5.1 挂载方式Linux 作为客户端访问 Windows 共享时使用 mount 命令配合 cifs 文件系统类型sudomount-tcifs //192.168.1.100/data /mnt/win_data\-ocredentials/etc/smbcreds/nas,vers3.0,iocharsetutf8,uid1000,gid1000参数说明参数含义credentials存放用户名和密码的凭据文件路径vers指定 SMB 版本3.0 禁用有漏洞的 SMB1iocharset字符集编码utf8 确保中文文件名正确显示uid/gid挂载后文件的默认所有者UID/GID5.2 凭据安全管理命令行中明文书写密码是严重的安全隐患。正确的做法是将凭据存放在受保护文件中# 创建凭据文件# /etc/smbcreds/nasusernameai_userpasswordS3cr3tPass!domainCORP# 设置严格权限chmod600/etc/smbcreds/naschownroot:root /etc/smbcreds/nas文件权限 600 确保只有 root 能读取其他用户无法获取密码明文。5.3 高吞吐场景的性能调优在 AI 训练数据集读取、大文件传输等高吞吐场景下挂载参数对性能影响显著# 大块读写单次 I/O 最大 1MB# cachestrict严格缓存模式保证数据一致性# rsize/wsize增大到 1MB 减少系统调用次数sudomount-tcifs //nas.corp.local/datasets /data/ml_datasets\-ocredentials/etc/smbcreds/dataset,vers3.0,ro,cachestrict,\rsize1048576,wsize1048576,dir_mode0755,file_mode0644常用性能参数对照参数作用推荐值高吞吐场景rsize / wsize单次读写块大小10485761MBcache缓存策略strict一致性或 none高性能versSMB 版本3.0 及以上seal启用 SMB 加密yes安全优先opoortune_lock机会锁no多客户端并发时关闭5.4 自动化挂载脚本结合 systemd 或 autofs可以实现开机自动挂载或按需挂载# /etc/systemd/system/data-mnt.service[Unit]DescriptionMount SMB ShareAfternetwork-online.targetWantsnetwork-online.target[Service]TypeoneshotExecStart/usr/bin/mount-tcifs //nas.corp.local/datasets /data/ml_datasets\-ocredentials/etc/smbcreds/dataset,vers3.0,cachestrict,rsize1048576,wsize1048576RemainAfterExityes[Install]WantedBymulti-user.targetsudosystemctlenable>六、常见攻击面与防御6.1 SMB1 相关漏洞SMB1 是历史上受攻击最多的协议版本之一。最著名的当属 EternalBlueMS17-010NSA 泄露的攻击工具包中包含针对 SMB1 的多个远程代码执行漏洞。WannaCry 和 NotPetya 勒索软件均通过此漏洞在企业内网中大规模传播造成了灾难性的后果。防御措施# 检查 Linux 上 SMB1 是否启用smbstatus--version# 在 smb.conf 中强制禁用 SMB1min protocolSMB2# Windows 上禁用 SMB1PowerShell 管理员权限Disable-WindowsOptionalFeature-Online-FeatureNameSMB1Protocol-NoRestart6.2 横向移动与凭据重放在内网渗透场景中SMB 是横向移动 Lateral Movement的常用通道。攻击者获取一台机器的管理员权限后可以通过 Pass-the-Hash 攻击使用截获的 NTLM 哈希值直接连接其他机器的 SMB 端口无需解密明文密码。防御措施启用 Kerberos 认证替代 NTLM在 AD 域中开启 SMB Signing限制域管理员的登录范围Admin Tiering 策略监控异常 SMB 连接行为如大量内网 SMB 连接扫描6.3 枚举与信息泄露SMB 协议的某些版本支持空会话Null Session连接允许匿名用户获取共享列表、用户列表、系统信息等敏感数据。SMB2 之后已默认禁止空会话但在旧系统中仍可能存在。防御措施# Windows 注册表禁用 SMB 空会话 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters] NullSessionShares RestrictNullSessAccess DWORD:1七、与其他文件共享协议的对比对比项SMB/CIFSNFSFTP/FTPS传输协议TCP 445TCP 2049TCP 21/20加密能力SMB3 原生 AES 加密需配合 KerberosFTPS/SFTP权限模型NTFS ACL细粒度Unix UID/GID用户密码AD 集成原生支持需额外配置不支持跨平台Windows 原生Linux 需 SambaLinux 原生全平台WAN 性能一般适合局域网较好取决于网络条件典型场景Windows 企业内网共享Linux 集群共享文件传输交互SMB 的核心优势在于 Windows 原生支持和 NTFS ACL 的细粒度权限控制。NFS 更适合 Linux 集群之间的高性能数据共享。两者在混合环境中各有分工。八、知识总结┌──────────────────────────────────────────────────┐ │ SMB 协议全景图 │ ├──────────────────────────────────────────────────┤ │ │ │ 版本演进 SMB1.0 → SMB2.0 → SMB3.0 → SMB3.1.1 │ │ ↑ SMB1 存在严重漏洞应禁用 │ │ │ │ 传输通道 端口 445主流 / 端口 139传统 │ │ │ │ 交互五阶段协商 → 认证 → 树连接 → 文件操作 → 断开 │ │ │ │ 认证方式 NTLMv2工作组/ Kerberos域环境 │ │ │ │ 安全机制 Signing防篡改/ Encryption防窃听 │ │ │ │ Linux 方案 Samba 服务端 / cifs-utils 客户端 │ │ │ └──────────────────────────────────────────────────┘理解 SMB 协议的关键在于把握两条主线一条是协议本身的版本演进从 SMB1 的简单实现到 SMB3 的企业级特性理解每个版本的改进方向另一条是安全模型的演进从明文 SMB 到 Signing 再到 Encryption理解不同安全机制解决的是哪类威胁。在当今的混合 IT 环境中SMB 仍然是 Windows 文件共享的事实标准。掌握它的原理与配置是每一个从事网络和系统运维的技术人员必备的基础能力。