在香港服务器运行 Windows Server 2019 时,我是如何把多节点 Active Directory 搭成“跨区域不趴窝”的?

香港机房NOC 的大屏上,来自华南和东南亚几个办公点的登录失败告警像鞭炮一样一串串炸出来。那一刻我靠在 42U 的机柜门上,手里还拿着刚插上的 crash cart(带屏幕的那种小推车),脑子里只有一个念头:把香港这对新上的 Windows Server 2019 域控顶起来,撑住跨区域认证。
三天后,我们把多站点 AD、站点链路、GC、RODC、DFS-R、NTP 一口气全盘拉通。再过两周,南海某次海缆抖动,登录量陡增,没有一位同事再因为跨区认证卡在旋转的小圈里。下面,是我按真实现场一路踩、一路修,最后落地的完整做法与坑点总结。
目标与场景
场景:总部与研发在华南,运营与财务在新加坡,CDN与托管在香港机房(BGP 线路,延迟对内陆/东南亚都相对均衡)。
目标:
- 就近认证:用户优先命中本区域域控(DC),跨区故障时平滑回切;
- 抗网络抖动:海缆/跨境链路波动时不拖垮登录;
- 一致性与安全:SYSVOL 用 DFS-R,敏感分支使用 RODC,时间/NTP、DNS、站点链路都可观测、可回滚。
物理与虚拟化规划(含产品参数)
| 角色 | 机房/站点 | 形态 | 型号/资源 | 存储 | NIC | OS | 备注 |
|---|---|---|---|---|---|---|---|
| DC-HK-01 (GC, PDC) | Hong Kong | 物理 | Dell PowerEdge R650;Xeon Silver 4310 ×1;128GB RAM | OS: RAID1 (2×480GB SATA SSD);数据: RAID1 2×1.92TB NVMe | 2×10G (LACP) | Windows Server 2019 Datacenter | FSMO 全部在初期放此,后再分摊 |
| DC-HK-02 (GC) | Hong Kong | 虚拟(Hyper-V) | vCPU 8;64GB RAM | 虚盘 200GB(独立 vVHDX) | 2×10G(vSwitch 绑定) | Windows Server 2019 Datacenter | 与 01 同机柜不同电源轨 |
| DC-SG-01 (GC) | Singapore | 物理 | HPE DL360 Gen10;Xeon Gold 5218;96GB RAM | RAID1 2×960GB SSD | 2×10G | Windows Server 2019 Datacenter | GC+DNS 辅助东南亚 |
| RODC-GZ-01 (RODC) | Guangzhou | 虚拟(VMware) | vCPU 4;16GB RAM | 150GB | 1×1G | Windows Server 2019 Standard | 只读域控,预缓存密码白名单 |
现场小插曲:PDC(主域控模拟器)别跑在会开启宿主机时间同步的虚拟机上。我把 PDC 放物理机,Hyper-V 的其他 DC 全关掉“时间同步集成服务”,避免时间漂移把 Kerberos 搞死。
网络与站点规划
域:corp.example.com;Forest/Domain Functional Level:Windows Server 2016(2019 并无更高级别)
子网与站点(务必完整映射,否则 DC 定位会乱选):
| 站点 | 子网 (CIDR) | 说明 | 站点链路成本 | 典型 RTT |
|---|---|---|---|---|
| HK | 10.10.0.0/22, 10.10.8.0/24 | 机房 VLAN 10/20 | - | 0.5–2 ms |
| SG | 10.20.0.0/23 | 新加坡办公室 | 80 | 35–45 ms |
| GZ | 10.30.0.0/23 | 华南办公室 | 60 | 20–30 ms |
站点链路(Site Link)与复制策略:
- HK–GZ 成本 60,HK–SG 成本 80(成本越小越优先)。
- 复制计划:24×7 开放(跨区链路稳定后再按低峰收紧)。
- 默认启用站点链路桥接(拓扑简单,保持默认即可)。
端口放行(全部 DC、DC 与 DC、客户端与本地 DC 均需妥善放开):
- TCP/UDP 53 (DNS), TCP/UDP 88 (Kerberos), TCP 135 (RPC), TCP 389/636 (LDAP/LDAPS), TCP 445 (SMB), TCP 3268/3269 (GC/GC-SSL), UDP 123 (NTP), TCP 5722 (DFS-R),以及 RPC 动态端口 49152–65535/TCP。
部署分两种:全新森林与接入现网(我两种都做过)
A. 全新森林(从零开局)
在 DC-HK-01 上装 AD DS 与 DNS 并建林:
Install-WindowsFeature AD-Domain-Services, DNS -IncludeManagementTools
Install-ADDSForest `
-DomainName "corp.example.com" `
-DomainNetbiosName "CORP" `
-ForestMode Win2016 `
-DomainMode Win2016 `
-InstallDNS:$true `
-NoRebootOnCompletion:$false
把 DC-HK-01 设为外部 NTP 对时(PDC 角色所在机):
# 外部 NTP 源(示例:pool.ntp.org 与香港天文台)
w32tm /config /manualpeerlist:"0.hk.pool.ntp.org 1.hk.pool.ntp.org time.stdtime.gov.hk" /syncfromflags:manual /reliable:yes /update
w32tm /resync /force
w32tm /query /status
新建 AD 站点与子网并关联(在 任一域控 PowerShell):
Import-Module ActiveDirectory
New-ADReplicationSite -Name "HK"
New-ADReplicationSite -Name "SG"
New-ADReplicationSite -Name "GZ"
New-ADReplicationSubnet -Name "10.10.0.0/22" -Site "HK"
New-ADReplicationSubnet -Name "10.10.8.0/24" -Site "HK"
New-ADReplicationSubnet -Name "10.20.0.0/23" -Site "SG"
New-ADReplicationSubnet -Name "10.30.0.0/23" -Site "GZ"
New-ADReplicationSiteLink -Name "HK-GZ" -SitesIncluded "HK","GZ" -Cost 60 -ReplicationFrequencyInMinutes 15
New-ADReplicationSiteLink -Name "HK-SG" -SitesIncluded "HK","SG" -Cost 80 -ReplicationFrequencyInMinutes 15
加入 DC-HK-02 / DC-SG-01 并晋升为域控(勾选 Global Catalog):
# 在目标服务器先装 AD DS
Install-WindowsFeature AD-Domain-Services -IncludeManagementTools
# 晋升为 DC & GC
Install-ADDSDomainController `
-DomainName "corp.example.com" `
-NoGlobalCatalog:$false `
-InstallDNS:$true `
-SiteName "HK" # 或 "SG"
在 GZ 分支上部署 RODC(只读域控):
# 预设可缓存密码的组(白名单)
Add-ADGroupMember "Allowed RODC Password Replication Group" "CN=Sales,CN=Users,DC=corp,DC=example,DC=com"
# 安装并晋升 RODC
Install-WindowsFeature AD-Domain-Services -IncludeManagementTools
Install-ADDSDomainController `
-DomainName "corp.example.com" `
-ReadOnlyReplica:$true `
-SiteName "GZ" `
-InstallDNS:$true
DNS 转发/条件转发(对内外服务域分流):
# 统一外部转发器
Add-DnsServerForwarder -IPAddress 1.1.1.1,8.8.8.8
# 私有云/内网域的条件转发(示例)
Add-DnsServerConditionalForwarderZone -Name "priv.cloud.example" -MasterServers 10.99.0.10,10.99.0.11
SYSVOL 确认 DFS-R(Server 2019 默认 DFS-R,但要检查):
dfsrdiag PollAD
Get-DfsrMembership
B. 接入现网(已有森林/域,向香港补多节点)
确认现网 FSMO、SYSVOL、站点/子网是否规范;先在现网补全站点与子网映射,再把 DC-HK-01/DC-HK-02/DC-SG-01 逐一晋升为 DC(优先让 HK 站点至少有 2 台 GC)。
迁移 FSMO 至 DC-HK-01(PDC、RID、Infrastructure、Schema、Naming 先集中,稳定后再分摊):
Move-ADDirectoryServerOperationMasterRole -Identity "DC-HK-01" -OperationMasterRole 0,1,2,3,4 -Confirm:$false
客户端 首选 DNS 指向本地站点 DC;容灾 DNS 指向就近第二站点 DC(不要让广州的 PC 直接指向新加坡)。
验证与观测(上线当天我做的检查单)
拓扑与复制健康:
repadmin /replsummary
repadmin /showrepl * /csv > C:\repl.csv
dcdiag /v /c /e /s:DC-HK-01
(Get-ADDomainController -Filter *).Name
客户端站点定位(在各地一台客户端):
nltest /dsgetsite
nltest /dsgetdc:corp.example.com
GC 命中(随机一台客户端 LDAP 查询,或看 3268 端口连通):
Test-NetConnection -ComputerName DC-HK-01 -Port 3268
NTP 收敛:
w32tm /query /status
w32tm /query /peers
DFS-R 积压(SYSVOL):
Get-DfsrBacklog -SourceComputerName DC-HK-01 -DestinationComputerName DC-HK-02 -GroupName "Domain System Volume"
调优:让“就近认证 + 容灾回切”更顺滑
GC 布局:每个区域至少一台 GC;香港两台都开 GC,让大多数 UPN 登录不跨区查全局编录。
SRV 记录 TTL:默认 15 分钟通常够用;跨区抖动频繁时可降到 600s,加快客户端更新(慎改,权衡 DNS 负载)。
站点链路成本:让 HK–GZ 更低于 HK–SG,使华南优先走香港。
组策略(GPO):
- 关闭“始终等待网络”可加快开机,但域环境建议保留默认;
- 登陆脚本/驱动映射尽量靠近用户站点的文件服务与打印服务。
客户端 DNS:首选 = 本站点 DC,备选 = 邻近站点 DC;不要把 8.8.8.8 这种外部 DNS 放在域内客户端上。
只读域控(RODC):为弱网络/不可信分支点部署,预缓存常用用户密码,断网时也能本地校验。
典型坑与现场解法
动态 RPC 端口被边界防火墙拦了
现象:repadmin 报 RPC 不可达,dcdiag 报 1722。
解法:在 DC 到 DC 的互通路径上放开 49152–65535/TCP;若必须收敛范围,可按 MS 文档固定 RPC 端口范围并同步更新防火墙策略(变更窗口做)。
时间漂移导致 Kerberos 失败(KRB_AP_ERR_SKEW)
现象:偶发“凭据不正确”,事件日志里时间偏差。
解法:PDC 只跟外部 NTP,其他 DC/成员机跟域层级同步;虚拟化平台取消对 DC 的主机时间强制同步。
SYSVOL 队列爆炸(杀毒/EDR 锁文件)
现象:Get-DfsrBacklog 长期不清;登录慢、GPO 不生效。
解法:给 %windir%\SYSVOL 目录加实时扫描排除;DFS-R 事件 2213 需按官方步骤恢复复本。
GC 布局不当(UPN 跨区查目录)
现象:登录随机卡顿,峰值命中远端 3268。
解法:把 GC 布在用户聚集区域;香港两台都开 GC,SG 至少一台开 GC。
客户端 DNS 胡乱配置
现象:广州的 PC 首选 DNS 指到新加坡,登录绕远。
解法:GPO 统一发放本地 DC 为首选,邻近站点为备选;移除公共 DNS。
快照回滚引发 USN 回退
现象:复制停滞,事件提示 USN 回退。
解法:绝不对域控做“快照还原”;备份用 Windows Server Backup 的系统状态,还原按权威/非权威步骤走。
我用的上线回归用例(部分)
- 认证路径:断开 HK–SG 站点链路,广州用户仍命中 HK 的 DC 登录成功;恢复后无残留错误。
- 单 DC 故障:停 DC-HK-01 的 Netlogon 与 KDC 服务,客户端自动切到 DC-HK-02,登录耗时 < 2s 增量。
- GPO 下发:新建一条测试 GPO 修改壁纸,5 分钟内广州/香港客户端均生效。
- DNS 解析:各站点 nslookup -type=SRV _ldap._tcp.site1._sites.dc._msdcs.corp.example.com 命中本地 DC。
- 时间一致性:各站点 w32tm /stripchart /computer:DC-HK-01 /samples:5 /dataonly 偏差 < ±50ms。
运行与告警
关键事件(做订阅/转发到 SIEM):
- 拓扑/复制:1311/1566/1865(站点/复制问题)、2042(滞留对象)、DFS-R 2213/2212;
- DNS:4013/408/4010;
- Kerberos/时间:36/47(时间源/偏移)。
周期体检脚本(计划任务每 30 分钟):
$summary = repadmin /replsummary
if($summary -match "fails:\s+[1-9]"){
Send-MailMessage -To "ad-alerts@corp.example.com" -From "adbot@corp.example.com" `
-SmtpServer "smtp.corp.example.com" -Subject "[ALERT] AD Replication Errors" -Body ($summary | Out-String)
}
变更与回滚策略(真发生过)
- 拓扑变动(改站点成本/复制窗):先在非工作时段把一条链路“复制频率”从 15 → 60 分钟观察 24 小时,再落地;发现 GPO 延迟可一键回退。
- FSMO 转移:有计划地迁移到 HK,观察 1 周后分摊 RID/Infra 到第二台 GC;出现异常,Move-ADDirectoryServerOperationMasterRole 反向迁回。
- 对象恢复:OU 误删,wbadmin start systemstatebackup 的系统状态能救命;日常再配合回收站(AD Recycle Bin)。
性能与容量
- 登录峰值(叠加 MFA 前置)下,单台 8 vCPU / 64GB 的 DC 远超足够。真正的瓶颈更多在 网络抖动与 DNS/GC 命中。
- 磁盘:NTDS.DIT + 日志通常 < 20GB,随机读写延迟比容量重要;OS/DB 分盘能更稳。
- 网络:双 10G 汇聚(机房侧 LACP),DC 与 TOR 走冗余。客户端到 DC 的RTT < 30ms 体验显著更好。
交付清单(我实际发给团队的落地表)
| 项 | 状态 | 备注 |
|---|---|---|
| HK 两台 DC(均 GC),一台承载 FSMO(PDC 物理) | ✅ | DC-HK-01/02 |
| SG 一台 DC(GC) | ✅ | DC-SG-01 |
| GZ 一台 RODC(缓存销售与客服组密码) | ✅ | RODC-GZ-01 |
| 站点与子网映射完整 | ✅ | HK/SG/GZ |
| 站点链路成本与复制窗 | ✅ | HK–GZ 60、HK–SG 80;15 分钟 |
| NTP 链路(PDC→外部,成员→域) | ✅ | 时间偏差 <50ms |
| DNS 条件转发 | ✅ | 私网域分流 |
| DFS-R 正常、无 backlog | ✅ | 观测 48 小时 |
| 监控告警上线 | ✅ | SIEM + Mail |
| 备份与回滚演练 | ✅ | 系统状态 + 回收站 |
结尾:那一次“什么都没发生”的大考
又是周五傍晚,海缆的一次短抖让跨境 RTT 飙到 300ms。NOC 的曲线有起伏,但登录报表很平静。广州同事照常刷卡进门、开机、登录、拉取 GPO,香港两台 GC 在后台稳稳兜着,RODC 把预缓存密码派上了用场。有人在群里说“今天网络好像有点慢”,我看着 dashboard 上绿油油的一片,笑着回:“认证这块,什么都没发生。”
也正因为我们在香港把多节点 AD 的站点、GC、RODC、DNS、NTP、DFS-R 都摆到了应有的位置,跨区域认证才真正从“玄学”变成了工程。希望这份从机柜边写下的实操笔记,能让你也拥有一次“什么都没发生”的好变更。
附:常用命令速查
# 查看所有 DC、角色
Get-ADDomainController -Filter * | ft Name,IPv4Address,Site,IsGlobalCatalog
netdom query fsmo
# 复制健康
repadmin /replsummary
repadmin /showrepl * /csv
# DNS SRV
nslookup -type=SRV _ldap._tcp.dc._msdcs.corp.example.com
# 客户端站点/域控定位
nltest /dsgetsite
nltest /dsgetdc:corp.example.com
# DFS-R 积压
Get-DfsrBacklog -SourceComputerName DC-HK-01 -DestinationComputerName DC-HK-02 -GroupName "Domain System Volume"
# 时间
w32tm /query /status
如果你也在香港/跨区域环境里折腾 AD、需要结合你现网做一版“专属配方”,把你的子网、链路、现有 DC/GC/RODC 情况发我,我可以帮你写一份站点/复制/GC/DNS/NTP 的改造清单与上线回滚脚本。