Samba Active Directory(AD)域控制器可以让 Debian 13 服务器承担 Windows Server 域控制器的工作。Windows 11 计算机可加入该域,用户通过 Kerberos 登录,管理员使用相同的 RSAT(远程服务器管理工具)控制台管理。因此它适合需要 AD、又希望减少 Windows Server 许可成本的小型办公室或实验环境。
本文使用 samba-tool 创建域,修复初始化后留下的 DNS 问题,加入 Windows 11 客户端,利用 RSAT 管理用户和组策略,并检查 Samba 报告的功能级别。实验于 2026 年 10 月在 Debian 13、Samba 4.22 和 Windows 11 24H2 客户端上完成;未能确认的两项操作会在对应位置明确说明。
Samba AD 域控制器如何与 Windows 11 配合?
Windows 11 通过 DNS SRV 记录查找域控制器,因此客户端必须使用 Samba DC 作为 DNS 服务器。Samba 在同一个 samba 进程中运行 DNS、Heimdal Kerberos KDC(密钥分发中心)、LDAP 目录及 SYSVOL 共享,并将域外查询转发给上游解析器。

架构图箭头上的数字表示 Windows 11 登录的先后顺序。第一步失败,后续步骤都无法进行,所以多数 Samba DC 问题最终都与 DNS 有关。客户端也不应在 DC 旁边再配置一个公网 DNS:公网解析器不知道私有 ad.example.com 区域中的 SRV 记录,请求落到它上面就查不到结果。
下面的实验值会出现在所有命令中,复制前请替换为自己的配置。
| 项目 | 实验值 | 实际部署要求 |
|---|---|---|
| DC 主机名 | dc01 | 短主机名,不超过 15 个字符 |
| DC IP 地址 | 192.168.1.231 | 在服务器上配置的静态地址 |
| DNS 域与 Kerberos realm | ad.example.com / AD.EXAMPLE.COM | 使用自己持有域名的子域,不用 .local |
| NetBIOS 域名 | EXAMPLE | 首段名称大写,不超过 15 个字符 |
| 上游 DNS | 192.168.1.1 | 路由器或其他解析器 |
| Windows 11 客户端 | WIN11-LAB, 192.168.1.128 | RSAT 要求 Pro 或 Enterprise 版本 |
Samba DC 与 Windows DC 有哪些能力差异?
Samba DC 默认使用 Windows Server 2008 R2 域功能级别,也不能自行将 SYSVOL 复制到第二台 DC。单 DC 实验中的日常 Windows 11 操作,包括加域、域登录、组策略及 DNS,都正常。扩展到多 DC 或使用较新的 AD 功能时,需要考虑以下限制:
- 除非主动启用 Samba 4.19 引入的部分 2012~2016 支持,否则域和林保持 2008 R2 功能级别。
- SYSVOL 不支持 DFS-R 或 FRS 复制,第二台 Samba DC 需要通过 rsync 任务同步组策略文件。
- Samba 使用自带的 Heimdal KDC;MIT Kerberos 支持仍标为实验性。
- 微软要求 RSAT 工作站使用 Windows 11 Pro 或 Enterprise,Home 版不能承担这一角色。
Samba 的 DC 部署文档建议生产环境配置至少两台 DC,以便故障切换。只有一台 DC 时,服务器故障会阻止密码修改、无法依靠缓存凭据的登录以及组策略刷新,因此应在办公室依赖它之前规划第二台。如果需要较新功能级别、AD PowerShell 模块所依赖的 ADWS,或厂商仅支持微软 DC,Windows Server AD DS 更适合。已有 Windows Server 域、只是希望 Linux 用户加入的环境,无需重新创建域;将 Debian 加入现有 AD 即可。
Debian 13 服务器需要先满足哪些条件?
服务器需要固定 IP、能解析到该地址的短主机名,以及保持同步的时钟:时差超过五分钟时,Kerberos 会拒绝票据。实验 DC 配置为 2 个 vCPU、4 GB 内存,初始化后整个系统使用 596 MB 内存,因此小型办公室可把 2 GB 作为可行的起点。安装前确认:
- 网络接口使用静态地址,客户端将把这个地址作为 DNS 服务器。
- 主机名不是
pdc、bdc,且不超过 15 个字符。 dnsmasq、BIND 等其他服务没有占用 53 端口。- DNS 域名由自己控制,避免与公网区域冲突。
先设置主机名。初始化会把它写入目录、DNS 区域和 Kerberos 主体,日后修改远不止执行一条主机名命令:
sudo hostnamectl set-hostname dc01
在 /etc/hosts 中把完整名称映射到局域网地址。Debian 默认把主机名指向 127.0.1.1,DC 如果把自己解析到回环地址,就会在 DNS 注册错误地址。删除 127.0.1.1 行;实验服务器上它是唯一包含主机名的行,再添加正确映射:
sudo sed -i '/127.0.1.1/d' /etc/hosts
echo "192.168.1.231 dc01.ad.example.com dc01" | sudo tee -a /etc/hosts
云镜像中,cloud-init 可能每次启动都改写 /etc/hosts,并把主机名改回虚拟机名称。关闭这两种行为,让修改在重启后保留:
echo "manage_etc_hosts: false" | sudo tee /etc/cloud/cloud.cfg.d/99-hosts.cfg
echo "preserve_hostname: true" | sudo tee /etc/cloud/cloud.cfg.d/99-hostname.cfg
检查服务器是否知道自己的完整名称。如果只输出 dc01,则 hosts 映射缺失,或位于同名回环地址条目之后:
hostname -f
正确配置应输出完整域名:
dc01.ad.example.com
主机名、地址和时钟准备好后,即可安装 Samba 软件包。
Debian 13 的 DC 需要哪些 Samba 软件包?
Debian 13 把 DC 组件放在独立的 samba-ad-dc 包中,另需 samba、winbind 和 Kerberos 客户端工具。如果只需要本地账户的文件共享,应使用 Debian Samba 文件共享教程,因为 DC 的维护成本更高。这里还安装 smbclient 用于共享检查,安装 chrony 维护时间。krb5-config 安装时通常询问 realm;非交互模式跳过这些问题,后续初始化会生成自己的 Kerberos 文件:
sudo apt update
sudo DEBIAN_FRONTEND=noninteractive apt install -y acl attr samba samba-ad-dc winbind libpam-winbind libnss-winbind krb5-config krb5-user dnsutils python3-setproctitle smbclient chrony
软件包安装后,独立文件服务器会立即启动。Debian 自动启用并启动这些守护进程,而 DC 单元仍等待尚未生成的配置。检查四个服务:
systemctl is-active smbd nmbd winbind samba-ad-dc
实验服务器上的 smbd、nmbd、winbind 均为 active;samba-ad-dc 虽已启用,仍为 inactive:
active
active
active
inactive
DC 会启动自己的 SMB 和 winbind 进程,所以独立服务必须停止并保持停用。初始化前,smbd 已监听 445 端口,而 DC 的 SMB 服务也需要它。将三个服务 mask,再移开软件包提供的配置,让初始化生成 DC 角色专用的 smb.conf:
sudo systemctl disable --now smbd nmbd winbind
sudo systemctl mask smbd nmbd winbind
sudo mv /etc/samba/smb.conf /etc/samba/smb.conf.orig
sudo mv /etc/krb5.conf /etc/krb5.conf.orig
sudo systemctl enable --now chrony
然后检查 Samba 版本。后面介绍的功能级别选项从 4.19 才开始支持;首次更新前记录准确构建版本,也有助于区分行为变化来自 Debian 更新还是自己的配置。
sudo samba --version
实验报告以下 Debian 13 构建。未添加 backports 的服务器通常处于同一 4.22 系列;若 Debian 已发布安全更新,deb13u 编号可能更高:
Version 4.22.11-Debian-4.22.11+dfsg-0+deb13u1
它落后于当前上游的 4.25 系列,trixie-backports 提供 4.24 构建。单 DC 环境宜先使用 Debian 13 软件包,在获得 Debian 安全修复的同时避免目录突然跨主要版本升级。仅当确实需要 4.22 缺少的修复或功能时考虑 backports,并让域内所有 DC 一起升级。
如何使用 samba-tool 初始化域?
一条 samba-tool domain provision 创建林、DNS 区域、Administrator 账户和默认组策略对象。这里使用 Samba 部署文档建议新域采用的内部 DNS,并设置 --use-rfc2307,让目录日后可存放 Unix UID、GID 属性。Administrator 密码必须自行选择并满足域复杂度要求;下方为实验示例密码:
sudo samba-tool domain provision --server-role=dc --use-rfc2307 --dns-backend=SAMBA_INTERNAL --realm=AD.EXAMPLE.COM --domain=EXAMPLE --adminpass='Lab-Admin-2026!'
实验虚拟机在 14 秒内完成。最后几行汇总域信息,应先检查主机名和两种域名称。拼写错误不能日后简单修改,因为 Samba 无法重命名 realm;只能清空 /var/lib/samba 后重新初始化。
INFO ... A Kerberos configuration suitable for Samba AD has been generated at /var/lib/samba/private/krb5.conf
INFO ... Merge the contents of this file with your system krb5.conf or replace it with this one. Do not create a symlink!
INFO ... Once the above files are installed, your Samba AD server will be ready to use
INFO ... Server Role: active directory domain controller
INFO ... Hostname: dc01
INFO ... NetBIOS Domain: EXAMPLE
INFO ... DNS Domain: ad.example.com
INFO ... DOMAIN SID: S-1-5-21-533538618-2815108556-1420468854
按输出提示把生成的 Kerberos 文件复制到位,必须复制而非符号链接:/var/lib/samba/private 仅 root 可读,而 kinit 等工具以普通用户运行。
sudo cp /var/lib/samba/private/krb5.conf /etc/krb5.conf
检查初始化生成的 smb.conf。文件很短,但运行 systemd-resolved 的 Debian 13 系统会有一行不合适的配置:
sudo cat /etc/samba/smb.conf
初始化从 /etc/resolv.conf 复制 DNS 转发器;实验系统使用 resolved 的 127.0.0.53 stub 地址。其余配置符合单 DC 的需要。
# Global parameters
[global]
dns forwarder = 127.0.0.53
netbios name = DC01
realm = AD.EXAMPLE.COM
server role = active directory domain controller
workgroup = EXAMPLE
idmap_ldb:use rfc2307 = yes
[sysvol]
path = /var/lib/samba/sysvol
read only = No
[netlogon]
path = /var/lib/samba/sysvol/ad.example.com/scripts
read only = No
暂时保持文件原样。下一节一起修复转发器和系统解析器。
为什么初始化后 DNS 会出问题?
系统仍向 systemd-resolved 查询,而 resolved 不认识 ad.example.com。实验在这个状态启动 samba-ad-dc,服务能运行,但 DNS 更新程序不断向日志写入错误:
/usr/sbin/samba_dnsupdate: ERROR(runtime): Record already exists; record could not be added. zone[ad.example.com] name[_ldap._tcp.Default-First-Site-Name._sites] [WERR_DNS_ERROR_RECORD_ALREADY_EXISTS] - (9711, 'WERR_DNS_ERROR_RECORD_ALREADY_EXISTS')
/usr/sbin/samba_dnsupdate: ERROR(runtime): Record already exists; record could not be added. zone[_msdcs.ad.example.com] name[gc] [WERR_DNS_ERROR_RECORD_ALREADY_EXISTS] - (9711, 'WERR_DNS_ERROR_RECORD_ALREADY_EXISTS')
记录本身没有问题。samba_dnsupdate 通过系统解析器查询每条记录,resolved 不返回结果,于是再次添加,Samba DNS 则提示记录已存在。转发器配置还有另一个问题:系统改用 DC 自身作为解析器后,127.0.0.53 指向即将停用的服务,所有域外查询都会失败。
先检查 resolved 是否运行。实验 Debian 13 云镜像运行了它,/etc/resolv.conf 是指向 stub 文件的符号链接。如果自己的服务器显示 inactive,则跳过停用操作,只改写 /etc/resolv.conf。
systemctl is-active systemd-resolved
若显示 active,停止并禁用该服务,再把符号链接替换为指向 DC 自身的静态配置。DC 必须用自己的 DNS 解析自己的域,否则 samba_dnsupdate 会持续失败:
sudo systemctl disable --now systemd-resolved
sudo rm -f /etc/resolv.conf
printf "search ad.example.com\nnameserver 192.168.1.231\n" | sudo tee /etc/resolv.conf
把转发器改为真正的上游解析器。实验使用局域网路由器 192.168.1.1。任何可访问解析器都可以,包括公网 DNS,因为只有 ad.example.com 之外的名称才会转发过去。
sudo sed -i "s/dns forwarder = 127.0.0.53/dns forwarder = 192.168.1.1/" /etc/samba/smb.conf
实验服务器已启用 Debian 的 samba-ad-dc 单元。仍先执行 unmask,避免以前的教程曾将它 mask,然后启用并重启,让新转发配置生效:
sudo systemctl unmask samba-ad-dc
sudo systemctl enable samba-ad-dc
sudo systemctl restart samba-ad-dc
重启后日志没有错误,所有 AD 端口均在监听。客户端与 DC 之间的防火墙需要允许下列端口:
| 端口 | 协议 | 服务 |
|---|---|---|
| 53 | TCP、UDP | DNS |
| 88 | TCP、UDP | Kerberos |
| 135 | TCP | RPC 端点映射器 |
| 389 | TCP、UDP | LDAP |
| 445 | TCP | SMB (SYSVOL, NETLOGON) |
| 464 | TCP、UDP | Kerberos 密码修改 |
| 636 | TCP | LDAPS |
| 3268, 3269 | TCP | 全局编录 |
| 137, 138 / 139 | UDP / TCP | NetBIOS 名称、数据报和会话(nbt、smbd) |
| 123 | UDP | 完成下文配置后由 chrony 提供 NTP |
| 49152-65535 | TCP | 动态 RPC(rpc server dynamic port range) |
实验 Debian 13 虚拟机没有宿主防火墙规则,无需额外放行。若 DC 使用 nftables 或其他防火墙,只向客户端子网开放这些端口。实验 testparm -sv 显示默认 rpc server dynamic port range = 49152-65535;ss 显示 Samba nbt 任务监听 UDP 137、138,smbd 监听 TCP 139。
如何检查 DNS 和 Kerberos?
先从 DC 自身测试,再操作 Windows。客户端加域失败往往只显示通用错误,掩盖根因。查询 Windows 将使用的 SRV 记录,再查询一个域外名称验证转发器:
host -t SRV _ldap._tcp.ad.example.com.
host -t SRV _kerberos._udp.ad.example.com.
host -t A dc01.ad.example.com.
host -t A deb.debian.org
四条查询都应返回结果。SRV 记录指向 dc01 的 389、88 端口,deb.debian.org 通过转发器返回。如果域外名称正常而 SRV 失败,系统仍在询问其他解析器,应重新检查 /etc/resolv.conf。
_ldap._tcp.ad.example.com has SRV record 0 100 389 dc01.ad.example.com.
_kerberos._udp.ad.example.com has SRV record 0 100 88 dc01.ad.example.com.
dc01.ad.example.com has address 192.168.1.231
deb.debian.org is an alias for debian.map.fastlydns.net.
debian.map.fastlydns.net has address 151.101.66.132
接着以域 Administrator 获取 Kerberos 票据。realm 必须大写,因为 Kerberos realm 区分大小写,小写 ad.example.com 是另一个没有 KDC 提供服务的 realm:
kinit administrator@AD.EXAMPLE.COM
klist
出现 krbtgt/AD.EXAMPLE.COM 票据说明 KDC 正常。也要阅读上方容易被忽略的警告。
Warning: Your password will expire in 41 days on Fri Dec 11 08:14:19 2026
Ticket cache: FILE:/tmp/krb5cc_1000
Default principal: administrator@AD.EXAMPLE.COM
Valid starting Expires Service principal
10/30/26 08:15:12 10/30/26 18:15:12 krbtgt/AD.EXAMPLE.COM@AD.EXAMPLE.COM
renew until 10/31/26 08:15:12
新域默认给所有账户设置 42 天密码最长使用期限,包括刚创建的 Administrator。实验环境或单管理员办公室可能六周后因此无法登录。可以设置密码变更提醒,或只为这个账户关闭到期:
sudo samba-tool user setexpiry Administrator --noexpiry
最后检查共享和数据库。客户端通过初始化创建的两个共享读取组策略与登录脚本,因此它们必须出现在列表中。数据库检查可在客户端依赖域之前发现初始化错误:
smbclient -L localhost -N
sudo samba-tool dbcheck --cross-ncs
列表显示 sysvol、netlogon,新域检查 3,841 个对象且没有错误。SMB1 disabled 是预期提示;Samba 默认关闭 SMB1,Windows 11 也不需要它。
Sharename Type Comment
--------- ---- -------
sysvol Disk
netlogon Disk
IPC$ IPC IPC Service (Samba 4.22.11-Debian-4.22.11+dfsg-0+deb13u1)
SMB1 disabled -- no workgroup available
Checking 3841 objects
Checked 3841 objects (0 errors)
初始化不会创建反向区域,查询 DC 的 IP 会被转发并返回空结果。为子网创建反向区域,再添加 DC 的 PTR 记录;每条 samba-tool 命令都会询问 Administrator 密码:
sudo samba-tool dns zonecreate dc01 1.168.192.in-addr.arpa -U Administrator
sudo samba-tool dns add dc01 1.168.192.in-addr.arpa 231 PTR dc01.ad.example.com -U Administrator
host 192.168.1.231
实验反向查询返回 DC 完整名称:
231.1.168.192.in-addr.arpa domain name pointer dc01.ad.example.com.
区域创建后,该子网的反向查询由 DC 自身回答。
Samba AD DC 报告哪个功能级别?
新建 Samba 4.22 域的林、域和最低 DC 功能级别都为 Windows Server 2008 R2。使用 samba-tool 检查:
sudo samba-tool domain level show
实验输出与服务状态、Kerberos SRV 记录一并显示如下:

直接提高功能级别会失败。DC 自身声明的最高级别还是 2008 R2,域不能高于它:
sudo samba-tool domain level raise --domain-level=2016 --forest-level=2016
Samba 拒绝并输出:
ERROR: Domain function level can't be higher than the lowest function level of a DC!
Samba 4.19 引入对 2012、2012 R2、2016 的部分支持,发布说明介绍了主动启用方式。Samba 部署文档仍建议不要在生产环境使用,因此以下仅在实验 DC 测试。大多数办公室应保持 2008 R2,可直接跳到下一节。
在 smb.conf 的 [global] 下添加一行启用配置。打开文件:
sudo vim /etc/samba/smb.conf
在 server role 下添加以下行,保存后重启 samba-ad-dc:
ad dc functional level = 2016
重启后,samba-tool domain level show 的最低 DC 级别变为 2016,域和林仍为 2008 R2。然后执行 schema 升级、功能准备和级别提升:
sudo systemctl restart samba-ad-dc
sudo samba-tool domain schemaupgrade --schema=2019
sudo samba-tool domain functionalprep --function-level=2016
sudo samba-tool domain level raise --domain-level=2016 --forest-level=2016
Samba 4.22 初始化的域已应用相关 schema 和域更新,所以前两条命令没有实际变更:schema 升级输出 No changes applied to schema,准备步骤跳过所有更新。只有 raise 更改了级别:
Domain function level changed!
Forest function level changed!
All changes applied successfully!
再次执行 level show,三项均为 2016;dbcheck 检查 3,849 个对象,仍为 0 错误。应将提升视为单向操作:samba-tool domain level 只有 show 和 raise。日后加入的每台 DC 都必须启用 2016 支持,不能使用 4.19 之前的 Samba。
如何从 Debian 添加用户和组?
日常账户管理无需 Windows:DC shell 的 samba-tool 可创建 OU(组织单位)、用户和组。实验在 Staff OU 创建用户,并加入 HelpDesk 组,后面 Windows 端也会使用:
sudo samba-tool ou create "OU=Staff,DC=ad,DC=example,DC=com"
sudo samba-tool user create jdoe 'Welcome-2026!' --given-name=Jane --surname=Doe --mail-address=jdoe@ad.example.com --userou=OU=Staff
sudo samba-tool group add HelpDesk
sudo samba-tool group addmembers HelpDesk jdoe
检查账户位置和组成员关系:
sudo samba-tool user show jdoe --attributes=distinguishedName,userPrincipalName,memberOf
Jane Doe 位于 Staff OU,UPN(用户主体名称)根据 realm 生成:
dn: CN=Jane Doe,OU=Staff,DC=ad,DC=example,DC=com
userPrincipalName: jdoe@ad.example.com
memberOf: CN=HelpDesk,CN=Users,DC=ad,DC=example,DC=com
distinguishedName: CN=Jane Doe,OU=Staff,DC=ad,DC=example,DC=com
group add 没有指定 OU,因此组位于默认 Users 容器。若要让组与用户都在 Staff,可添加 --groupou=OU=Staff。
如何将 Windows 11 加入 Samba 域?
客户端 DNS 指向 DC,确认能找到 DC,再运行 Add-Computer。实验客户端为 Windows 11 Enterprise 24H2,构建号 26100。以提升权限的 PowerShell 执行下方命令,接口名按 Get-NetAdapter 的输出填写。如果 DHCP 默认提供路由器作为 DNS,最好修改 DHCP 选项,避免逐台手动更改:
Set-DnsClientServerAddress -InterfaceAlias Ethernet -ServerAddresses 192.168.1.231
nltest /dsgetdc:ad.example.com
客户端立即找到 dc01,标志包含 Windows DC 常见角色:PDC、全局编录、KDC、时间服务器和可写目录。如果 nltest 失败,应先修复 DNS;直接加域只会因同一原因失败,并显示更模糊的信息。
DC: \\dc01.ad.example.com
Address: \\192.168.1.231
Dom Guid: 308e5884-003a-4a3c-b686-4ff6639c7cdc
Dom Name: ad.example.com
Forest Name: ad.example.com
Dc Site Name: Default-First-Site-Name
Our Site Name: Default-First-Site-Name
Flags: PDC GC DS LDAP KDC TIMESERV GTIMESERV WRITABLE DNS_DC DNS_DOMAIN DNS_FOREST CLOSE_SITE FULL_SECRET
The command completed successfully
在加域前先给计算机设置最终名称并重启,因为加域时的名称会成为 AD 中的名称。然后用 Administrator 账户加入域;PowerShell 询问密码、向 DC 写入计算机账户后,客户端需要重启:
Add-Computer -DomainName ad.example.com -Credential EXAMPLE\Administrator
Restart-Computer
实验模板保留了出厂主机名,曾用 -NewName WIN11-LAB 同时改名并加域。加域成功,但 AD 出现不一致:计算机账户和 DNS 名称采用新名称,对象 CN 却保留旧名称,ADUC 和 LDAP 路径都显示旧名称。分步改名再加域可避免它。已经遇到此问题时,可安装 ldb-tools 并用 ldbrename 在 DC 重命名对象,旧名称取自 samba-tool computer show WIN11-LAB 的 dn: 行。工具直接修改 sam.ldb,先用 sudo samba-tool domain backup offline --targetdir=/root/samba-backup 备份;实验生成了 samba-backup-*.tar.bz2 文件。
sudo apt install -y ldb-tools
sudo ldbrename -H /var/lib/samba/private/sam.ldb "CN=OLD-NAME,CN=Computers,DC=ad,DC=example,DC=com" "CN=WIN11-LAB,CN=Computers,DC=ad,DC=example,DC=com"
回到 DC,应能列出新计算机及客户端系统信息。客户端在加域后自行写入这些属性;operatingSystem 为空通常表示还未重启。
sudo samba-tool computer show WIN11-LAB --attributes=distinguishedName,dNSHostName,operatingSystem,operatingSystemVersion
客户端自动注册系统构建号和完整 DNS 名称,并在区域创建 A 记录。DC 上的 host win11-lab.ad.example.com 验证了它。
dn: CN=WIN11-LAB,CN=Computers,DC=ad,DC=example,DC=com
operatingSystem: Windows 11 Enterprise Evaluation
operatingSystemVersion: 10.0 (26100)
dNSHostName: WIN11-LAB.ad.example.com
distinguishedName: CN=WIN11-LAB,CN=Computers,DC=ad,DC=example,DC=com
在客户端测试与 DC 的安全通道。两项检查都应通过,域用户才能登录:
Test-ComputerSecureChannel
nltest /sc_query:ad.example.com
实验返回 True,并报告与 dc01 的信任关系成功:
True
Flags: 30 HAS_IP HAS_TIMESERV Authentication Service: Netlogon
Trusted DC Name \\dc01.ad.example.com
Trusted DC Connection Status Status = 0 0x0 NERR_Success
The command completed successfully
此时计算机已是域成员,域账户可以在登录界面登录。下一节实验使用域 Administrator 确认了这一点。
Windows 11 会从 Samba DC 同步时间吗?
Debian 默认 chrony 配置不会完成这一工作。域成员使用 NT5DS 模式向 DC 请求签名时间,而前面安装的 chrony 默认既不为局域网提供服务,也不签名响应。实验客户端退回自身时钟,每小时记录事件 24:联系 dc01.ad.example.com 八次后仍未收到有效响应。时差超过五分钟会影响 Kerberos。
Samba 时间同步文档要求 chrony 允许客户端子网访问,并通过 Samba 的 ntp_signd 套接字签名。添加两行配置,给 chrony 所属组访问套接字目录的权限:
printf "allow 192.168.1.0/24\nntpsigndsocket /var/lib/samba/ntp_signd\n" | sudo tee /etc/chrony/conf.d/samba-ad.conf
sudo chgrp _chrony /var/lib/samba/ntp_signd
sudo chmod 750 /var/lib/samba/ntp_signd
sudo systemctl restart chrony
重启后 chrony 监听 UDP 123,日志输出 MS-SNTP authentication enabled。客户端执行 w32tm /stripchart /computer:dc01.ad.example.com 能取到样本,偏移 1.48 秒。继续在客户端检查实际时间来源:
w32tm /resync /rediscover
w32tm /query /source
实验在修改十分钟后、甚至重启 w32time 后,仍显示 Local CMOS Clock,所以未能确认签名同步成功。DC 的 sudo chronyc clients 能看到客户端,但 sudo chronyc serverstats 仍显示 Authenticated NTP packets : 0:客户端访问了 chrony,却没有取得签名响应。健康状态应在客户端显示时间来源 dc01.ad.example.com。若也停留在 CMOS 时钟,检查 DC 的 journalctl -k 是否有访问 ntp_signd 套接字的 AppArmor 拒绝;Debian 13 的 chronyd 受限制,实验中未发现拒绝。还应通过 w32tm /stripchart 监控偏移,避免进入 Kerberos 失败范围。
如何通过 RSAT 管理 Samba AD?
RSAT 的 MMC 控制台可管理 Samba DC,Active Directory PowerShell 模块却不能。ADUC、GPMC 通过 Samba 提供的 LDAP、SMB 工作;Get-AD* cmdlet 依赖 9389 端口的 Active Directory Web Services,而 Samba 没有实现它。因此应使用控制台配合 samba-tool。
在 Windows 11 客户端提升权限的提示符中安装 AD 和组策略工具。它们属于按需功能,会从 Windows Update 下载:
dism /Online /Add-Capability /CapabilityName:Rsat.ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0
dism /Online /Add-Capability /CapabilityName:Rsat.GroupPolicy.Management.Tools~~~~0.0.1.0
为安装预留足够时间。实验成功的 dism 运行中,AD 工具花了 74 分钟,Windows Update 下载约 1 GB 按需功能,并长时间停在 36%~60%;组策略工具又花了约 33 分钟。Add-WindowsCapability 功能相同,但实验首次运行失败并报 0x80240438,第二次挂起,随后改用带进度显示的 dism。微软 RSAT 安装文档还介绍其他安装方式及 Pro、Enterprise 版本要求。
工具安装后首先尝试 AD 模块,立即失败:
Import-Module ActiveDirectory
Get-ADDomain
即使 Get-ADDomainController -Discover 可通过 DNS 找到 dc01,所有 Get-AD* 调用仍返回同样的错误:
WARNING: Error initializing default drive: 'Unable to find a default server with Active Directory Web Services running.'.
Get-ADDomain : Unable to find a default server with Active Directory Web Services running.
+ CategoryInfo : ResourceUnavailable: (EXAMPLE:ADDomain) [Get-ADDomain], ADServerDownException
+ FullyQualifiedErrorId : ActiveDirectoryServer:1355,Microsoft.ActiveDirectory.Management.Commands.GetADDomain
同一个 RSAT 包中的旧版 LDAP 命令行工具正常,是 Windows 端可用的脚本选择。在 cmd 中查询此前创建的用户和域功能级别:
dsquery user -samid jdoe | dsget user -samid -upn -email -dn
dsquery user -samid jdoe | dsget user -memberof
dsquery * -filter (objectClass=domainDNS) -attr msDS-Behavior-Version
Windows 看到相同用户、组和提升后的级别。AD 用 msDS-Behavior-Version = 7 表示 2016 域功能级别;保持 2008 R2 的域为 4:
dn samid upn email
CN=Jane Doe,OU=Staff,DC=ad,DC=example,DC=com jdoe jdoe@ad.example.com jdoe@ad.example.com
dsget succeeded
"CN=HelpDesk,CN=Users,DC=ad,DC=example,DC=com"
"CN=Domain Users,CN=Users,DC=ad,DC=example,DC=com"
msDS-Behavior-Version
7
控制台操作应使用域账户登录客户端。实验以 EXAMPLE\Administrator 登录,也验证了 Samba KDC 的交互式域登录,然后打开 Active Directory Users and Computers(dsa.msc)。无需额外设置,它就绑定到 dc01,显示 Debian 创建的目录:

