SMB服务器无法访问?一次PowerShell故障排查演练

SMB 访问 \\Data-Server-1 故障诊断报告

  • 日期:2026年2月26日 --- 2月27日
  • 受影响主机:本机(192.168.1.14,Windows),接口"以太网 2"
  • 目标服务器:Data-Server-1(192.168.1.9,NAS)
  • 解决方式:重启 Data-Server-1

1. 问题现象

  • 本机无法通过 \\Data-Server-1 访问 NAS 共享,连接挂起无响应。
  • 局域网内其它计算机访问同一 NAS 正常。
  • 本机此前可以正常访问,某次重启后出现故障。
  • 本机可以正常访问另一台服务器 \\Data-Server-2(映射为 Z: 盘)。

2. 诊断过程

2.1 网络连通性检查

Ping 和 TCP 端口均正常,但注意到名称解析到了 IPv6 链路本地地址

powershell 复制代码
ping Data-Server-1 -n 2
# → 成功,解析到 fe80::265e:beff:fe68:1a82%14(IPv6),延迟 <1ms

Test-NetConnection -ComputerName Data-Server-1 -Port 445
# → TcpTestSucceeded: True

2.2 名称解析检查

DNS 查询失败,名称通过 mDNS 解析,IPv6 地址排在 IPv4 前面

powershell 复制代码
nslookup Data-Server-1
# → *** UnKnown can't find Data-Server-1: Server failed(DNS 服务器 192.168.1.5 无此记录)

Resolve-DnsName Data-Server-1
# → 通过 mDNS (.local) 解析成功,返回 AAAA fe80::265e:beff:fe68:1a82 和 A 192.168.1.9

Resolve-DnsName Data-Server-1.local
# → 同上

[System.Net.Dns]::GetHostAddresses("Data-Server-1")
# → InterNetworkV6 - fe80::265e:beff:fe68:1a82%14(排在前)
# → InterNetwork   - 192.168.1.9

Select-String -Path "C:\Windows\System32\drivers\etc\hosts" -Pattern "Data-Server"
# → 无匹配(hosts 文件中无此条目)

2.3 地址选择策略检查

IPv6 优先级 (40) > IPv4 优先级 (35),系统会优先选择 IPv6 地址

powershell 复制代码
netsh interface ipv6 show prefixpolicies
# → 优先级 40  ::/0           (IPv6 通用)
# → 优先级 35  ::ffff:0:0/96  (IPv4 映射)

2.4 本机 SMB 服务与配置检查

所有服务正常运行,配置无异常。

powershell 复制代码
sc.exe query lanmanworkstation
# → STATE: 4 RUNNING

sc.exe query mrxsmb20
# → STATE: 4 RUNNING

Get-SmbServerConfiguration | Select-Object EnableSMB1Protocol, EnableSMB2Protocol
# → EnableSMB1Protocol: False, EnableSMB2Protocol: True

Get-SmbClientConfiguration | Select-Object EnableInsecureGuestLogons, RequireSecuritySignature, EnableSecuritySignature, EncryptionCiphers
# → EnableInsecureGuestLogons: True
# → RequireSecuritySignature: False
# → EnableSecuritySignature: True

Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" | Select-Object RequireSecuritySignature, EnableSecuritySignature, AllowInsecureGuestAuth
# → RequireSecuritySignature: 0, EnableSecuritySignature: 1

Get-NetFirewallRule -DisplayName "*SMB*" | Where-Object { $_.Enabled -eq 'True' }
# → 5 条规则,全部 Action=Allow,地址范围=Any(IPv4/IPv6 不区分)

Get-NetIPAddress -InterfaceAlias "以太网 2"
# → fe80::b453:3757:d53e:e3f4%14 (IPv6) / 192.168.1.14/24 (IPv4)

net use
# → Z: \\Data-Server-2\个人数据 OK(其他连接正常)

2.5 关键对比测试:IPv4 vs 主机名

IPv4 直连成功,主机名(走 IPv6)超时。定位到 IPv6 是问题所在。

