news 2026/8/12 10:50:05

基于Samba在Linux上搭建Active Directory域控实战指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于Samba在Linux上搭建Active Directory域控实战指南

1. 项目概述:为什么要在Linux上用Samba做域控?

在传统的企业IT架构里,一提到“域控”,大家脑子里蹦出来的肯定是微软的Windows Server。Active Directory(AD)几乎成了企业身份认证和集中管理的代名词。但如果你是一个运维工程师,面对一个成本敏感、或者技术栈偏向开源的环境,有没有可能用一套完全免费、稳定且可控的方案来替代呢?答案是肯定的,而主角就是Samba。

Samba不是一个新玩意儿,它本质是一套让Linux/Unix系统能够理解并响应Windows网络协议(主要是SMB/CIFS)的软件集合。最广为人知的功能是作为文件服务器,让Windows电脑能像访问网上邻居一样访问Linux共享。但很多人不知道的是,从Samba 4.0版本开始,它完整地实现了AD域控制器的全部功能,包括域用户认证、组策略(部分)、DNS、DHCP等。这意味着,你可以用一台普通的Linux服务器,搭建一个完全兼容Windows客户端的域环境。

我之所以会深入研究这个方案,是因为几年前接手了一个混合环境的小型创业公司项目。服务器端全是CentOS,但员工桌面端清一色的Windows 10。老板既不想为几台服务器和几十个客户端购买Windows Server授权,又希望实现统一的账号管理和文件共享权限控制。Samba AD DC(Active Directory Domain Controller)就成了最理想的解决方案。实测下来,它不仅稳定运行了数年,而且在管理体验上,一旦熟悉了命令行和Samba特有的工具,效率甚至比在图形界面里点来点去还要高。

这个方案特别适合哪些场景呢?首先是预算有限的中小企业或技术团队;其次是开发测试环境,需要快速搭建一个域环境来验证应用;再者是那些服务器主体是Linux,但需要接入Windows客户端的混合IT环境。当然,如果你是一个喜欢折腾、希望深入理解AD协议底层原理的技术爱好者,这更是一个绝佳的学习路径。

2. 核心架构与方案选型考量

决定用Samba做域控,可不是简单地yum install samba就完事了。在动手之前,必须把整个架构和各个组件的角色想清楚,这直接决定了后续实施的顺利与否。

2.1 单域控 vs. 多域控高可用

对于大多数中小规模环境,一台Samba域控服务器足以胜任。它同时扮演着AD DC、DNS服务器、Kerberos密钥分发中心(KDC)等多种角色。这种“All in One”的部署方式简单直接,维护成本低。

但是,如果对服务的可用性有要求,或者用户规模较大,就需要考虑部署多台域控。Samba支持多DC架构,域控之间通过AD数据库(基于LDAP)的复制来同步用户、组等信息。这里有个关键点:第一台搭建的域控称为“主域控”,后续加入的称为“额外域控”。主域控拥有FSMO(操作主机)角色,虽然Samba对FSMO角色的管理不如Windows那样直观,但在规划时仍需明确。

在我的实施经验里,对于50人以下的团队,单域控配合定时的系统级备份(比如使用rsynctar备份Samba的数据库和配置文件目录)就足够了。如果超过这个规模,或者有核心业务必须7x24小时认证,我会建议至少部署两台域控,并配置DNS轮询或负载均衡器来实现客户端的自动故障转移。

2.2 集成服务规划:DNS是关键

一个能用的AD域,严重依赖DNS。Windows AD的许多核心功能,如域控制器定位、服务发现(SRV记录)、Kerberos认证等,都需要正确的DNS记录来引导。

Samba在作为域控安装时,强烈推荐使用它自带的内部DNS服务器(基于BIND 9的DLZ插件)。这个选择省心省力,因为Samba会自动创建和维护所有必需的DNS记录,比如_ldap._tcp.dc._msdcs.<domain>这样的SRV记录。如果你坚持使用外部DNS(比如公司已有的BIND或Windows DNS),就需要手动添加一大堆记录,非常容易出错,而且后续管理也很麻烦。

