协商是怎么发生的
连接建立时,客户端发送它支持的最低与最高协议版本,服务端在两个区间里挑自己能支持的最高版本回给对方。因此实际使用的版本由较弱一方决定:一台只支持 SMB1 的老设备接入新服务器,会让这条连接落到 SMB1,即使服务端本身支持 SMB3。企业环境因此通常做法是「服务端禁用 SMB1,老设备单独隔离或替换」,而不是为个别设备把全局版本调低。
基本信息
| 适用平台 | Windows Server/Windows 客户端、Samba 与 Linux cifs 客户端 |
|---|---|
| Windows 查看 | Get-SmbConnection、Get-SmbServerConfiguration |
| Linux 挂载 | mount -t cifs -o vers=3.1.1 指定版本 |
| Samba 侧 | server min protocol / client min protocol |
| 影响范围 | 加密、签名、多通道、连续可用等能力是否可用 |
主要版本与代表能力
| 版本 | 代表能力 | 现状 |
|---|---|---|
| SMB1 | 早期文件共享基础协议 | 已被主流系统弃用,建议禁用 |
| SMB2.0 | 请求流水线、更大读写块 | 仅用于兼容很老的系统 |
| SMB2.1 | 租约机制、大 MTU | 仍有老系统使用 |
| SMB3.0 | 端到端加密、多通道、连续可用共享 | 现阶段常见基线 |
| SMB3.1.1 | 预认证完整性校验、更强的加密算法套件 | 新环境优先目标 |
查看与指定版本
查看与指定版本
# Windows:查看当前连接实际协商到的版本与加密状态
Get-SmbConnection | Select-Object ServerName,Dialect,Encrypted,Signing
# Windows:查看服务端协议开关(改动前先确认老设备依赖)
Get-SmbServerConfiguration | Select-Object EnableSMB1Protocol,EnableSMB2Protocol
# Linux 客户端:显式指定版本,便于定位协商问题
mount -t cifs -o vers=3.1.1,username=svc,uid=1001 //10.0.0.20/share /mnt/share禁用 SMB1 前必须清点依赖它的设备:老旧网络存储、部分打印机与扫描仪的扫描到共享功能常年只用 SMB1。贸然全局关闭会直接中断这些设备,且它们往往无法升级。正确顺序是先盘点与隔离,再关闭。
排查协商问题
排查协商问题
Get-SmbConnection | Format-Table ServerName,Dialect,NumOpens -AutoSize # 逐连接看版本
Get-SmbServerConfiguration | Format-List EnableSMB* # 服务端开关全貌
smbclient -L //10.0.0.20 -m SMB3 # Linux 侧按版本探测
smbstatus --version # 确认客户端工具版本是否支持目标协议版本协商与安全能力的关系
加密、签名、多通道这些能力都不是开关式存在,而是依赖协商结果:连接落到 SMB2.1 就无法使用 SMB3 才提供的端到端加密。因此「为什么抓包看不到加密」这类问题,第一件事是确认这条连接实际协商到了哪个版本,而不是检查加密开关。