文件共享的秘密 — SMB 与 NFS
📁 EP07: 文件共享的秘密 — SMB 与 NFS
预计时长: 12-15 分钟
难度级别: ⭐⭐⭐ 中级
前置知识: EP01 TCP/IP 基础、EP03 DNS
🎬 开场白 / Opening
[0:00 - 0:30]
大家好,欢迎回到 Windows 网络系列课程!
上一集我们用 NPS 管住了网络的大门,确保只有合法用户才能接入。 但用户接入网络是为了什么?——访问资源!
最基本的资源是什么?文件!
今天我们来聊聊 Windows 世界里最重要的文件共享协议——SMB。 它不仅仅是”共享文件夹”那么简单,整个 Windows 生态都建立在它之上!
📍 场景设定 / Scene
[0:30 - 1:30]
🏢 星辰科技的文件困境
项目经理老王冲进 IT 办公室:
“小明!我们项目组 8 个人要共享设计文件,大家现在用 U 盘和微信传来传去, 版本都乱了!上次小李用的还是上周的旧版本,差点出大事! 能不能搞个共享文件夹,大家都能访问的那种?”
小明觉得这简单——建个共享文件夹就行。但紧接着,研发部的张工也来了:
“小明,我们有 3 台 Linux 服务器跑编译任务,需要和 Windows 工作站共享代码。 Linux 那边习惯用 NFS,Windows 这边用 SMB,能不能都支持?”
而且 CTO 还提出了性能要求:
“我们的设计文件动辄几个 GB,传输速度必须快!能不能利用好服务器上的两块网卡?”
小明意识到,”共享文件夹”背后的技术远比想象的复杂——他需要深入了解 SMB 协议。
🧠 核心概念 / Core Concepts
[1:30 - 8:30]
📚 SMB:图书馆借阅系统
把 SMB 想象成一个图书馆的借阅系统:
| 图书馆 | SMB 概念 | 说明 |
|---|---|---|
| 📖 书籍 | 文件/目录 | 你要访问的资源 |
| 🏛️ 图书馆 | SMB Server | 存放文件的服务器 |
| 🪪 借书证 | SMB Session | 你的身份认证凭据 |
| 📋 借阅登记 | Tree Connect | 连接到某个共享文件夹 |
| 🤝 管理员 | SMB 协议 | 你和图书馆之间的沟通规则 |
💡 类比要点:你不直接去书架拿书(不直接访问磁盘),而是告诉管理员你要哪本书(通过 SMB 协议请求),管理员帮你找到并递给你(服务器处理请求并返回数据)。
而 NFS 就像另一家图书馆的借阅系统——规矩不同(协议不同),但目的一样(文件共享)。Linux 世界的图书馆用 NFS 规矩,Windows 世界的用 SMB 规矩。
📜 SMB 协议演进史
SMB 的发展是一部”不断打补丁”的进化史:
| 版本 | 发布年份 | 引入系统 | 关键改进 |
|---|---|---|---|
| SMB 1.0 / CIFS | 1990s | Windows NT | 最初版本,基于 NetBIOS,性能差 |
| SMB 2.0 | 2006 | Windows Vista / Server 2008 | 大幅简化命令,减少”聊天” |
| SMB 2.1 | 2009 | Windows 7 / Server 2008 R2 | 大 MTU 支持,持久句柄 |
| SMB 3.0 | 2012 | Windows 8 / Server 2012 | 🔥 革命性更新! |
| SMB 3.0.2 | 2013 | Windows 8.1 / Server 2012 R2 | 禁用 SMB 1.0 支持 |
| SMB 3.1.1 | 2015 | Windows 10 / Server 2016 | 加密协商改进,预认证完整性 |
⚠️ 安全警告:SMB 1.0 必须禁用! 2017 年的 WannaCry 勒索病毒就是利用 SMB 1.0 的 EternalBlue 漏洞传播的。如果你的环境还有 SMB 1.0,今天就关掉它!
🚀 SMB 3.x 的五大杀手级特性
1. SMB Multichannel — 多通道并行传输
传统模式(单网卡):
[客户端 NIC1] ──────────→ [服务器 NIC1]
带宽: 10 Gbps
Multichannel(多网卡):
[客户端 NIC1] ──────────→ [服务器 NIC1]
[客户端 NIC2] ──────────→ [服务器 NIC2]
带宽: 20 Gbps (聚合!)
- 自动检测:如果客户端和服务器都有多块网卡,SMB 会自动建立多个连接
- 负载均衡:数据自动分散到多个通道
- 故障转移:一块网卡挂了,流量自动切到另一块
- 无需配置:不需要 NIC Teaming,SMB 自己搞定!
2. SMB Direct — RDMA 绕过 CPU
传统文件传输:
应用 → 内核 → CPU 拷贝 → 网卡 → 网络
(CPU 很忙,延迟高)
SMB Direct (RDMA):
应用 → 网卡 → 网络
(CPU 几乎不参与,延迟极低!)
- 需要支持 RDMA 的网卡(iWARP, RoCE, InfiniBand)
- 常用于 Hyper-V 和 Storage Spaces Direct 场景
- 延迟可降低到微秒级别
3. SMB Encryption — 传输加密
- SMB 3.0: 支持 AES-128-CCM 加密
- SMB 3.1.1: 支持 AES-128-GCM 和 AES-256-GCM(更快更安全)
- 可以按共享文件夹级别或全局开启加密
- 替代方案对比:不需要 IPsec VPN 也能保护 SMB 流量!
4. SMB Signing — 防篡改
- 对每个 SMB 消息生成签名
- 防止中间人攻击修改文件内容
- Domain Controller 之间的 SMB 通信默认要求签名
- SMB 3.1.1 使用 AES-CMAC 算法(比旧的 HMAC-MD5 强得多)
5. SMB Compression — 压缩传输
- Windows Server 2022 / Windows 11 引入
- 对可压缩数据自动压缩后传输
- 支持 LZ77, LZ77+Huffman, LZNT1 算法
- 特别适合大文本文件、日志文件的传输
🌐 谁在依赖 SMB?
很多人以为 SMB 只是”共享文件夹”,其实 整个 Windows 基础设施都建立在 SMB 之上:
| 使用者 | 如何使用 SMB | 说明 |
|---|---|---|
| Hyper-V Live Migration | 通过 SMB 3.0 传输 VM 内存 | 虚拟机不停机迁移 |
| Failover Cluster CSV | Cluster Shared Volumes 基于 SMB | 多节点同时读写 |
| DFS / DFSR | DFS Namespace 和 Replication 依赖 SMB | 分布式文件系统 |
| SQL Server | SMB 3.0 上的数据库文件存储 | 高性能数据库后端 |
| Storage Spaces Direct (S2D) | 节点间数据通过 SMB Direct 传输 | 软件定义存储 |
| SYSVOL / NETLOGON | 域控制器的策略和脚本共享 | Active Directory 核心 |
| Group Policy | GPO 模板存储在 SYSVOL (SMB 共享) | 组策略分发 |
💡 关键认知:SMB 出问题 = 整个 Windows 生态出问题。这就是为什么理解 SMB 如此重要!
🐧 NFS:Linux 世界的文件共享
当你的环境中有 Linux 服务器时,需要了解 NFS (Network File System):
| 特性 | NFSv3 | NFSv4.1 |
|---|---|---|
| 状态 | 无状态 | 有状态 |
| 端口 | 动态端口 (portmap) | 固定 TCP 2049 |
| 安全 | AUTH_SYS (UID/GID) | Kerberos 支持 |
| 锁定 | 单独的 NLM 协议 | 内置锁定 |
| 防火墙友好 | ❌ 困难 | ✅ 单端口 |
Windows Server 可以同时充当 SMB Server 和 NFS Server:
Windows Server
├── SMB 共享: \\server\projects ← Windows 客户端访问
└── NFS 导出: server:/exports ← Linux 客户端挂载
🆚 SMB vs NFS 对比
| 维度 | SMB 3.1.1 | NFSv4.1 |
|---|---|---|
| 主要平台 | Windows | Linux/Unix |
| 认证 | Kerberos / NTLM | Kerberos / AUTH_SYS |
| 加密 | 内置 AES | 需要 Kerberos 5p |
| 多通道 | ✅ Multichannel | ✅ pNFS (Parallel NFS) |
| 性能 | 优秀 | 优秀 |
| 管理工具 | PowerShell / GUI | CLI (exportfs, mount) |
| Windows 集成 | 原生 | 需安装 NFS 组件 |
🏗️ 架构图解 / Architecture
[8:30 - 10:00]
SMB 会话建立流程
sequenceDiagram
participant C as 💻 SMB Client<br/>(小明的电脑)
participant S as 🗄️ SMB Server<br/>(文件服务器)
Note over C,S: === SMB 会话建立过程 ===
C->>S: ① SMB2 NEGOTIATE<br/>(我支持 SMB 2.0/2.1/3.0/3.1.1)
S->>C: ② NEGOTIATE Response<br/>(我们用 SMB 3.1.1 + AES-128-GCM)
Note over C,S: === 协议版本协商完成 ===
C->>S: ③ SESSION_SETUP Request<br/>(NTLM/Kerberos Token)
S->>C: ④ SESSION_SETUP Response<br/>(认证挑战/成功)
Note over C,S: === 身份认证完成 (Session 建立) ===
C->>S: ⑤ TREE_CONNECT<br/>(我要连接 \\Server\Projects)
S->>C: ⑥ TREE_CONNECT Response<br/>(连接成功, Tree ID = 1)
Note over C,S: === 共享连接完成 ===
C->>S: ⑦ CREATE (打开文件)<br/>(\\Projects\design.psd)
S->>C: ⑧ CREATE Response<br/>(File ID, 文件信息)
C->>S: ⑨ READ / WRITE<br/>(读写文件内容)
S->>C: ⑩ Response<br/>(文件数据)
C->>S: ⑪ CLOSE (关闭文件)
Note over C,S: 🔄 Multichannel 会自动<br/>在此过程中建立多个<br/>TCP 连接实现并行传输
SMB 生态系统全景
graph TB
subgraph Core ["🔵 SMB 协议核心"]
SMB[SMB 3.1.1 Protocol<br/>TCP 445]
end
subgraph Features ["✨ SMB 3.x 特性"]
MC[📡 Multichannel<br/>多网卡聚合]
SD[⚡ SMB Direct<br/>RDMA 零拷贝]
ENC[🔒 Encryption<br/>AES-GCM 加密]
SIGN[✍️ Signing<br/>防篡改签名]
COMP[📦 Compression<br/>数据压缩]
end
subgraph Consumers ["🏗️ 依赖 SMB 的服务"]
FS[📁 文件共享<br/>File Server]
HV[🖥️ Hyper-V<br/>Live Migration]
FC[🔗 Failover Cluster<br/>CSV]
DFS[🌐 DFS / DFSR<br/>分布式文件系统]
SQL[🗃️ SQL Server<br/>SMB 存储]
S2D[💾 Storage Spaces<br/>Direct]
AD[🏛️ SYSVOL / GPO<br/>Active Directory]
end
subgraph Security ["🔐 安全层 (来自 EP04/EP06)"]
FW[🧱 Windows Firewall<br/>TCP 445 规则]
NPS[🔑 NPS/RADIUS<br/>网络准入控制]
KERB[🎫 Kerberos<br/>身份认证]
end
SMB --> MC
SMB --> SD
SMB --> ENC
SMB --> SIGN
SMB --> COMP
FS --> SMB
HV --> SMB
FC --> SMB
DFS --> SMB
SQL --> SMB
S2D --> SMB
AD --> SMB
FW -.->|保护 TCP 445| SMB
NPS -.->|控制网络准入| SMB
KERB -.->|提供认证| SMB
style Core fill:#3498db,color:#fff
style SMB fill:#2980b9,color:#fff
SMB Multichannel 工作原理
graph LR
subgraph Client ["💻 客户端"]
CN1[NIC 1<br/>10.1.1.10]
CN2[NIC 2<br/>10.1.2.10]
end
subgraph Server ["🗄️ 服务器"]
SN1[NIC 1<br/>10.1.1.20]
SN2[NIC 2<br/>10.1.2.20]
end
CN1 -->|TCP 连接 1<br/>SMB Session| SN1
CN1 -->|TCP 连接 2| SN2
CN2 -->|TCP 连接 3| SN1
CN2 -->|TCP 连接 4<br/>SMB Session| SN2
Note1[📊 4 条 TCP 连接<br/>自动负载均衡<br/>聚合带宽<br/>故障自动切换]
style Note1 fill:#f39c12,color:#fff
style Client fill:#ecf0f1
style Server fill:#ecf0f1
🔧 实操演示 / Demo
[10:00 - 13:00]
Step 1: 检查 SMB 协议版本
# 查看服务器启用了哪些 SMB 版本
Get-SmbServerConfiguration | Select-Object EnableSMB1Protocol, EnableSMB2Protocol
# 确保 SMB 1.0 已禁用!(安全第一)
Set-SmbServerConfiguration -EnableSMB1Protocol $false -Force
# 检查 SMB 客户端配置
Get-SmbClientConfiguration | Select-Object EnableBandwidthThrottling, EnableMultiChannel
# 查看服务器支持的 SMB 方言版本
Get-SmbConnection | Select-Object ServerName, ShareName, Dialect
Step 2: 创建和管理 SMB 共享
# 创建一个共享文件夹
New-Item -Path "D:\SharedFolders\Projects" -ItemType Directory -Force
# 创建 SMB 共享
New-SmbShare -Name "Projects" `
-Path "D:\SharedFolders\Projects" `
-Description "项目组共享文件夹" `
-FullAccess "STARTECH\ProjectManagers" `
-ChangeAccess "STARTECH\Developers" `
-ReadAccess "STARTECH\Domain Users" `
-EncryptData $true # 强制加密!
# 查看所有共享
Get-SmbShare | Format-Table Name, Path, Description, EncryptData
# 查看共享的访问权限
Get-SmbShareAccess -Name "Projects" | Format-Table AccountName, AccessControlType, AccessRight
# 修改共享属性
Set-SmbShare -Name "Projects" -CachingMode None -Force # 禁用离线缓存
Step 3: 监控 SMB 连接和会话
# 查看当前的 SMB 连接(客户端视角)
Get-SmbConnection | Format-Table ServerName, ShareName, UserName, Dialect, NumOpens
# 查看当前的 SMB 会话(服务器视角)
Get-SmbSession | Format-Table SessionId, ClientComputerName, ClientUserName, NumOpens
# 查看打开的文件
Get-SmbOpenFile | Format-Table FileId, SessionId, Path, ClientComputerName, ClientUserName
# 断开特定用户的会话(管理员操作)
# Close-SmbSession -SessionId <ID> -Force
Step 4: SMB Multichannel 验证
# 查看 Multichannel 连接状态
Get-SmbMultichannelConnection | Format-Table ServerName, ClientInterfaceIndex,
ServerInterfaceIndex, ClientIpAddress, ServerIpAddress, Selected
# 查看 Multichannel 约束
Get-SmbMultichannelConstraint
# 查看服务器网络接口(SMB 可见的)
Get-SmbServerNetworkInterface | Format-Table InterfaceIndex, IpAddress,
LinkSpeed, RdmaCapable
# 查看客户端网络接口
Get-SmbClientNetworkInterface | Format-Table InterfaceIndex, IpAddress,
LinkSpeed, RdmaCapable, RssCapable
Step 5: SMB 安全配置
# 启用 SMB 加密(全局)
Set-SmbServerConfiguration -EncryptData $true -Force
# 启用 SMB 签名(拒绝未签名的连接)
Set-SmbServerConfiguration -RequireSecuritySignature $true -Force
# 查看完整的 SMB 服务器安全配置
Get-SmbServerConfiguration | Select-Object `
EncryptData, `
RejectUnencryptedAccess, `
RequireSecuritySignature, `
EnableSMB1Protocol, `
EnableSMB2Protocol
# 设定最低 SMB 加密算法(Server 2022+)
Set-SmbServerConfiguration -EncryptionCiphers "AES_256_GCM" -Force
# 审计 SMB 访问
Get-SmbShare -Name "Projects" | Set-SmbShare -FolderEnumerationMode AccessBased -Force
Step 6: NFS 服务器配置(跨平台场景)
# 安装 NFS Server 角色
Install-WindowsFeature FS-NFS-Service -IncludeManagementTools
# 创建 NFS 导出目录
New-Item -Path "D:\NFS-Exports\DevCode" -ItemType Directory -Force
# 创建 NFS 共享
New-NfsShare -Name "DevCode" `
-Path "D:\NFS-Exports\DevCode" `
-AllowRootAccess $true `
-Permission ReadWrite
# 配置 NFS 共享权限
Grant-NfsSharePermission -Name "DevCode" `
-ClientName "10.1.3.0/24" `
-ClientType Subnet `
-Permission ReadWrite `
-AllSquash $false
# 查看 NFS 共享
Get-NfsShare | Format-Table Name, Path, NetworkName
# Linux 客户端挂载命令:
# mount -t nfs4 fileserver:/DevCode /mnt/devcode
Step 7: 防火墙规则(连接 EP04)
# SMB 防火墙规则(大多数情况已默认存在)
Get-NetFirewallRule -DisplayGroup "File and Printer Sharing" |
Where-Object { $_.Enabled -eq "True" } |
Format-Table DisplayName, Direction, Action, Profile
# 如果需要手动创建 SMB 规则
New-NetFirewallRule -DisplayName "SMB Inbound" `
-Direction Inbound `
-Protocol TCP `
-LocalPort 445 `
-Action Allow `
-Profile Domain
# NFS 防火墙规则
New-NetFirewallRule -DisplayName "NFS Inbound" `
-Direction Inbound `
-Protocol TCP `
-LocalPort 2049 `
-Action Allow `
-Profile Domain
Step 8: SMB 性能诊断
# 查看 SMB 统计信息
Get-SmbServerConfiguration | Select-Object `
MaxChannelPerSession, `
AsynchronousCredits, `
MaxSessionPerConnection
# 使用 Performance Counter 监控 SMB
Get-Counter "\SMB Server Shares(*)\Current Open File Count"
Get-Counter "\SMB Server Shares(*)\Data Bytes/sec"
Get-Counter "\SMB Server Sessions(*)\*" -MaxSamples 1
# SMB 客户端诊断
Get-SmbConnection | Where-Object { $_.Dialect -lt "3.0" }
# 如果有低于 3.0 的连接,说明有旧客户端!
# 检查 SMB 直连 (RDMA) 状态
Get-NetAdapterRdma | Format-Table Name, InterfaceDescription, Enabled
📝 讲稿要点 / Script Notes
讲解节奏与过渡语建议:
- 从痛点开始
- “U盘传文件?微信发文件?这是 2003 年的做法!”
- 引发观众共鸣——大家都经历过版本混乱的痛苦
- SMB 不仅仅是”共享文件夹”
- 这是本集最重要的认知升级
- “你以为 SMB 只是右键共享?其实 Hyper-V、集群、AD 都离不开它!”
- 展示 SMB 生态系统图时,要逐个点亮每个依赖者
- 版本演进要讲故事
- “SMB 1.0 是 90 年代的产物,那时候大家还在用拨号上网”
- “2017 年 WannaCry 横扫全球,就是因为太多服务器还开着 SMB 1.0”
- “SMB 3.0 是 2012 年的革命——多通道、RDMA、加密,一步到位”
- Multichannel 用快递类比
- “以前一个快递员送货,现在四个快递员同时送,速度翻倍!”
- “而且一个快递员生病了,其他三个继续送,不影响”
- SMB 1.0 禁用要严肃
- “这不是建议,这是必须!SMB 1.0 就像一扇没有锁的门”
- 演示
Set-SmbServerConfiguration -EnableSMB1Protocol $false
- NFS 简要带过
- “NFS 是 Linux 世界的 SMB,当你有混合环境时需要了解”
- 不要深入 NFS 细节,点到为止
- 关联前面的知识
- “TCP 445——记得 EP01 的端口知识吗?”
- “Kerberos 认证——EP06 讲的 NPS/RADIUS 控制谁能接入网络,SMB 用 Kerberos 验证具体身份”
- “防火墙——EP04 的知识,SMB TCP 445 需要放行”
✅ 本集总结 / Summary
[13:00 - 14:00]
📁 关键知识点回顾
| # | 知识点 | 一句话总结 |
|---|---|---|
| 1 | SMB 协议 | Windows 文件共享的核心,不仅仅是共享文件夹 |
| 2 | SMB 版本 | 必须用 SMB 3.x,禁用 SMB 1.0! |
| 3 | Multichannel | 多网卡自动聚合,带宽翻倍 + 故障转移 |
| 4 | SMB Direct | RDMA 绕过 CPU,微秒级延迟 |
| 5 | SMB Encryption | AES-GCM 加密,无需 VPN 保护文件传输 |
| 6 | SMB 生态 | Hyper-V、集群、DFS、AD 都依赖 SMB |
| 7 | NFS | Linux 文件共享协议,Windows 可以同时支持 |
🧠 记忆口诀
SMB 文件共享王,四四五端口来帮忙;
一零版本必须关,三幺幺版最安强;
多通道聚合快,RDMA 直传不彷徨;
加密签名防篡改,生态系统都依赖;
NFS 对应 Linux 端,混合环境两手抓!
⚡ 小明的成果
经过这一集的学习,小明为星辰科技实现了:
- ✅ 创建了加密的 SMB 共享文件夹,项目组高效协作
- ✅ 禁用了 SMB 1.0,堵住了安全隐患
- ✅ 利用 Multichannel 实现了双网卡聚合,传输速度翻倍
- ✅ 部署了 NFS Server,让研发部的 Linux 服务器也能访问共享文件
- ✅ 配置了 ABE (Access-Based Enumeration),用户只能看到有权限的文件夹
👉 下集预告 / Next Episode
[14:00 - 14:30]
文件共享搞定了,但小明又听到新的抱怨——
深圳分公司的同事说:”下载文件太慢了!每次从北京总部拉文件要等半天!”
更糟糕的是,每月 WSUS 推送更新的时候,30 个人同时下载补丁, WAN 链路直接被打满,全公司上不了网…
下一集:📦 EP08 — 看不见的搬运工:WinHTTP, BITS 与 BranchCache
我们将认识那些在后台默默工作的网络组件—— 专业的 HTTP 代理(WinHTTP)、智能的后台传输(BITS)、以及 分支办公室的”本地仓库”(BranchCache)!
敬请期待!
📚 参考资源
📺 本集视频课程到此结束!
如果觉得有帮助,请点赞、收藏、关注,我们下集见! 👋