注意:很多初次尝试者失败的原因都出在DNS上。确保你的服务器主机名是完整的FQDN(完全合格域名),并且网络配置中的DNS服务器地址指向了自己(127.0.0.1)。在安装过程中,Samba会检查DNS配置,如果不正确会报错。

另一个需要考虑的服务是时间同步(NTP)。AD Kerberos认证协议对时间差非常敏感,通常要求客户端和服务器的时间差不超过5分钟。因此,必须确保你的Samba域控服务器与可靠的时间源同步,并作为时间服务器为域内的Windows客户端提供时间。

2.3 Linux发行版与Samba版本选择

这不是一个随意的选择。不同的Linux发行版其软件仓库中提供的Samba版本可能差异很大。

  • RHEL/CentOS/Rocky Linux/AlmaLinux (7.x/8.x/9.x):这些企业级发行版的默认仓库中的Samba版本往往比较保守,可能不是最新的稳定版。例如,CentOS 7默认是Samba 4.10左右,而最新的稳定版可能已经到了4.19。好处是极度稳定,与系统其他部分集成好;缺点是可能缺少一些新特性或安全补丁。我通常选择从官方Samba仓库或EPEL仓库获取较新的版本。
  • Ubuntu/Debian:它们的软件仓库更新更积极。例如Ubuntu 22.04 LTS就提供了Samba 4.15。对于追求新功能和社区支持的用户,这是一个好选择。
  • openSUSE/Fedora:同样提供较新的软件包,适合喜欢前沿技术的用户。

我的建议是:生产环境优先选择RHEL系,因为其长期支持(LTS)特性和企业级生态;学习和测试环境可以用Ubuntu,上手更快。无论选择哪个,都要确保安装的是samba-ad-dc这个包(或类似名称),它包含了作为域控所需的所有组件,而不仅仅是文件共享服务。

3. 实战部署:从零搭建Samba AD域控

理论说再多不如动手做一遍。下面我将以一台全新的CentOS 8 Stream(或Rocky Linux 8)服务器为例,演示完整的部署过程。假设我们要创建的域名为CORP.LOCAL,服务器主机名为dc01.corp.local,IP地址为192.168.1.10

3.1 前期系统准备与环境检查

部署的第一步不是安装软件,而是打好基础。一个配置不当的基础系统会让后续步骤举步维艰。

1. 设置静态IP和主机名这是铁律。域控服务器绝对不能使用DHCP获取动态IP。

# 编辑网络配置文件,例如对于ens192网卡 sudo vi /etc/sysconfig/network-scripts/ifcfg-ens192

确保包含以下关键配置:

BOOTPROTO=none IPADDR=192.168.1.10 NETMASK=255.255.255.0 GATEWAY=192.168.1.1 DNS1=127.0.0.1 # 先指向自己,安装Samba DNS后再改 DNS2=192.168.1.1 # 可设置一个上游DNS作为备用 DOMAIN=corp.local

设置主机名:

sudo hostnamectl set-hostname dc01.corp.local # 编辑/etc/hosts,确保有一行指向本机 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.1.10 dc01.corp.local dc01

2. 关闭并禁用不必要服务关闭SELinux和防火墙(仅用于实验环境,生产环境需配置安全策略):

sudo setenforce 0 sudo sed -i 's/^SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config sudo systemctl stop firewalld sudo systemctl disable firewalld

3. 同步时间

sudo yum install -y chrony sudo systemctl enable --now chronyd sudo chronyc sources

3.2 安装Samba AD DC软件包

配置好YUM仓库(如果需要更新版本,可以添加Samba官方仓库或EPEL),然后安装核心包:

sudo dnf install -y samba-ad-dc samba-client samba-common-tools krb5-workstation bind bind-dyndb-ldap

