1. 项目概述:为什么要在Linux上用Samba做域控?
在传统的企业IT架构里,提到“域控”(Domain Controller),大家的第一反应几乎都是微软的Windows Server。Active Directory(AD)几乎成了企业身份认证和集中管理的代名词。但如果你和我一样,长期混迹在开源和混合环境里,就会遇到一个很实际的痛点:成本、灵活性和异构环境的管理。一台正版Windows Server的授权费用不菲,而很多中小团队、实验室环境或者特定场景下的开发测试环境,又确实需要一个集中管理用户、计算机和策略的“域”环境。这时候,把目光投向Linux世界,用开源的Samba来实现一个域控制器,就成了一条非常务实且富有挑战性的技术路径。
简单来说,这个项目就是要在Linux操作系统上,配置和部署Samba服务,使其能够扮演一个完整的、兼容微软AD协议的域控制器角色。这意味着,你不仅可以用它来管理Linux主机,更能让Windows客户端(Windows 10, Windows 11等)无缝地加入这个域,使用域账户登录,应用组策略(虽然功能上有差异),实现统一的身份认证和资源访问管理。这不仅仅是省下一笔授权费用,更深层的价值在于,它让你在一个以Linux为核心的基础设施中,拥有了统一身份管理的“大脑”,实现了Windows与Linux混合环境的有机整合。无论是用于内部开发测试、教育培训,还是作为某些特定应用(如文件共享、内部服务认证)的后台支撑,都极具实用价值。
2. 核心架构与方案选型解析
2.1 Samba AD DC模式 vs. NT4模式
决定用Samba做域控,首先得理解它的两种主要模式:经典的NT4风格域模式和现代的Active Directory域模式。这是整个方案的基石选择。
早期的Samba主要模拟Windows NT 4.0的域控制器,也就是我们常说的“NT4域”或“经典安全模式”。在这种模式下,用户和机器账户信息存储在本地的smbpasswd或tdbsam数据库中。它的优点是配置相对简单,对资源要求低。但缺点非常明显:功能单一,无法使用AD丰富的特性(如组策略对象GPO、多主复制、LDAP目录服务的完整功能等),与现代Windows客户端(尤其是Windows Vista之后)的兼容性会越来越差,经常会遇到各种奇怪的认证和加域问题。
而我们今天要搭建的,是Samba的Active Directory Domain Controller模式。从Samba 4.0版本开始,它引入了一个内置的、自包含的LDAP目录服务、Kerberos密钥分发中心(KDC)和DNS服务器,完全重写了代码,旨在实现与微软AD域控的高度协议兼容。在这个模式下,Samba使用开源的OpenLDAP后端(具体是Samba自己定制和打包的版本)来存储所有AD对象(用户、组、计算机、组织单元OU等),使用Heimdal Kerberos实现安全的票据认证,并可以集成BIND9或使用Samba内置的DNS服务来提供AD必需的SRV记录定位。选择AD DC模式,意味着你获得了一个功能上更接近Windows Server AD的体验,支持Windows 10/11客户端顺利加域,支持更精细的权限管理和部分组策略功能。
注意:虽然Samba AD DC在协议层面实现了高度兼容,但它并非100%等同于Windows AD。一些高级功能,如某些特定的组策略设置、Exchange Server的深度集成、复杂的AD信任关系等,可能无法实现或需要额外配置。它的定位是一个“足够好”的、开源替代方案,尤其适合不需要微软全家桶深度绑定的环境。
2.2 系统与软件版本选择
工欲善其事,必先利其器。版本选择直接决定了项目的成败和后续维护的难易度。
Linux发行版选择:理论上,任何主流的Linux发行版都可以。但基于稳定性和社区支持,我强烈推荐选择Rocky Linux 8/9、AlmaLinux 8/9或Ubuntu Server 20.04 LTS/22.04 LTS。RHEL系(Rocky/Alma)的优势在于企业级的稳定性和长期支持,其软件仓库中的Samba版本可能稍旧但经过充分测试。Ubuntu Server的优势在于软件包较新,文档和社区问答非常丰富。我个人在生产测试环境中更倾向于Rocky Linux,因为它提供了极佳的稳定性和可预测性。避免使用滚动更新的发行版(如Arch Linux),因为域控是一个核心基础设施,需要的是稳定,而非最新。
Samba版本选择:这是关键中的关键。你必须使用Samba 4.x系列,并且强烈建议使用当前稳定版的最新版本。例如,在项目进行时,Samba 4.19.x是稳定版。AD DC模式是Samba 4.x的专属功能,4.0之前的版本根本不支持。你可以通过samba --version命令来查看。Ubuntu的长期支持版仓库中的版本通常足够新,而RHEL系可能需要启用EPEL(Extra Packages for Enterprise Linux)仓库或通过其他方式获取较新版本。
其他依赖:
- 时间同步(NTP):域内所有计算机(包括域控和客户端)的时间必须高度同步,误差通常不能超过5分钟,否则Kerberos认证会失败。你需要确保Linux主机配置并运行了
chronyd或ntpd服务,并指向可靠的NTP服务器。 - DNS服务:AD严重依赖DNS来定位域控制器(通过
_ldap._tcp.dc._msdcs.<域名>等SRV记录)。你可以选择使用Samba AD DC内置的DNS服务器(推荐,最省事),或者与一个外部的BIND9 DNS服务器进行集成。内置DNS是初始配置最简单的方式。 - 主机名与网络:为你的Linux服务器设置一个静态的、完全合格域名(FQDN),例如
dc01.mydomain.local。确保/etc/hosts文件正确解析了这个FQDN和IP地址。网络配置需要是静态IP,DHCP获取的IP在域控上会带来很多麻烦。
3. 详细部署与配置实操
3.1 前期系统准备与环境检查
假设我们在一台全新的Rocky Linux 9服务器上操作,主机名规划为dc01,域名规划为corp.demo(这是一个示例域名,请根据实际情况修改,建议使用.local后缀的私有域名以避免与公网冲突)。
第一步,进行系统更新和主机名设置。
sudo dnf update -y sudo hostnamectl set-hostname dc01.corp.demo编辑/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.demo dc01请将192.168.1.10替换为你服务器的真实静态IP地址。
第二步,配置防火墙。Samba AD DC需要开放一系列端口,最稳妥的方式是在防火墙中允许Samba服务。
sudo firewall-cmd --permanent --add-service=samba sudo firewall-cmd --permanent --add-service=kerberos sudo firewall-cmd --permanent --add-service=ldap sudo firewall-cmd --permanent --add-service=ldaps sudo firewall-cmd --permanent --add-service=dns sudo firewall-cmd --permanent --add-service=ntp sudo firewall-cmd --reload如果你使用iptables,则需要手动开放TCP/UDP的53(DNS)、88(Kerberos)、135(RPC)、139/445(SMB)、389(LDAP)、464(Kerberos密码更改)、3268(全局编录)等端口。
第三步,确保时间同步服务运行。Rocky Linux 9默认使用chronyd。
sudo systemctl enable --now chronyd sudo chronyc sources3.2 安装Samba及相关软件包
在Rocky Linux 9上,Samba 4.x通常已经在默认仓库中。我们安装Samba AD DC所需的全部包。
sudo dnf install samba samba-dc samba-client samba-common-tools krb5-workstation bind bind-dyndb-ldap -y这里我们一并安装了BIND9 DNS服务器及其与LDAP的动态集成模块,为后续使用Samba内置DNS或与BIND集成做准备。
3.3 使用samba-tool创建新AD域
这是最关键的一步,我们将把这台Linux服务器提升为域控制器,并创建一个全新的AD林。
首先,需要停止并禁用可能冲突的Samba旧服务(如果存在):
sudo systemctl disable --now smb nmb winbind然后,使用samba-tool domain provision命令来配置新的域。这个命令是交互式的,但为了可重复性和自动化,我更喜欢使用带参数的非交互方式。以下命令创建了一个名为CORP.DEMO的域,NetBIOS名为CORP,管理员密码设置为MySuperSecretPass123!。
sudo samba-tool domain provision --use-rfc2307 --realm=CORP.DEMO --domain=CORP --server-role=dc --dns-backend=SAMBA_INTERNAL --adminpass='MySuperSecretPass123!' --host-name=dc01 --host-ip=192.168.1.10 --site=Default-First-Site-Name --option="idmap_ldb:use rfc2307 = yes"让我们拆解一下这个命令的关键参数:
--use-rfc2307:极其重要。这个选项让Samba将POSIX属性(如UID/GID)存储在AD中,这对于Linux客户端通过SSH使用域账户登录、或者NFSv4与AD集成至关重要。它创建了idmap.ldb数据库来映射Windows SID和Linux UID/GID。--realm:Kerberos领域名,通常是大写的域名。--domain:NetBIOS域名,通常是大写的短名,不能超过15个字符。--server-role=dc:指定角色为域控制器。--dns-backend=SAMBA_INTERNAL:使用Samba内置的DNS服务器。这是最简单的选择。--adminpass:设置目录服务还原模式(DSRM)和管理员账户的密码。请务必使用强密码。--host-ip:指定本机IP,确保DNS记录正确生成。
命令执行成功后,会在/var/lib/samba/目录下生成所有必要的数据库和配置文件。最重要的配置文件/etc/samba/smb.conf已经被自动生成和配置好了。
3.4 启动Samba AD DC服务并验证
配置完成后,需要启动Samba AD DC服务。在Samba 4 AD DC模式下,传统的smb和nmb服务不再使用,取而代之的是samba服务,它作为一个集成服务来运行所有必要的守护进程(LDAP、KDC、DNS等)。
sudo systemctl disable --now smb nmb winbind sudo systemctl unmask samba sudo systemctl enable --now samba使用systemctl status samba检查服务状态,确保所有组件都运行正常。
接下来,进行一系列验证,确保域控核心功能正常。
1. 验证Kerberos票据颁发:首先,配置本机的/etc/krb5.conf,使其指向我们新建的域控。Samba的provision命令应该已经生成了这个文件。我们可以尝试获取管理员用户的Kerberos票据。
kinit administrator@CORP.DEMO系统会提示输入密码(就是provision时设置的--adminpass)。输入后,使用klist命令查看当前缓存的票据。如果成功,你会看到一张授予administrator的票据。
2. 验证LDAP目录查询:使用ldapsearch命令查询AD目录树,这是检查LDAP服务是否正常工作的好方法。
ldapsearch -H ldap://dc01.corp.demo -x -D "administrator@corp.demo" -W -b "dc=corp,dc=demo"输入管理员密码后,你应该能看到LDAP目录的根目录信息。
3. 验证DNS记录:AD依赖DNS的SRV记录。使用host或dig命令查询关键记录。
dig -t SRV _ldap._tcp.corp.demo @192.168.1.10 dig -t SRV _kerberos._udp.corp.demo @192.168.1.10这些命令应该返回指向dc01.corp.demo的SRV记录。如果使用Samba内置DNS,请确保客户端的DNS服务器已设置为这台域控的IP地址。
3.5 配置Linux主机使用AD进行身份认证
现在域控已经运行,我们可以配置另一台Linux客户端,使其加入域并使用域账户登录。这里以Rocky Linux客户端为例。
首先,在客户端上安装必要的软件:
sudo dnf install realmd oddjob oddjob-mkhomedir sssd samba-common-tools krb5-workstation adcli -y使用realmd工具发现并加入域,这是一个简化流程的工具:
sudo realm discover corp.demo sudo realm join --user=administrator corp.demo系统会提示你输入administrator的密码。realmd会自动配置sssd(System Security Services Daemon)和/etc/krb5.conf。
加入成功后,你可以验证:
sudo realm list输出应显示corp.demo域,并注明client-software: sssd。
现在,你可以使用域账户了。例如,创建一个域用户(在域控上操作):
sudo samba-tool user create zhangsan --given-name=San --surname=Zhang --mail-address=zhangsan@corp.demo sudo samba-tool user setpassword zhangsan然后在客户端上,你可以切换到该用户,sssd会自动创建家目录(因为安装了oddjob-mkhomedir):
su - zhangsan@corp.demo或者,直接使用域账户通过SSH登录客户端(如果SSH配置了PasswordAuthentication yes或配置了Kerberos认证)。
4. Windows客户端加域与基础管理
4.1 Windows客户端加入Samba域
这是检验Samba AD DC兼容性的“试金石”。在一台Windows 10/11计算机上操作。
- 配置DNS:将Windows客户端的首选DNS服务器指向你的Samba域控IP(
192.168.1.10)。这是必须的,否则Windows无法定位域控制器。 - 系统属性:右键点击“此电脑” -> “属性” -> “高级系统设置” -> “计算机名”选项卡 -> 点击“更改”。
- 加入域:在“计算机名/域更改”对话框中,选择“域”,并输入你的域名(
corp.demo),点击“确定”。 - 输入凭据:在弹出的对话框中,输入有权限加域的账户名和密码,通常是
CORP\administrator或administrator@corp.demo,以及对应的密码。 - 重启:根据提示重启计算机。
重启后,你应该可以使用域账户(例如CORP\zhangsan)登录这台Windows计算机。登录成功后,在“此电脑” -> “属性”中,可以看到“域”已显示为corp.demo。
实操心得:Windows客户端加域失败,90%的原因出在DNS上。请务必确保客户端DNS指向域控,并且能正确解析
dc01.corp.demo和相关的SRV记录。可以在Windows命令行用nslookup dc01.corp.demo和nslookup -type=SRV _ldap._tcp.corp.demo来排查。
4.2 使用RSAT进行基础AD管理
虽然我们可以在Linux域控上使用samba-tool和ldb命令进行一切管理,但对于习惯图形界面的管理员,可以在一台加入域的Windows计算机上安装远程服务器管理工具(RSAT)。
- 在Windows 10/11上,通过“设置”->“应用”->“可选功能”->“添加功能”,找到并安装“RSAT:Active Directory 域服务和轻型目录服务工具”。
- 安装后,在开始菜单中找到“Active Directory 用户和计算机”并打开。
- 连接到你的
corp.demo域,你就可以像管理Windows AD一样,在图形界面中创建组织单元(OU)、用户、组、计算机对象了。
需要注意的是,Samba AD DC支持的AD架构是基础版本,并非所有Windows AD的高级功能都能在RSAT中完美显示或操作,但基本的对象管理是完全可行的。
4.3 组策略(GPO)的有限支持
Samba AD DC支持一部分组策略。组策略设置实际上存储在sysvol共享(\\\\corp.demo\\sysvol)的特定目录中。你可以使用Windows上的“组策略管理编辑器”来创建和编辑GPO,并将其链接到OU。
但是,Samba本身并不解释或应用这些GPO设置。当Windows客户端处理GPO时,它会从sysvol下载策略文件,并由Windows本地的组策略客户端引擎(gpsvc)来应用这些针对Windows的设置。这意味着,你只能管理那些由Windows客户端理解的策略。Samba域控在这里主要扮演一个策略文件的存储和分发角色。
对于Linux客户端,有像sssd、pam和polkit这样的机制来实现策略,但它们与Windows GPO不是一回事,需要单独配置。
5. 高级配置、维护与故障排查
5.1 配置Samba内置DNS管理
如果你在provision时使用了--dns-backend=SAMBA_INTERNAL,那么DNS管理可以通过samba-tool命令或Windows DNS管理控制台(需安装RSAT的DNS工具)进行。
使用samba-tool管理DNS记录:
# 添加A记录 sudo samba-tool dns add dc01.corp.demo corp.demo webserver A 192.168.1.20 # 添加CNAME记录 sudo samba-tool dns add dc01.corp.demo corp.demo www CNAME webserver.corp.demo # 查看记录 sudo samba-tool dns query dc01.corp.demo corp.demo @ ALL从Windows DNS管理器连接:在安装了RSAT DNS工具的Windows上,打开“DNS管理器”,右键“DNS”->“连接到DNS服务器”,输入dc01.corp.demo,即可进行图形化管理。
5.2 备份与恢复
域控制器的备份至关重要。Samba AD DC的备份主要涉及两个部分:配置文件和数据库。
配置文件备份:主要是
/etc/samba/smb.conf和/etc/krb5.conf。直接复制即可。数据库备份:使用
samba-tool domain backup命令。这是一个在线热备份命令。sudo samba-tool domain backup offline --targetdir=/opt/samba_backup这个命令会创建一个包含所有AD数据库(
sam.ldb,secrets.ldb等)的压缩归档文件。定期执行此命令并妥善保管备份文件。恢复:恢复需要在类似的新系统上,安装相同版本的Samba软件包,然后使用
samba-tool domain restore命令,并指定备份文件。这个过程比较复杂,需要严格遵循官方文档,并确保主机名、IP等信息与备份时一致。
5.3 常见问题与排查技巧实录
在实际部署和运维中,你会遇到各种各样的问题。这里记录几个最典型的场景和排查思路。
问题1:Windows客户端无法加入域,提示“找不到网络路径”或“域控制器不可用”。
- 排查思路:
- 防火墙:这是首要怀疑对象。在域控上使用
sudo firewall-cmd --list-all确认所有Samba相关服务端口都已开放。临时关闭防火墙测试(sudo systemctl stop firewalld)是快速定位问题的方法,但之后一定要配置好规则再开启。 - DNS:在Windows客户端上,
nslookup dc01.corp.demo必须能解析到正确的IP。nslookup -type=SRV _ldap._tcp.corp.demo必须能返回域控的SRV记录。如果失败,检查客户端DNS设置,并登录域控检查Samba DNS服务状态(sudo systemctl status samba)和日志(sudo tail -f /var/log/samba/log.samba)。 - 时间同步:确保客户端和服务器时间差在5分钟以内。Kerberos对时间极其敏感。
- 防火墙:这是首要怀疑对象。在域控上使用
问题2:Linux客户端使用realm join失败,报错“Permission denied”或“KDC reply did not match expectations”。
- 排查思路:
- 凭证问题:确保使用的用户名密码正确,并且账户有加域权限(默认
Domain Admins和Domain Computers组有权限)。 - Kerberos配置:检查客户端
/etc/krb5.conf文件,确保[realms]和[domain_realm]部分正确指向了域控。可以手动尝试kinit administrator@CORP.DEMO看能否获取票据。 - 主机名解析:确保客户端能通过DNS或
/etc/hosts正确解析域控的FQDN。
- 凭证问题:确保使用的用户名密码正确,并且账户有加域权限(默认
问题3:域用户登录Linux客户端时,家目录无法自动创建。
- 排查思路:
- 确保客户端安装了
oddjob-mkhomedir包。 - 检查
/etc/sssd/sssd.conf文件,确保[domain/corp.demo]段落下设置了fallback_homedir = /home/%u,并且pam服务配置正确。通常realm join会自动配置,但有时需要手动检查/etc/pam.d/system-auth和/etc/pam.d/password-auth文件,确保包含了pam_sss.so的配置。 - 查看
/var/log/secure日志,获取更详细的认证和家目录创建错误信息。
- 确保客户端安装了
问题4:Samba服务启动失败,日志中出现“Failed to set up CLDAP server”或“LDAP server initialization failed”。
- 排查思路:
- 端口占用:使用
sudo ss -tlnp | grep :389或sudo ss -tlnp | grep :53检查389(LDAP)或53(DNS)端口是否被其他进程(如systemd-resolved,named)占用。需要停止并禁用这些冲突服务。 - 数据库文件权限:确保
/var/lib/samba/private和/var/lib/samba/sysvol等目录的权限属于samba用户和组。可以尝试运行sudo samba-tool ntacl sysvolreset来重置sysvol的ACL。 - 配置文件错误:检查
/etc/samba/smb.conf是否有语法错误,可以用testparm命令测试。
- 端口占用:使用
部署和维护一个基于Samba的AD域控,是对你Linux系统管理、网络服务和故障排查能力的综合锻炼。它不是一个“一键部署”的简单服务,但一旦稳定运行,它将为你的混合IT环境提供一个强大、免费且可控的统一身份管理核心。记住,耐心和细致的日志分析是你最好的朋友。每次遇到问题,/var/log/samba/目录下的日志文件(如log.samba,log.ldb)是第一个应该查看的地方。