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 连接的正常处理。

相关推荐
LHICOD5 小时前
Linux-2
java·linux·后端·jar·vmware·svm·vm
小杨互联网5 小时前
Go 现代 CLI 工具离线镜像合集
开发语言·后端·golang·开源·go·命令行
lazy H5 小时前
【计算机网络】第 15 篇:Java BIO、NIO 与高并发网络通信——从 Socket 理解 I/O 模型
网络·后端·tcp/ip·计算机网络·nio·408
geovindu6 小时前
rust: Semaphore Pattern
开发语言·后端·设计模式·rust·代理模式·企业级信号量模式·同步型模式
Thneonl7 小时前
Claude Code 频繁 Compacting?发布次日我根治了 2 个痛点
后端·rust
环境栈笔记9 小时前
指纹浏览器安卓怎么用?从运行位置到功能验收,先把三种方案分清
前端·人工智能·后端·自动化
小小张说故事9 小时前
Python 的 list 为什么能装下任何类型?拆开 PyObject* 数组,以及它让你多付了多少内存
后端·python
小蒜学长10 小时前
基于SpringBoot 框架的自媒体新闻系统的设计与实现(代码+数据库+LW)
java·spring boot·后端·mysql数据库·自媒体新闻管理系统
IT_陈寒10 小时前
JavaScript实战技巧总结:深挖数组遍历的性能陷阱与实战解法
前端·人工智能·后端
学长毕设20 小时前
基于springboot的食品仓库管理系统
java·spring boot·后端