这里我们一口气安装了:

  • samba-ad-dc: 域控主程序。
  • samba-client&samba-common-tools: 包含管理工具如samba-tool
  • krb5-workstation: Kerberos客户端工具,用于测试认证。
  • bind,bind-dyndb-ldap: BIND DNS服务器及其LDAP动态数据库插件,Samba将用它来提供集成DNS。

3.3 使用Samba-tool创建新域

这是最关键的一步。我们将使用samba-tool这个强大的命令行工具来初始化一个新的AD森林和域。

sudo samba-tool domain provision --use-rfc2307 --interactive

执行这个命令后,会进入一个交互式配置界面:

  • Realm: 输入大写的域名,例如CORP.LOCAL。这是Kerberos领域的名称。
  • Domain: 输入NetBIOS域名,通常是域名的第一部分,例如CORP。这是旧式Windows网络使用的名称。
  • Server Role: 选择dc,表示作为域控制器。
  • DNS backend: 强烈选择SAMBA_INTERNAL。这就是前面提到的集成DNS,管理最方便。
  • DNS forwarder IP address: 可以输入一个上游DNS服务器IP,如8.8.8.8。当Samba DNS无法解析外部域名时,会转发请求到这里。
  • Administrator password: 设置一个强密码。这是域管理员Administrator的密码,务必牢记。

命令运行成功后,会在/var/lib/samba/private//etc/samba/下生成所有必要的配置文件和数据文件。其中,/etc/samba/smb.conf是主配置文件,现在已经被自动配置为域控模式。

一个重要操作:将Samba生成的Kerberos配置文件链接到系统标准位置:

sudo cp /var/lib/samba/private/krb5.conf /etc/krb5.conf

3.4 启动服务并验证

首先,需要停用并禁用可能冲突的旧版Samba服务(如果之前安装过):

sudo systemctl disable --now smb nmb winbind

然后,启用并启动Samba域控服务:

sudo systemctl unmask samba-ad-dc sudo systemctl enable --now samba-ad-dc

检查服务状态:

sudo systemctl status samba-ad-dc

如果状态为active (running),恭喜你,域控的核心服务已经跑起来了。

3.5 基础功能验证

现在,让我们从几个维度验证域控是否工作正常。

1. 验证DNS记录Samba应该已经自动注册了大量DNS记录。我们可以用hostdig命令查询:

# 查询域控制器定位记录 dig -t SRV _ldap._tcp.dc._msdcs.corp.local @127.0.0.1 # 查询域控的A记录 dig dc01.corp.local @127.0.0.1

如果能看到正确的IP地址和SRV记录,说明DNS服务运行良好。

2. Kerberos认证测试尝试获取一个Kerberos票据(Ticket):

kinit administrator@CORP.LOCAL

系统会提示输入密码(就是provision时设置的Administrator密码)。输入后,使用klist命令查看当前缓存的票据。如果能看到administrator@CORP.LOCAL的票据,说明Kerberos认证成功。

3. 使用samba-tool进行管理查询

sudo samba-tool user list

这条命令会列出域中的所有用户。初始状态下,你应该能看到Administrator、Guest等默认账户。

4. 从Windows客户端测试加入域(可选)找一台Windows 10/11电脑,将其DNS服务器地址设置为你的Samba域控IP(192.168.1.10)。然后进入“系统属性”->“计算机名”选项卡,点击“更改”,选择“域”,输入CORP.LOCAL,然后使用管理员账号(CORP\administrator)和密码进行加入。如果成功,则证明域控的核心功能完全正常。

4. 日常管理与高级配置

域控搭建起来只是开始,日常管理才是重头戏。Samba提供了强大的命令行工具集,大部分管理工作都可以通过samba-tool完成。

4.1 用户与组管理

在Samba AD中管理用户和组,完全不需要图形界面。

创建用户:

sudo samba-tool user create zhangsan --given-name=San --surname=Zhang --department=IT # 创建时会随机生成密码,并提示你修改。也可以指定密码: sudo samba-tool user create lisi Passw0rd123!

创建组并将用户加入组:

sudo samba-tool group add IT-Staff sudo samba-tool group addmembers IT-Staff zhangsan,lisi

修改用户属性(如重置密码、禁用账户):

sudo samba-tool user setpassword zhangsan --newpassword=NewPass123! sudo samba-tool user disable zhangsan sudo samba-tool user enable zhangsan

使用LDAP命令进行复杂查询:虽然samba-tool很强大,但有时需要更灵活的查询,这时可以直接使用LDAP命令。Samba AD的LDAP服务端口是389。

# 搜索所有用户 ldapsearch -H ldap://dc01.corp.local -x -b "dc=corp,dc=local" "(objectClass=user)" sAMAccountName # 搜索特定用户详细信息 ldapsearch -H ldap://dc01.corp.local -x -b "dc=corp,dc=local" "(sAMAccountName=zhangsan)"

4.2 组策略对象(GPO)管理

Samba对组策略的支持是部分实现的,主要支持的是“策略”的存储和下发机制,对于策略的具体内容(ADMX模板),其解释和执行仍然依赖于Windows客户端。但我们可以管理GPO的链接和状态。

Samba将GPO信息存储在sysvol共享中,路径是/var/lib/samba/sysvol/。你可以使用samba-tool来创建和链接GPO,但更复杂的策略编辑,通常是在一台已加入域的Windows电脑上,使用“组策略管理编辑器”(GPMC)远程连接到Samba域控来进行。这是一个典型的混合管理场景:策略存储在Linux上,用Windows工具编辑。

4.3 文件共享与权限集成

这是Samba的老本行,也是AD域价值最直接的体现。我们可以在域控或其他Linux成员服务器上创建共享,并直接使用域用户和组来设置NTFS风格(在Linux上是ACL)的权限。

假设我们要在域控上创建一个共享文件夹/srv/dept-share给IT部门使用:

# 1. 创建目录并设置所有权 sudo mkdir -p /srv/dept-share sudo chown -R root:"CORP\Domain Admins" /srv/dept-share # 2. 设置ACL,赋予IT-Staff组读写权限 sudo setfacl -m g:"CORP\IT-Staff":rwx /srv/dept-share sudo setfacl -m d:g:"CORP\IT-Staff":rwx /srv/dept-share # 默认ACL # 3. 编辑Samba配置文件/etc/samba/smb.conf,添加共享定义 [ITShare] path = /srv/dept-share read only = no valid users = @"CORP\IT-Staff" force group = "CORP\IT-Staff" inherit acls = yes nt acl support = yes # 4. 重启Samba服务(在域控上,重启samba-ad-dc服务会同时重载文件共享配置) sudo systemctl restart samba-ad-dc

现在,IT部门的成员在Windows文件资源管理器中输入\\dc01.corp.local\ITShare,用他们的域账号登录后,就可以访问这个共享了,并且权限完全由AD组控制。

4.4 备份与恢复策略

域控的备份至关重要,主要备份两部分:Samba数据库系统状态

1. Samba数据库备份:Samba AD的数据库位于/var/lib/samba/private//var/lib/samba/sysvol/。最简单的备份方式是定时打包。

# 创建备份脚本 sudo vi /usr/local/bin/backup-samba-ad.sh

脚本内容示例:

#!/bin/bash BACKUP_DIR="/backup/samba-ad" DATE=$(date +%Y%m%d_%H%M%S) tar -czf "$BACKUP_DIR/samba-backup-$DATE.tar.gz" \ /etc/samba/smb.conf \ /var/lib/samba/private \ /var/lib/samba/sysvol \ 2>/dev/null # 保留最近7天的备份 find $BACKUP_DIR -name "samba-backup-*.tar.gz" -mtime +7 -delete

然后添加cron任务定期执行。

2. 使用samba-tool进行在线备份:samba-tool提供了更专业的备份命令,可以生成一个可移植的备份文件。

sudo samba-tool domain backup offline --targetdir=/backup/samba-ad

3. 系统级备份:考虑使用rsnapshotborgbackup等工具对整个系统进行增量备份,以防硬件故障。

