在香港服务器上使用Windows Server 2016部署Active Directory时,如何避免跨境同步延迟导致的身份验证失败?

今天凌晨,香港机房一批虚拟桌面突然集体“登不进”。客户端卡在“正在应用计算机设置”,RDP 过来抓日志,Kerberos 报时钟偏差,NETLOGON 报找不到合适的域控制器。抓包一看,客户端的 DNS 次级指到了内地的 DC,跨境链路 RTT 飙到 250–400ms 且抖动 100ms+。当时正好有人在改密码,密码还没来得及复制,现场所有人都以为 AD “挂了”。
这次事故之后,我把“认证必须就近完成、复制可以慢一点但要可靠”当作铁律,重做了香港站点的 AD 架构。下面是我完整的方法、参数和踩坑记录。
目标与思路
让香港的身份验证完全本地化:香港客户端只向香港的 DC/DNS 说话;跨境链路只承载 AD 复制,不参与登录关键路径。复制慢一点没关系,但要稳定、可观测、可快速恢复。
现场环境与参数(我当时的实际配置)
机房与链路
| 地点 | 角色 | 回程带宽 | 典型 RTT | 抖动 (p95) | 丢包 |
|---|---|---|---|---|---|
| HK (Equinix) | 生产站点、承载 VDI/应用 | 1 Gbps(95th 计费) | 18–22 ms(至广州运营商) | 8–15 ms | <0.3% |
| CN(总部) | 原域林的核心站点(PDCe 在此) | 1 Gbps | 30–60 ms(省内),跨境 200–400 ms | 50–120 ms | 0.5–2%(高峰) |
服务器与虚拟化
| 名称 | 型号/虚拟化 | CPU | 内存 | 系统盘 | 数据盘 | 网卡 | 角色 |
|---|---|---|---|---|---|---|---|
| HK-DC01 | Dell R740xd / ESXi 7.0 | Xeon Silver 4210R ×2 | 64 GB | 2 × 480 GB SSD(RAID1) | 1 × 960 GB SSD | 2 × 10GbE(聚合) | 可写 DC + DNS + GC |
| HK-DC02 | 同上 | 同上 | 64 GB | 同上 | 同上 | 同上 | 可写 DC + DNS + GC(冗余) |
| HK-ROUTER | SD-WAN 设备 | N/A | N/A | N/A | N/A | 2 × 1GbE | IPSec/GRE,限速与 QoS |
Windows 版本:Windows Server 2016 Standard(1607 + 最新补丁),森林/域功能级别 2012 R2(与总部兼容)。SYSVOL 已是 DFSR,不再使用 FRS。
拆解问题的“根因”
- DC 定位不就近:客户端 DNS 次级指向跨境 DC(甚至轮换成首选),导致 DC Locator 解析到远端站点,Kerberos/TGT 发往远端。
- 复制延迟/丢包:密码刚改完、组策略刚发布,远端 DC 还未收到,出现“密码不正确”或策略不一致。
- 时间源不一致:跨境抖动导致 NTP 超时,出现 KRB_AP_ERR_SKEW。
- RPC/防火墙/MTU:跨境链路对 RPC 片段不友好(1722/1753 错),复制通道不稳。
- 站点/子网缺失:没有为香港的网段建立 AD 子网映射,DC Locator 无法将客户端归属到 HK 站点。
我落地的整体方案
- 在香港部署两台可写 DC(同时为 DNS、GC),组成 HK-SITE。
- 为香港所有网段建立 AD 子网,映射到 HK-SITE。
- 客户端仅使用香港 DNS(DHCP 006 仅下发本地 DC),不配置跨境 DC 为任何层次的备用 DNS。
- CN-SITE 与 HK-SITE 建立独立站点链接,复制只走这个链路;成本(Cost)高于本地,复制窗口可控,间隔 15 分钟,启用变更通知。
- 统一时间:PDCe(在 CN)对可信公网 NTP;HK-DC01/02 从 PDCe 同步,香港客户端从本地 DC 同步。
- 约束 RPC 端口范围,匹配跨境防火墙策略;调整 MTU(1400)避免分片。
- 开启 TryNextClosestSite 与 SRV TTL 调整,确保客户端优先最近站点。
- 做好 repadmin/dfsrdiag/dcdiag 的日常巡检与告警。
实操:一步步把“认证”留在香港
1)安装与预检
# 打补丁、基础角色
sconfig # 设主机名、域/工作组、Windows Update、远程管理
Install-WindowsFeature AD-Domain-Services -IncludeManagementTools
Install-WindowsFeature DNS -IncludeManagementTools
# 网络连通性基线
Test-NetConnection dc-cn-01.contoso.com -Port 135
Test-NetConnection dc-cn-01.contoso.com -Port 389
Test-NetConnection dc-cn-01.contoso.com -Port 445
# 跨境延迟采样
1..50 | ForEach-Object {Test-Connection dc-cn-01 -Count 1 -Quiet:$false | Select Address,ResponseTime}
经验谈:跨境 RTT 波动大时,不要在这个阶段急着促通复制,先把香港站点“本地自洽”起来。
2)规划 AD 站点与子网(关键)
Import-Module ActiveDirectory
# 创建站点
New-ADReplicationSite -Name "HK-SITE"
# 创建与映射子网(示例网段按你实际环境)
New-ADReplicationSubnet -Name "10.18.0.0/16" -Site "HK-SITE"
New-ADReplicationSubnet -Name "10.19.0.0/16" -Site "HK-SITE"
# 创建站点链接(IP 传输),设成本和复制频率(15 分钟)
New-ADReplicationSiteLink -Name "CN-HK" -SitesIncluded "CN-SITE","HK-SITE" `
-Cost 200 -ReplicationFrequencyInMinutes 15 -InterSiteTransportProtocol IP
# 开启站点间变更通知(降低等待)
Set-ADReplicationSiteLink -Identity "CN-HK" -Options USE_NOTIFICATIONS
# 可选:显式桥头服务器(跨境更可控)
# Set-ADReplicationConnection / 指定 Bridgehead,有需要再上
检查客户端归属站点(部署后在客户端):
nltest /dsgetsite
echo %LOGONSERVER%
3)在香港提升为域控制器(可写 DC,强烈推荐)
# 在 HK-DC01 / HK-DC02 上分别执行
Install-ADDSDomainController `
-DomainName "contoso.com" `
-InstallDns `
-SiteName "HK-SITE" `
-NoGlobalCatalog:$false `
-SafeModeAdministratorPassword (Read-Host -AsSecureString "DSRM Password") `
-Force
为什么不用 RODC? RODC(只读 DC)在极端安全要求下是选项,但会遇到密码缓存策略(PRP)与写入转发限制,一旦跨境复制不畅,“刚改的密码”在本地可能不可用。我们要的就是“本地可写+本地就地认证”。
4)DNS 设计:让香港客户端只找香港 DC
DHCP 006 仅下发本地 DNS:HK-DC01、HK-DC02。
不向香港客户端下发任何跨境 DNS 地址。
在 DNS 服务器上开启转发器(Forwarders)指向香港本地递归(或权威)递归器/公共 DNS(就近,非跨境)。
# 在 HK-DC01 设置转发器
Add-DnsServerForwarder -IPAddress 8.8.8.8, 1.1.1.1 # 例子:按你的合规要求替换
Get-DnsServerForwarder
坑点复盘:当初事故的直接原因就是 “为了冗余”把 CN-DC 加成香港客户端的次级 DNS。Windows 客户端在解析失败/超时时会轮转且记忆成功的服务器,于是次级“变首选”,坑就来了。
5)时间同步:统一、就近、可观测
PDC Emulator(在 CN) 对可靠外部 NTP;
其他 DC 对 PDCe;
域内客户端 对本地 DC(默认即可)。
# 在 PDCe 上
w32tm /config /manualpeerlist:"time.windows.com,0x8" /syncfromflags:manual /reliable:yes /update
net stop w32time & net start w32time
w32tm /resync
# 在 HK-DC01/02(跟随域层级,通常不必改)
w32tm /query /status
w32tm /query /peers
别动 Kerberos 的 5 分钟时钟容忍度。跨境时钟漂移不是靠放宽容忍解决的,而是靠让香港客户端永远对香港 DC 校时。
6)复制与 SYSVOL(DFSR)优化
站点间复制已经设为 15 分钟 + 变更通知。对 SYSVOL(DFSR)我做了两件事:
- 预热(preseed):大体量策略/脚本先预拷,减轻首轮复制压力。
- DFSR 背压监控。
# 预热(在 CN 的 SYSVOL 上向 HK 手工预拷一次)
robocopy \\cn-dc\SYSVOL \\hk-dc01\SYSVOL /B /E /COPYALL /R:2 /W:2 /MT:16
# 观察 DFSR backlog
dfsrdiag backlog /rgname:"Domain System Volume" /rfname:"SYSVOL Share" `
/smem:CN-DC01 /rmem:HK-DC01
7)让客户端“只找最近的 DC”
:: 在 HK-DC01/02 上启用 TryNextClosestSite(注册表)
reg add HKLM\SYSTEM\CurrentControlSet\Services\Netlogon\Parameters ^
/v TryNextClosestSite /t REG_DWORD /d 1 /f
:: 降低 Netlogon 发布的 SRV 记录 TTL(更快收敛)
reg add HKLM\SYSTEM\CurrentControlSet\Services\Netlogon\Parameters ^
/v DnsRefreshInterval /t REG_DWORD /d 300 /f
net stop netlogon & net start netlogon
这两条能明显减少“客户端意外命中远端站点 DC”的概率,结合正确的子网映射,效果拔群。
8)防火墙与 RPC 端口范围(跨境复制专用)
必开端口(站点间):
| 用途 | 端口/协议 |
|---|---|
| RPC 端口映射 | TCP 135 |
| 动态 RPC | TCP 49152–65535(或自定义范围) |
| LDAP/LDAPS | TCP/UDP 389、TCP 636 |
| Kerberos | TCP/UDP 88 |
| SMB/DFS | TCP 445 |
| 全球编录 | TCP 3268/3269 |
| DFSR | TCP 5722 |
约束 RPC 动态端口范围(跨境更好管控):
# 将 RPC 动态端口收敛到 20000–21000
New-ItemProperty -Path "HKLM:\Software\Microsoft\Rpc\Internet" -Name Ports -Value "20000-21000" -PropertyType MultiString -Force
New-ItemProperty -Path "HKLM:\Software\Microsoft\Rpc\Internet" -Name PortsInternetAvailable -Value "Y" -PropertyType String -Force
New-ItemProperty -Path "HKLM:\Software\Microsoft\Rpc\Internet" -Name UseInternetPorts -Value "Y" -PropertyType String -Force
MTU 黑洞(很常见):跨境 IPSec/GRE 叠加后 MTU 不够,RPC/SMB 分片丢包。我的解法是香港到 CN 的隧道统一 MTU 1400,并对 SMB/RPC 打了 QoS。
9)客户端侧“只用本地 DNS”的落地
DHCP Scope 006/015:只给 HK-DC01、HK-DC02,域名后缀 contoso.com。
GPO 禁止本地网卡写入额外 DNS(如 VPN 客户端乱加)。
# DHCP(示例):
netsh dhcp server scope 10.18.0.0 set optionvalue 006 IPADDRESS 10.18.0.10 10.18.0.11
netsh dhcp server scope 10.18.0.0 set optionvalue 015 STRING "contoso.com"
我也把 VPN 客户端的“强制 DNS”策略切到仅入内网域后缀才走隧道(NRPT 类似思路),避免覆盖本地 DNS。
验证与演练:拔掉跨境也要能登
演练 1:断跨境隧道
断开 CN-HK 的 SD-WAN 隧道;
在香港客户端:nltest /dsgetsite 应为 HK-SITE;echo %LOGONSERVER% 应为 \HK-DC01/02;
新建本地域用户/组、刷新策略、登录测试不应受影响。
演练 2:密码修改与登录窗口
在香港修改某测试账户密码;
立刻在香港其他机器用新密码登录,应当成功(同站点内 DC 已即时生效);
恢复跨境后观察 repadmin /replsummary、dfsrdiag backlog 收敛时间。
常用检查命令
repadmin /replsummary
repadmin /showrepl
repadmin /queue
dcdiag /v
klist get host/%COMPUTERNAME%
klist purge
真实踩坑与救火记录
坑 1:次级 DNS“反客为主”
现象:客户端明明配置了 HK-DC 为首选、CN-DC 为次选,但登录却跑去 CN-DC。
原因:一次解析/超时后,客户端记住了 CN-DC 并优先使用。
解决:香港客户端彻底移除 CN-DC;开启 TryNextClosestSite;降低 SRV TTL;子网映射全补齐。
坑 2:RPC 1722/1753 复制失败
现象:repadmin /showrepl 看到跨站点间歇性失败。
原因:跨境 MTU、丢包;动态 RPC 端口没放行全。
解决:收敛 RPC 端口 20000–21000;隧道 MTU 1400;对 SMB/RPC 打高优 QoS;失败后 repadmin /syncall /APeD 触发收敛。
坑 3:密码刚改就“ผิด密”
现象:香港刚改密码,在部分香港机器上立即可用,部分提示错误。
原因:那部分机器因为历史 DNS 记忆找了 CN-DC。
解决:清理客户端 DNS 缓存、重申仅本地 DNS;GPO 下发脚本检查 %LOGONSERVER% 不在 HK 则报警。
坑 4:JRNL_WRAP_ERROR 导致 SYSVOL 未共享
现象:策略不落地,事件日志见 JRNL_WRAP_ERROR。
解决:按微软步骤重建 DFSR 数据库(谨慎),并先做 robocopy 预热 再入域。
坑 5:Lingering Objects
症状:repadmin /replsum 出现对象不一致。
处理:确认 TombstoneLifetime、关闭旧 DC,使用 repadmin /removelingeringobjects 清理,再全量同步。
可选方案:RODC(只读 DC)怎么用才不踩雷
如果合规要求香港只能放 RODC:
精准定义 Password Replication Policy (PRP) 仅允许香港用户/计算机组;
预缓存需要登录的账号密码:
# 将用户/计算机密码预复制到 RODC
repadmin /rodcpwdrepl hk-rodc01 "CN=HK Users,OU=HK,DC=contoso,DC=com"
repadmin /prp view hk-rodc01 /allows
仍需确保香港 DNS 指向 RODC(它也能承载 DNS);
密码刚改完到处可用的体验,明显不如可写 DC,但在“强安全”要求下是权衡之选。
监控与日常巡检(我上线的清单)
- 每 15 分钟:repadmin /replsummary 采样,失败率 >2% 告警。
- DFSR backlog:超过 500 条持续 10 分钟告警。
- 事件日志:KDC(4768/4769)、NETLOGON(5719)、DFSR(2213)集中收集。
- 时钟偏差:w32tm /monitor 偏差 > 1000ms 告警。
- 客户端抽样:随机 50 台拉取 %LOGONSERVER%,不是 HK-DC 则告警。
简单的巡检脚本雏形(放在任务计划里跑):
$repl = repadmin /replsummary
if ($repl -match "fails:\s+([1-9]\d*|\d+.\d+)%") {
# 失败率>0 进一步解析,发到 Teams/邮件(略)
}
$dfsr = dfsrdiag backlog /rgname:"Domain System Volume" /rfname:"SYSVOL Share" /smem:CN-DC01 /rmem:HK-DC01
if ($dfsr -match "Backlog File Count:\s+(\d+)") { if ([int]$Matches[1] -gt 500) { # 告警 } }
| 项 | 值/策略 |
|---|---|
| HK-SITE 复制频率 | 15 分钟 + 变更通知 |
| CN-HK 站点链接成本 | 200(本地<跨境) |
| RPC 动态端口 | 20000–21000 |
| 隧道 MTU | 1400 |
| 客户端 DNS | 仅 HK-DC01/HK-DC02 |
| TryNextClosestSite | 启用 |
| SRV TTL | 300s |
| PDCe 时间源 | 外部可靠 NTP |
| 客户端时间源 | 本地 DC(域默认) |
FAQ(我常被问到)
复制能不能更频繁?
能,但跨境不稳时意义不大。变更通知+15 分钟是一个稳妥起点,核心在于认证不依赖跨境。
为什么两台可写 DC?
防单点,做补丁/重启窗口时不停服务。DNS 同步、GC 查询也更快。
客户端一定不能配跨境 DNS 吗?
在我的经验里:一定不要。冗余应该在站点内实现,而不是跨境。
收尾:Checklist(照着做,基本不会再被跨境延迟卡住)
- 在香港建 HK-SITE 与子网映射
- 提升 两台可写 DC(含 DNS、GC) 到 HK-SITE
- DHCP 006 仅下发香港 DNS,移除一切跨境 DNS
- 建立 CN-HK 站点链接:Cost 200、15 分钟、变更通知
- PDCe 外部授时,香港 DC/客户端就近授时
- RPC 端口收敛 + 防火墙放通 + 隧道 MTU=1400
- 启用 TryNextClosestSite + 降 SRV TTL
- DFSR 预热 + backlog 监控
- 日常 repadmin/dfsrdiag/dcdiag 巡检与告警
- 演练:断跨境,确认香港登录/策略不受影响
我们解决“跨境延迟导致的身份验证失败”的关键,不是去和延迟硬刚,而是架构上把跨境从认证路径中拿掉:本地 DC、本地 DNS、本地时间、本地可写,跨境只做复制。这样即便链路再抖,香港用户也丝滑登录,跨境只是“同步变更”的后台通道。以上步骤我在生产环境里反复验证过——落地后,这类凌晨告警基本就绝迹了。