ad.example.com域节点是通过 LDAP 从dc01读取的 Samba 目录。- Staff OU 来自 DC 上的
samba-tool ou create。 - Jane Doe 来自
samba-tool user create,可像普通 AD 用户一样编辑。
Group Policy Management(gpmc.msc)同样正常打开,列出林、域、Staff OU 和 Group Policy Objects 容器。Status 页显示 dc01.ad.example.com 是该域的基准域控制器:

不同 RSAT 组件对 Samba DC 的兼容情况不同,规划管理工具前应检查:
- ADUC 可打开域,显示
samba-tool创建的 OU 和用户。 - GPMC 和 GroupPolicy 模块可列出 Samba DC 上的 GPO 及其链接。
dsquery、dsget可返回用户、组和域级别。- 全部
Get-AD*cmdlet 失败,因为 Samba 不提供 Active Directory Web Services。
客户端终端汇总了这些区别:安全通道正常,组策略正常应用,LDAP 查询成功,但 AD cmdlet 失败:

实验没有安装 DNS 控制台,因为这里每个按需功能安装都超过半小时。前面展示的 samba-tool dns 可直接在 DC 管理区域,无需 Windows 工具;除非管理员必须使用 GUI,否则可省去该功能。若还需要在 Windows 11 上建立共享文件夹,可参考 Windows 11 Samba 共享指南。
如何从 Samba DC 下发组策略?
Windows 11 从 Samba DC 应用组策略的方式与 Windows DC 相同:GPO 本质是 LDAP 对象加 SYSVOL 文件。可在 GPMC 创建,也可完全在 Debian 使用 samba-tool gpo,适合脚本管理或尚无 Windows 管理工作站的场景。实验创建了设置登录提示的计算机策略,方便在客户端观察结果。
samba-tool gpo load 以 JSON 读取注册表设置。在 DC 创建文件:
vim ~/logon-notice.json
添加 Windows 登录提示使用的两个值。两者均为计算机设置,所以 class 为 MACHINE:
[
{
"keyname": "Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System",
"valuename": "LegalNoticeCaption",
"class": "MACHINE",
"type": "REG_SZ",
"data": "EXAMPLE domain"
},
{
"keyname": "Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System",
"valuename": "LegalNoticeText",
"class": "MACHINE",
"type": "REG_SZ",
"data": "This PC is managed by the Samba AD DC dc01.ad.example.com."
}
]
先创建空 GPO。samba-tool 输出分配的 GUID,后续命令全部通过 GUID 引用,而不是策略名,应在清屏前记录:
sudo samba-tool gpo create "Logon Notice" -U Administrator
实验返回以下 GUID:
GPO 'Logon Notice' created as {65BAA2E7-D265-4228-BAE9-BBD12BFEC5B5}
加载 JSON,并链接到域根,让域内每台计算机都收到策略。全域登录提示适合链接域根;面向部分机器的策略可链接 OU。请替换为自己的 GUID:
sudo samba-tool gpo load "{65BAA2E7-D265-4228-BAE9-BBD12BFEC5B5}" --content=$HOME/logon-notice.json -U Administrator
sudo samba-tool gpo setlink "DC=ad,DC=example,DC=com" "{65BAA2E7-D265-4228-BAE9-BBD12BFEC5B5}" -U Administrator
用同一个 GUID 运行 samba-tool gpo show,可以从 SYSVOL 回读策略;注册表客户端扩展出现在 Machine Exts,版本升为 1。在 Windows 11 强制刷新计算机策略,检查应用的 GPO:
gpupdate /target:computer /force
gpresult /scope computer /r
实验客户端更新成功,gpresult 显示来源为 dc01,并把新 GPO 列入已应用列表:
Last time Group Policy was applied: 10/30/2026 at 2:51:55 PM
Group Policy was applied from: dc01.ad.example.com
Domain Name: EXAMPLE
Domain Type: Windows 2008 or later
Applied Group Policy Objects
-----------------------------
Logon Notice
The following GPOs were not applied because they were filtered out
-------------------------------------------------------------------
Default Domain Policy
Filtering: Not Applied (Empty)
Local Group Policy
Filtering: Not Applied (Empty)
刷新后客户端注册表立即含有两个值。Default Domain Policy 显示 Not Applied (Empty),因为新 Samba 域的默认策略没有设置,Windows 会跳过它。若自己的 GPO 没出现,首先使用 samba-tool gpo getlink "DC=ad,DC=example,DC=com" 检查链接。
下次启动,Windows 11 在登录界面前显示提示,文字与 Debian 上 JSON 文件完全一致:

