FSx for Windows 通过 DNS 别名访问失败:缺少 Kerberos SPN
FSx for Windows 通过 DNS 别名访问失败:缺少 Kerberos SPN
客户端无法通过 DNS 别名访问 FSx 文件服务器,抓包显示网络层全程可达,失败点在 Kerberos——KDC 找不到别名对应的服务主体。根因是别名缺少注册在 FSx AD 计算机对象上的 HOST/ SPN。
问题背景
客户端无法访问文件服务器 \\rexchinafsxp001,客户怀疑是安全组或路由(经过防火墙 ENI)导致访问不通,重点要求确认网络是否通。
环境信息(从抓包还原):
- 客户端:
10.204.16.133 - FSx 默认 DNS 名:
amznfsxbzputqee.b2b.regn.net→10.204.184.38 - DNS 别名(客户实际访问的名字):
rexchinafsxp001.b2b.regn.net - 域控/KDC:
10.221.161.37
排查信息
对客户端抓包分析,关键证据:
DNS 解析正常——别名是 CNAME,最终指向 FSx 本体:
rexchinafsxp001.b2b.regn.net CNAME amznfsxbzputqee.b2b.regn.net A 10.204.184.38网络层完全正常——到 FSx 445(SMB)和到 KDC 88(Kerberos)的 TCP 握手都成功,SMB2 Negotiate 也返回成功:
10.204.16.133 -> 10.204.184.38:445 SYN/SYN-ACK/ACK 正常
SMB2 Negotiate Protocol Response NT Status: STATUS_SUCCESS真正的失败点在 Kerberos——客户端向 KDC 请求别名对应的服务票据,KDC 返回错误码 7:
TGS-REQ SName: cifs/rexchinafsxp001 , cifs/rexchinafsxp001.b2b.regn.net
KRB-ERROR error_code 7 = KDC_ERR_S_PRINCIPAL_UNKNOWN拿不到票据后,SMB2 Session Setup 失败(STATUS_NO_LOGON_SERVERS),客户端 RST 断开并反复重试。
根因
rexchinafsxp001 是为 FSx 文件系统配置的 DNS 别名。客户端用别名访问共享时,会向 KDC 申请 cifs/rexchinafsxp001 的服务票据。但该别名对应的 HOST/ SPN 从未注册到 FSx 文件系统的 AD 计算机对象上,KDC 找不到这个服务主体。
所以这不是安全组、路由表或防火墙 ENI 的问题——网络是通的。快速验证方法:用 FSx 默认 DNS 名 amznfsxbzputqee.b2b.regn.net 访问通常不受影响,用此方法即可锁定是 SPN 问题。
启用 Kerberos 时,每个 DNS 别名需要两条 SPN:
HOST/rexchinafsxp001
HOST/rexchinafsxp001.b2b.regn.net解决方案
在一台加入了同一 AD 域的 Windows 实例上,以管理员身份执行。涉及修改 AD 计算机对象的 SPN,建议在变更窗口操作。
1. 安装 AD PowerShell 模块
Install-WindowsFeature RSAT-AD-PowerShell2. 检查别名 SPN 是否被占用
SPN 在域内必须唯一。新增前先确认别名的 HOST/ SPN 没有被其他计算机对象占用(比如迁移前的旧文件服务器):
$ALIAS = "rexchinafsxp001.b2b.regn.net"
SetSPN /Q ("HOST/" + $ALIAS)
SetSPN /Q ("HOST/" + $ALIAS.Split(".")[0])如果已存在,需先在旧对象上删除。
3. 为 FSx 计算机对象设置别名 SPN
$FSxDnsName = "amznfsxbzputqee.b2b.regn.net"
$Alias = "rexchinafsxp001.b2b.regn.net"
$FileSystemHost = (Resolve-DnsName $FSxDnsName | Where Type -eq 'A')[0].Name.Split(".")[0]
$FSxAdComputer = (Get-AdComputer -Identity $FileSystemHost)
Set-AdComputer -Identity $FSxAdComputer -Add @{"msDS-AdditionalDnsHostname" = @($Alias, $Alias.Split(".")[0])}4. 验证 SPN 已生效
$FileSystemDnsName = "amznfsxbzputqee.b2b.regn.net"
$FileSystemHost = (Resolve-DnsName ${FileSystemDnsName} | Where Type -eq 'A')[0].Name.Split(".")[0]
$FSxAdComputer = (Get-AdComputer -Identity ${FileSystemHost})
SetSpn /L ${FSxAdComputer}.Name确认结果包含 HOST/rexchinafsxp001 和 HOST/rexchinafsxp001.b2b.regn.net。
5. 客户端清票后重试
klist purge重新访问 \\rexchinafsxp001,确认共享可正常打开。
总结
本次故障与安全组、路由表、防火墙 ENI 无关,网络路径全程可达。根因是 DNS 别名缺少注册在 FSx AD 计算机对象上的 HOST/ SPN,导致 KDC 返回 KDC_ERR_S_PRINCIPAL_UNKNOWN、SMB 认证失败。补齐两条 SPN 后即可恢复。
建议每次为 FSx 关联新的 DNS 别名时,把「配置 SPN」纳入标准上线步骤。