恢复演练:定期在测试环境进行恢复演练非常重要。恢复的大致步骤是:在新机器上安装相同版本的Samba,停止服务,解压备份文件到相应位置,恢复配置文件,然后启动服务。具体命令需参考Samba官方文档,因为涉及数据库恢复操作。

5. 故障排查与性能优化实录

即使按照指南操作,在实际部署和运行中也可能遇到各种问题。下面是我在多次部署中积累的一些常见问题及解决方法。

5.1 常见问题速查表

问题现象可能原因排查步骤与解决方案
samba-tool domain provision失败,提示“DNS服务器无法解析主机名”1. 主机名不是FQDN。
2./etc/hosts文件未正确配置。
3. 系统DNS设置未指向自己(127.0.0.1)。
1.hostname -f检查是否为dc01.corp.local
2. 检查/etc/hosts,确保有192.168.1.10 dc01.corp.local dc01
3. 检查/etc/resolv.conf,确保第一行是nameserver 127.0.0.1
Windows客户端无法加入域,提示“找不到网络路径”或“域控制器不可用”1. 网络不通或防火墙阻挡。
2. 客户端DNS未指向Samba域控。
3. Samba服务未运行或端口未监听。
1. 从客户端ping域控IP和主机名。
2. 在客户端nslookupcorp.local_ldap._tcp.dc._msdcs.corp.local,看解析是否正确。
3. 在域控上运行sudo netstat -tlnp | grep -E ‘:(389|53|88|445|135|139)’,检查关键端口(LDAP, DNS, Kerberos, SMB等)是否处于监听状态。
用户登录失败,提示“用户名或密码不正确”1. 密码错误。
2. 账户被禁用。
3. Kerberos票据问题。
4. 时间不同步。
1. 在域控上用samba-tool user list确认账户存在。
2. 用samba-tool user status <username>查看账户是否禁用。
3. 在域控上用kinit测试管理员账号能否获取票据。
4. 检查客户端和服务器时间,差异应在5分钟内。
文件共享可以访问,但无法写入或权限混乱1. 共享目录的Linux文件系统权限(POSIX权限)限制。
2. Windows ACL未正确设置或继承。
3. Samba配置中force user/group设置冲突。
1. 检查目录的Linux所有者和权限(ls -la)。
2. 在Linux上用getfacl查看目录的ACL,确保域用户/组有相应权限。
3. 检查smb.conf中该共享的valid userswrite listforce group等参数。
Samba服务启动慢或客户端响应慢1. DNS反向解析问题。
2. 系统资源(内存、CPU)不足。
3. 日志级别过高,磁盘I/O慢。
1. 确保域控IP(192.168.1.10)能反向解析到自己的FQDN。
2. 使用tophtop监控资源使用情况。对于大型域,考虑增加内存。
3. 在smb.conf[global]部分调整log level = 1(默认是1,如果调高会记录大量调试信息影响性能)。

5.2 性能监控与优化技巧

一个健康的域控需要持续关注其性能表现。

1. 监控工具:

  • smbstatus: 查看当前Samba连接、打开的文件和锁状态。sudo smbstatus -L可以看锁,对排查文件访问冲突很有用。
  • samba-tool dbcheck: 定期检查Samba内部数据库的一致性。
  • 系统工具:top,htop,iotop,nethogs。重点关注samba进程的CPU、内存占用,以及网络I/O。

2. 日志分析:Samba的日志默认在/var/log/samba/目录下。log.smbd记录文件共享相关,log.netlogon记录域登录相关。当出现问题时,提高日志级别(在smb.conf中设置log level = 3),然后复现问题,再分析日志,是定位复杂问题的终极手段。

3. 配置优化建议:

  • Socket Options: 在smb.conf[global]部分,可以添加socket options = TCP_NODELAY IPTOS_LOWDELAY SO_KEEPALIVE SO_RCVBUF=131072 SO_SNDBUF=131072来优化网络性能。
  • 日志轮转: 确保logrotate配置正常,避免日志文件无限增大占满磁盘。
  • 定期更新: 关注Samba安全公告,及时通过包管理器更新到稳定版本。