powershell 复制代码
# IPv4 地址直连 --- 成功
$job = Start-Job { net use \\192.168.1.9\IPC$ 2>&1 }
$done = Wait-Job $job -Timeout 10
Receive-Job $job   # → "The command completed successfully."

# 主机名连接(系统选择 IPv6)--- 超时
$job = Start-Job { net use \\Data-Server-1\IPC$ 2>&1 }
$done = Wait-Job $job -Timeout 10
if (-not $done) { "TIMEOUT" }   # → "TIMEOUT"

# IPv4 地址列出共享 --- 成功
net view \\192.168.1.9
# → 个人数据, 公开发布, 公用软件, 组会PPT

2.6 IPv6 深层验证:TCP 通但 SMB 协议层无响应

TCP 连接到 NAS 的 IPv6 地址完全正常,但在该连接上 NAS 不响应 SMB 请求

powershell 复制代码
# IPv6 TCP 端口连通性 --- 成功
Test-NetConnection -ComputerName "fe80::265e:beff:fe68:1a82%14" -Port 445
# → TcpTestSucceeded: True

# 用 .NET Socket 建立 IPv6 TCP 连接 --- 成功
$socket = New-Object System.Net.Sockets.Socket(
    [System.Net.Sockets.AddressFamily]::InterNetworkV6,
    [System.Net.Sockets.SocketType]::Stream,
    [System.Net.Sockets.ProtocolType]::Tcp)
$ip = [System.Net.IPAddress]::Parse("fe80::265e:beff:fe68:1a82")
$ip.ScopeId = 14
$ep = New-Object System.Net.IPEndPoint($ip, 445)
$socket.Connect($ep)
# → Connected: True

# 在 IPv6 TCP 连接上发送 SMB2 Negotiate 请求 --- NAS 无响应
$negReq = [byte[]]@(
    0x00,0x00,0x00,0x66,             # NetBIOS header
    0xFE,0x53,0x4D,0x42,             # SMB2 magic
    0x40,0x00,0x00,0x00,0x00,0x00,   # Header
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,
    0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,             # Negotiate
    0x24,0x00,0x02,0x00,0x01,0x00,0x00,0x00,
    0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x02,0x02,0x10,0x02)
$socket.Send($negReq) | Out-Null
$buf = New-Object byte[] 256
$socket.ReceiveTimeout = 5000
$socket.Receive($buf)
# → 异常:连接方在一段时间后没有正确答复,或连接的主机没有反应(超时)
$socket.Close()

3. 根因

NAS 在 IPv6 上 TCP 层接受连接(445 端口开放),但 SMB 服务不处理 IPv6 上的请求 (不回复 SMB2 Negotiate),导致连接静默超时。Windows SMB 客户端在 TCP 连接成功后不会回退到 IPv4,整个连接卡死。

复制代码
mDNS 返回 IPv6(优先)+ IPv4 → 系统选择 IPv6 →
TCP 握手成功 → SMB Negotiate 发出 → NAS 不响应 → 无限等待

4. 解决

重启 Data-Server-1 后问题解决。 NAS 的 SMB 服务恢复了对 IPv6 连接的正常处理。

相关推荐
大道至简Edward2 小时前
Spring Boot 2.7 + JDK 8 升级到 Spring Boot 3.x + JDK 17 完整指南
spring boot·后端
透明人_x2 小时前
OpenClaw安装
人工智能·后端
程序员清风2 小时前
用了三年AI,我总结出高效使用AI的3个习惯!
java·后端·面试
用户8356290780512 小时前
自动化文档处理:Python 批量提取 PDF 图片
后端·python
Java不加班2 小时前
Java 并发入门:从0到1理解线程(实战+避坑指南)
后端
掘金者阿豪2 小时前
千日护航民生支付:一张交通卡背后的国产数据库硬核突围
后端
掘金者阿豪2 小时前
Copyparty+cpolar,随时随地访问你的私人文件库
后端
苏三说技术2 小时前
程序员必读的Prompt Engineering指南
后端
Jagger_2 小时前
一篇文章搞懂DIP依赖倒置原则
后端