上一篇 下一篇 分享链接 返回 返回顶部

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

发布人:Minchunlin 发布时间:2025-08-19 10:59 阅读量:821


凌晨 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 / ServerCentOS 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 混合 DCWindows 主 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)
  •  文档与变更流程入库

如果你也在香港机房里和风赛跑,欢迎把你的现场问题丢给我。能跑不难,跑稳才是真本事。

目录结构
全文