同一个 GPO 在 Windows 端也可见,证明 GPMC 和 GroupPolicy PowerShell 模块能管理 Samba,而 AD 模块不能。前两者通过 LDAP、SYSVOL 读取 GPO 列表及链接:
Get-GPO -All -Domain ad.example.com | Select-Object DisplayName,GpoStatus,ModificationTime
(Get-GPInheritance -Target 'DC=ad,DC=example,DC=com' -Domain ad.example.com).GpoLinks | Select-Object DisplayName,Enabled,Order
三项 GPO 均返回,链接顺序显示新策略在 Default Domain Policy 之后处理:
DisplayName GpoStatus ModificationTime
----------- --------- ----------------
Logon Notice AllSettingsEnabled 10/30/2026 2:51:46 PM
Default Domain Controllers Policy AllSettingsEnabled 10/30/2026 11:14:18 AM
Default Domain Policy AllSettingsEnabled 10/30/2026 11:14:18 AM
DisplayName Enabled Order
----------- ------- -----
Default Domain Policy True 1
Logon Notice True 2
登录提示要求有人点击 OK,因此会阻止自动登录。实验结束后使用 samba-tool gpo dellink,传入与 setlink 相同的两个参数移除了链接。将提示策略链接到自助终端或自动登录机器所在的域前,应考虑这个影响。
实验遇到的错误与修复方法
以下提示均在部署期间出现,多数与 DNS 或初始化默认值有关。先理解原因,再应用修复。
samba_dnsupdate:Record already exists; record could not be added
DC 使用其他解析器,云镜像中常见的是 systemd-resolved。更新程序查不到刚创建的记录,于是重复添加,Samba DNS 拒绝。让 /etc/resolv.conf 指向 DC 自身 IP,修正 dns forwarder,重启 samba-ad-dc,日志即可恢复正常。
Domain function level can’t be higher than the lowest function level of a DC!
DC 仍声明 2008 R2 时,samba-tool domain level raise 会输出此错误。只有在 smb.conf 设置 ad dc functional level 并重启服务后,Samba 才声明支持 2012 及以上。检查 level show 的最低 DC 级别;变为 2016 后才能提升。
Warning: Your password will expire in 41 days
初始化创建的 Administrator 同样受默认 42 天密码期限约束。今天是警告,六周后可能无法登录。可运行 samba-tool user setexpiry Administrator --noexpiry;若要改变整个域的策略,使用 samba-tool domain passwordsettings set。
Unable to find a default server with Active Directory Web Services running
RSAT ActiveDirectory 模块的所有 Get-AD* cmdlet 都会这样失败,因为它们访问 ADWS,而 Samba 不提供这项服务。调整客户端或 DC 无法补齐该实现。Windows 使用 ADUC、GPMC、GroupPolicy 模块、dsquery、dsget,DC 脚本使用 samba-tool。
Add-WindowsCapability failed. Error code = 0x80240438
实验首次安装 RSAT 在一分钟内报此错误,虽然互联网和经 DC 的 DNS 都正常。重试在下载后挂起,后来的 dism 运行也无法启动,直到重启清除了卡住的维护会话。最终有效的做法是重启,再一次执行一个 dism /Add-Capability,等待 The operation completed successfully。下载完全没有流量时,将 Delivery Optimization 的 DODownloadMode 设置为 0(仅 HTTP)并重启 dosvc 恢复了下载;这只是实验中的变通方案,并非根因诊断。
部署检查清单
重建后或增加客户端前依次检查。每项通常不到一分钟,顺序遵循架构图的登录路径,首个失败项就是优先修复对象:
- DC 上
hostname -f输出dc01.ad.example.com,而不是短主机名。 - DC 的
/etc/resolv.conf只配置 DC 自身地址。 smb.conf的dns forwarder指向实际解析器,而不是127.0.0.53。smbd、nmbd、winbind均已 mask,samba-ad-dc为 active。host -t SRV _ldap._tcp.ad.example.com.返回 DC 的 389 端口。kinit administrator获取票据,且没有时钟偏移错误。samba-tool dbcheck --cross-ncs报告 0 错误。- Windows 11 仅使用 DC 作为 DNS,
nltest /dsgetdc可找到它。 - 客户端
Test-ComputerSecureChannel返回True。 - 客户端
gpresult /r在已应用对象中列出测试 GPO。
十项全部通过后,下一步是增加第二台 DC 实现故障切换。若还运行 Linux 服务器,可将 Rocky Linux 和 AlmaLinux 加入同一域,让一套账户用于两类系统。










