在香港服务器中如何实现Windows与Linux的混合AD域控,解决跨操作系统的统一认证问题?

凌晨 2:10,我抱着一杯凉掉的港式奶茶蹲在机柜前,盯着那台刚上线的 Linux 域控。Windows 客户端能上域,Linux 的 sudo 却死活不肯认 Kerberos。运维同事问我:‘要不先回去睡?’ 我摇头,把笔记本往上面一搭:今晚不把混合域控打通,我睡不着。
这一篇,不炫技、不堆名词。我按照我在香港机房落地混合域控的真实流程,把架构设计、硬件网络、部署步骤、踩坑与排障一股脑摊开。既写给刚入门的同学,也不怠慢老手的挑剔。
1. 目标与结论先行
目标:在香港机房落地一个Windows + Linux 混合的 Active Directory(AD)域控体系,实现跨操作系统(Windows、Linux)统一账号、统一认证(Kerberos/SSO)、统一授权(组/策略),并具备高可用与异地容灾能力。
我最终的选择(强烈建议):
Windows Server 作为权威 AD DS(FSMO 角色集中在 Windows)。
Linux 侧使用 Samba AD DC(只做辅助 DC)或仅作为成员服务器 + SSSD/realmd。
GPO(组策略)集中在 Windows DC 维护;Linux 侧用 SSSD 管控登录、sudo、SSH GSSAPI、NFS krb5 等。
重要现实:Windows 的 SYSVOL 用 DFS-R 复制,Samba 目前不实现 DFS-R。混合 DC 同域时,SYSVOL 复制需要额外脚本/rsync 方案。因此:
- 若你追求最稳:Windows-only DC,Linux 全部成员服务器方式接入 AD(SSSD/winbind)。
- 若你必须有 Linux DC:让 Samba 作为附加 DC,GPO 只在 Windows DC 改动并用 rsync 单向同步到 Samba(本文给出脚本)。
我在香港项目里采用“Windows 主 DC + Samba 附 DC + Linux 客户端 SSSD”,GPO 只在 Windows 上改,夜间 rsync 到 Samba,生产平稳。
2. 香港机房与设备清单(真实落地该有的样子)
2.1 硬件/虚拟化配置表
| 角色 | 型号/形态 | CPU/内存 | 存储 | 网络 | OS |
|---|---|---|---|---|---|
| DC01(主) | 物理/VM(建议 VM,跑在集群) | 8 vCPU / 16GB | 200GB 系统盘 + 100GB 数据盘 | 2 × 10GbE(Bond) | Windows Server 2019/2022 |
| DC02(辅,Samba) | 物理/VM | 8 vCPU / 16GB | NVMe 200GB | 2 × 10GbE | Rocky 9 / Ubuntu LTS(跑 Samba 4) |
| FS01(文件/共享) | 物理 | 16 vCPU / 64GB | NVMe RAID1 + HDD RAID10 | 2 × 10GbE | Linux(成员机) |
| 客户端批量 | 物理/VM | N/A | N/A | 1/10GbE | Windows 10/11 / Server;CentOS 7 / Rocky |
说明:不建议在 CentOS 7 上跑 Samba AD DC(官方仓库缺 DC 角色,需要第三方包或源码编译,维护成本高),我把 Samba DC 放在 Rocky/Ubuntu,CentOS 7 仅作为 Linux 客户端接 AD,这更稳更现实。
2.2 网络与地址规划
| 项 | 值 |
|---|---|
| 域名 | ad.hk.example.com(建议使用你公司正式可控的子域,不用 .local) |
| 站点/子网 | HK-IDC(10.10.10.0/24),Office(10.20.20.0/24) |
| DC01(Win) | 10.10.10.10 |
| DC02(Samba) | 10.10.10.11 |
| NTP | 本地 PTP/NTP(如 10.10.10.5)+ 公网兜底 |
| DNS | AD 内部 DNS(DC01、DC02 自身承载) |
| 防火墙 | 开放 53/88/123/135/389/445/464/636、动态 RPC 49152-65535/tcp,详见下表 |
AD 关键端口表
| 端口 | 协议 | 作用 |
|---|---|---|
| 53 | TCP/UDP | DNS |
| 88 | TCP/UDP | Kerberos KDC |
| 123 | UDP | NTP |
| 135 | TCP | RPC 端口映射 |
| 389 | TCP/UDP | LDAP |
| 445 | TCP | SMB/CIFS |
| 464 | TCP/UDP | Kerberos 变更口令 |
| 636 | TCP | LDAPS |
| 49152-65535 | TCP | RPC 动态端口(复制、管理) |
3. 架构对比与选型建议(老手别跳,这块决定你后面会不会通宵)
| 方案 | 描述 | 优点 | 风险/限制 | 适用 |
|---|---|---|---|---|
| A | Windows-only DC,Linux 全部成员机(SSSD 或 winbind) | 最稳、微软全链路支持、GPO/DFS-R 原生 | Linux 侧策略需在 SSSD/Ansible 层自行维护 | 追求稳定与合规 |
| B | Samba-only DC(纯 Linux DC),Windows 做成员机 | 可完全开源、成本低 | Windows 某些特性需验证;升级/支持靠团队经验 | 纯开源栈 |
| C | 混合 DC:Windows 主 DC + Samba 附 DC | 近源就近认证、容灾灵活 | SYSVOL 复制不兼容 DFS-R → 需自建 rsync 同步 | 两栈共存、机房在地就近 |
我采纳 C,但把策略/GPO 只放 Windows 改,用rsync 定时向 Samba DC 同步 SYSVOL,并严控变更流程。
4. 实操步骤(从“能跑”到“跑稳”)
4.1 Windows 主 DC(DC01)落地
PowerShell 一把梭:
# 1) 设置静态 IP / DNS 指向自身
New-NetIPAddress -InterfaceAlias "Ethernet" -IPAddress 10.10.10.10 -PrefixLength 24 -DefaultGateway 10.10.10.1
Set-DnsClientServerAddress -InterfaceAlias "Ethernet" -ServerAddresses 10.10.10.10,10.10.10.11
# 2) 安装 AD DS 与 DNS
Install-WindowsFeature AD-Domain-Services, DNS -IncludeManagementTools
# 3) 创建新林与域
Import-Module ADDSDeployment
Install-ADDSForest `
-DomainName "ad.hk.example.com" `
-DomainNetbiosName "HKAD" `
-InstallDns `
-SafeModeAdministratorPassword (Read-Host -AsSecureString "DSRM Password") `
-Force
# 安装完成会重启
要点
- 时间同步:DC 与 NTP 保持一致。PDC Emulator(默认首个 DC)对全域时序至关重要。
- DNS 转发:内部域由 AD DNS 解析,公网域名转发到上游。
- FSMO 角色:此刻全部在 DC01 上(后面保留或迁移见 §4.6)。
4.2 准备 Linux Samba 附加 DC(DC02)
我将 Samba AD DC 部署在 Rocky 9/Ubuntu LTS。如果你硬要在 CentOS 7 上做 DC,请使用 SerNet 包或源码编译(维护成本高,本文不展开编译链)。CentOS 7 我只作为客户端。
安装与基础配置(Rocky/Ubuntu 示例):
# Rocky 9 / RHEL-like
sudo dnf install -y samba samba-dc samba-dc-libs samba-common-tools \
krb5-workstation bind-utils wget vim chrony
# 设主机名与 /etc/hosts
sudo hostnamectl set-hostname dc02.ad.hk.example.com
echo "10.10.10.11 dc02.ad.hk.example.com dc02" | sudo tee -a /etc/hosts
# NTP/Chrony 指向同一时源
sudo sed -i 's/^pool.*/server 10.10.10.5 iburst/' /etc/chrony.conf
sudo systemctl enable --now chronyd
# DNS 指向 DC01 优先
sudo nmcli con mod eth0 ipv4.dns "10.10.10.10,10.10.10.11"
sudo nmcli con up eth0
加入现有域,作为“附加 DC”(重点!):
# 预清理旧配置
sudo systemctl stop samba smb nmb winbind 2>/dev/null || true
# 使用 samba-tool 加入域为 DC
sudo samba-tool domain join ad.hk.example.com DC -U"Administrator" \
--password='你的域管密码' \
--realm=AD.HK.EXAMPLE.COM \
--dns-backend=SAMBA_INTERNAL
# 生成基础 krb5.conf(也可用系统模板)
sudo bash -c 'cat >/etc/krb5.conf' << 'EOF'
[libdefaults]
default_realm = AD.HK.EXAMPLE.COM
dns_lookup_realm = true
dns_lookup_kdc = true
rdns = false
ticket_lifetime = 24h
forwardable = yes
EOF
# 启动 samba-ad-dc
sudo systemctl enable --now samba
# 验证复制状态
sudo samba-tool drs showrepl
注意:Samba AD DC 与 Windows DC 在一个域内目录对象可用 DRSUAPI 复制,但 SYSVOL(GPO 脚本/模板)Windows 用 DFS-R,Samba 不实现 DFS-R。因此GPO 不会自动在 Samba 与 Windows 间复制——我们要自建 rsync,见 §4.4。
4.3 Linux 客户端(CentOS 7 为例)加入 AD(成员机方式)
这部分是生产里最常用、也最稳的一条路:Linux 不做 DC,只做成员机,统一认证靠 SSSD + Kerberos + LDAP。
# CentOS 7 客户端
sudo yum install -y realmd sssd sssd-tools adcli oddjob oddjob-mkhomedir \
samba-common samba-common-tools krb5-workstation \
policycoreutils-python
# 指向 AD DNS
sudo nmcli con mod eth0 ipv4.dns "10.10.10.10,10.10.10.11"; nmcli con up eth0
# 发现域
realm -v discover ad.hk.example.com
# 加域(建议用域管理员或具备委派权限的账号)
sudo realm join ad.hk.example.com -U Administrator --computer-ou="OU=Servers,DC=ad,DC=hk,DC=example,DC=com"
# 开机自动创建家目录
sudo authconfig --enablemkhomedir --update
# 配置 SSSD(通常 realmd 已生成,按需增强)
sudo bash -c 'cat >/etc/sssd/sssd.conf' << 'EOF'
[sssd]
services = nss, pam, sudo, ssh
config_file_version = 2
domains = ad.hk.example.com
[domain/ad.hk.example.com]
id_provider = ad
access_provider = ad
ad_domain = ad.hk.example.com
krb5_realm = AD.HK.EXAMPLE.COM
cache_credentials = True
ldap_id_mapping = True
fallback_homedir = /home/%u
default_shell = /bin/bash
# 评估 GPO 控制(如需基于 AD 组限制登录)
ad_gpo_access_control = permissive
EOF
sudo chmod 600 /etc/sssd/sssd.conf
sudo systemctl enable --now sssd
# PAM / SSH GSSAPI(SSO)
sudo sed -i 's/^#GSSAPIAuthentication no/GSSAPIAuthentication yes/' /etc/ssh/sshd_config
sudo systemctl restart sshd
# 验证
kinit Administrator
id "HKAD\\someuser"
基于 AD 组授权 sudo(示例):
# 安装 sudo 插件(CentOS 7 自带)
echo "%domain^admins ALL=(ALL) ALL" | sudo tee -a /etc/sudoers.d/ad-admins
chmod 440 /etc/sudoers.d/ad-admins
domain^admins 的具体写法受 SSSD 映射与区分大小写影响,可用 getent group 查到精确组名。
4.4 SYSVOL 同步(混合 DC 的关键“坑位”)
现状:
- Windows ↔ Windows:DFS-R 自动复制 C:\Windows\SYSVOL\domain。
- Samba ↔ Samba:通常社区用 rsync。
- Windows ↔ Samba:没有原生互通。
实践做法(我用过且可靠):
- 规约:GPO 变更只在 Windows DC01 上操作。
- 夜间计划任务:把 DC01 的 SYSVOL 单向 rsync 到 Samba DC02。
- Windows 端用 robocopy 到中转共享,或直接在 DC02 开 rsyncd/SSH 拉取。
在 Samba(DC02)侧跑拉取脚本(crontab)示例:
# 在 DC02 新建 /usr/local/bin/sync-sysvol.sh
sudo bash -c 'cat >/usr/local/bin/sync-sysvol.sh' << 'EOF'
#!/usr/bin/env bash
set -euo pipefail
SRC="Administrator@10.10.10.10:/cygdrive/c/Windows/SYSVOL/domain/"
DST="/var/lib/samba/sysvol/ad.hk.example.com/"
LOG="/var/log/sync-sysvol.log"
# 使用 Windows 上安装的 OpenSSH Server 提供 sftp/scp
rsync -a --delete -e "ssh -o StrictHostKeyChecking=no" "$SRC" "$DST" >>"$LOG" 2>&1
# 修复 ACL(非常关键,否则 GPO 失效)
samba-tool ntacl sysvolreset
EOF
sudo chmod +x /usr/local/bin/sync-sysvol.sh
# 每晚 2:30 同步
echo "30 2 * * * root /usr/local/bin/sync-sysvol.sh" | sudo tee /etc/cron.d/sync-sysvol
说明:Windows 端建议装 OpenSSH Server(或 cwRsync),这样 Linux 就能用 rsync/ssh 直接拉;同步后务必 ntacl sysvolreset,否则 GPO 权限错位,Windows 客户端会报 1058/1030。
4.5 NFS 与 Samba 文件服务的统一认证(可选)
Samba 共享(SMB):基于 AD,smb.conf 使用 security = ADS、idmap config 选择 ad 或 rid 模式。
NFS:启用 krb5/krb5i/krb5p,与 AD 同一个 Kerberos Realm。服务器端需要生成主机与 nfs 的 service principal(SPN),客户端 /etc/krb5.keytab。
示例(Samba 成员服务器):
# /etc/samba/smb.conf
[global]
workgroup = HKAD
realm = AD.HK.EXAMPLE.COM
security = ADS
kerberos method = secrets and keytab
dedicated keytab file = /etc/krb5.keytab
idmap config * : backend = tdb
idmap config HKAD : backend = rid
idmap config HKAD : range = 100000-1999999
winbind use default domain = yes
template shell = /bin/bash
[share]
path = /data/share
read only = no
browsable = yes
4.6 高可用与备份
多 DC:Windows 至少 2 台(若条件允许),Samba 1 台为辅。
FSMO:默认集中在 DC01;可按需把 GC 也开在 DC02 提升查询性能。
备份:
Windows:wbadmin start systemstatebackup -backupTarget:E:;或者企业备份软件做 System State。
Samba:samba-tool domain backup online --targetdir=/backup 定期离站。
恢复演练:每季度做一次权威还原与成员机重置演练,确保 RID 池、SYSVOL 权限、Kerberos 正常。
5. 验证清单(上线前最后一公里)
目录复制
Windows:repadmin /replsummary、repadmin /showrepl
Samba:samba-tool drs showrepl
Kerberos
Windows:klist
Linux:kinit user; klist
SSO
Linux → Linux:ssh -K user@host(GSSAPIAuthentication yes)
Windows → SMB:映射共享无需再输密码
GPO
Windows 客户端:gpupdate /force、事件查看器(User/Computer Policy 成功/失败)
DNS
_kerberos._tcp.ad.hk.example.com SRV 记录是否包含 DC01、DC02
时间
DC、成员机 chronyc sources -v 一致;误差 < 5 分钟(Kerberos 大概容忍 5 分钟,建议 < 1 分钟)
6. 典型坑与现场处置(我真遇到过)
时间漂移导致 Kerberos 拒绝
现象:KDC_ERR_SKEW、Linux kinit 失败,Windows 登录不稳。
处理:统一指向同一 NTP,PDC Emulator 同步外部权威源;w32tm /query /status、chronyc tracking 双向确认。
DNS 指错/双栈顺序错
现象:客户端解析不到 _ldap._tcp,或先走外部 DNS。
处理:所有成员机首选 AD DNS。双网卡机器注意注册顺序;必要时 Disable NetBIOS over TCP/IP。
混合 DC 的 SYSVOL 不同步
现象:Windows 改了 GPO,Samba 客户端收不到;Windows 客户端日志 1058/1030。
处理:按 §4.4 配置 rsync + ntacl reset,变更流程只在 Windows DC动。
防火墙/ACL 漏开动态端口
现象:能 ping,用户认证间歇性失败,复制报 RPC 错。
处理:开 49152-65535/tcp;或用 dcerpc endpoint mapper 观测;干脆先在内网段白名单验证。
CentOS 7 想做 Samba DC
现象:找不到 samba-dc 包或功能不全。
处理:别在 CentOS 7 跑 DC,选用 Rocky/Ubuntu;CentOS 7 当成员机最稳。非要上,走 SerNet 或 源码,团队要背维护成本。
ID 映射混乱
现象:Linux 上 id user 的 UID/GID 和文件属主对应不上。
处理:idmap config 统一规划,生产前就定好范围与策略(ad vs rid),不要中途改。
7. 变更与运维流程(保你长久稳)
GPO 变更只在 Windows DC01,每晚 2:30 自动同步到 Samba DC02;紧急情况允许手动触发脚本。
帐号与组:集中在 ADUC/PowerShell 管理;Linux 授权靠组映射 + SSSD。
CM/自动化:把 Linux 客户端的 sssd.conf、sshd_config、sudoers.d 纳入 Ansible/Salt。
监控告警:
复制延迟:repadmin 指标、samba-tool drs showrepl 解析
Kerberos 失败计数、NTP 偏移、DNS 查询失败率
rsync 任务退出码、ntacl sysvolreset 日志关键字
8. 现场速查指令卡(放在你的 Wiki 里)
# Windows
repadmin /replsummary
repadmin /showrepl
dcdiag /v
gpresult /r
klist
# Linux (Samba DC)
samba-tool drs showrepl
samba-tool domain level show
samba-tool ntacl sysvolcheck
journalctl -u samba -f
# Linux (成员机)
realm list
id 'HKAD\\user'
kinit user && klist
getent passwd 'HKAD\\user'
9. 结语:那个台风夜之后
凌晨 3:05,最后一次 samba-tool ntacl sysvolreset 跑完,我在一台 Windows 客户端上 gpupdate /force,策略落了,登录不再卡壳。再到 CentOS 7 客户端 ssh -K,无密码单点进来,sudo -l 正确显示来自 AD 的授权。我对同事说:‘收工。’
机房外风仍在,但我知道,这个混合域控已经能在风里稳稳撑住。第二天我把同步脚本与变更流程写进了运维手册——不是为了炫耀,而是为了以后每个午夜来到机房的人,都能少走几步弯路。”
参考部署清单(你可以对照打勾)
- Windows DC01 建林、DNS、NTP、FSMO
- Samba DC02 加域成功、drs showrepl 正常
- SYSVOL rsync 定时任务 & ntacl sysvolreset
- Linux 客户端(CentOS 7)加入域、SSSD 正常
- SSH GSSAPI、sudo 组授权验证通过
- 监控与备份到位(wbadmin / samba-tool backup)
- 文档与变更流程入库
如果你也在香港机房里和风赛跑,欢迎把你的现场问题丢给我。能跑不难,跑稳才是真本事。