5.3 安全加固要点

用Linux做域控,安全同样不能松懈。

  1. 最小化网络暴露: 在防火墙(如果开启)上,只开放必要的端口:TCP 53 (DNS), 88 (Kerberos), 135 (RPC), 139/445 (SMB), 389 (LDAP), 464 (Kerberos kpasswd), 3268 (全局编录)等。UDP 53, 88, 123 (NTP), 137/138 (NetBIOS),如果不需要NetBIOS名称解析,可以关闭137/138。
  2. 定期审计: 使用sudo samba-tool user list --locked查看被锁定的账户,使用日志分析工具监控异常登录行为(如大量失败尝试)。
  3. 备份加密: 对备份文件进行加密,并存放在异地或离线介质中。
  4. 系统安全: 定期进行系统安全更新,使用强密码策略(可以通过samba-tool domain passwordsettings set来设置),禁用默认的Guest账户。

部署和维护一个基于Samba的AD域控,是一个将开源软件的灵活性与企业级目录服务需求相结合的过程。它要求你不仅了解Linux系统管理,还要对Windows AD的核心概念(如Kerberos、LDAP、DNS集成)有深入的理解。这个过程充满挑战,但一旦成功,带来的那种对技术栈的完全掌控感和成本节约的成就感,是使用商业软件无法比拟的。最关键的是,所有操作都通过命令行完成,这为自动化运维(如用Ansible批量管理用户)打开了大门,这才是现代运维的精髓所在。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/12 10:49:42

C++模板元编程:编译期计算与高性能代码生成策略

1. 项目概述&#xff1a;当C模板不只是类型容器如果你写过C&#xff0c;肯定用过std::vector<int>或者std::map<std::string, double>。模板&#xff0c;在大多数开发者眼里&#xff0c;就是个“类型容器”&#xff0c;用来写泛型数据结构和算法&#xff0c;避免代…

作者头像 李华
网站建设 2026/8/12 10:48:40

Onekey终极指南:3分钟学会Steam游戏DLC免费解锁的完整方案

Onekey终极指南&#xff1a;3分钟学会Steam游戏DLC免费解锁的完整方案 【免费下载链接】Onekey Onekey Steam Depot Manifest Downloader 项目地址: https://gitcode.com/gh_mirrors/one/Onekey 你是否曾经因为Steam游戏DLC价格过高而犹豫不决&#xff1f;是否因为区域限…

作者头像 李华
网站建设 2026/8/12 10:48:10

Linux磁盘IO性能监控与排查实战指南:从iostat到fio

1. 项目概述&#xff1a;为什么我们需要关注磁盘IO&#xff1f;在Linux服务器运维、性能调优甚至是日常开发排查线上问题的过程中&#xff0c;磁盘IO&#xff08;Input/Output&#xff0c;输入/输出&#xff09;性能往往是那个最容易被忽视&#xff0c;却又在关键时刻“卡脖子”…

作者头像 李华
网站建设 2026/8/12 10:47:48

CompressO:开源免费的视频压缩神器,让存储空间释放95%

CompressO&#xff1a;开源免费的视频压缩神器&#xff0c;让存储空间释放95% 【免费下载链接】compressO Convert any video/image into a tiny size. 100% free & open-source. Available for Mac, Windows & Linux. 项目地址: https://gitcode.com/gh_mirrors/co/…

作者头像 李华
网站建设 2026/8/12 10:47:06

如何快速掌握PulseView:开源逻辑分析仪工具的终极实战指南

如何快速掌握PulseView&#xff1a;开源逻辑分析仪工具的终极实战指南 【免费下载链接】pulseview Read-only mirror of the official repo at git://sigrok.org/pulseview. Pull requests welcome. Please file bugreports at sigrok.org/bugzilla. 项目地址: https://gitco…

作者头像 李华