
1. 选型先决Samba 4.x 和系统发行版的搭配思路1.1 为什么4.x才是建域的入场券很多刚开始接触Samba的朋友容易把Samba能做文件共享和Samba能建域混为一谈。实际这两件事的能力分界非常清晰Samba 3.x时代的域是NT4风格的旧域功能少得可怜和现代AD环境对接几乎没法用真正完整实现AD DC角色是从Samba 4.0开始的。4.x版本把LDAP目录服务、Kerberos认证、DNS解析、SMB文件服务这些域控必需的组件都集成到了自己进程里你只要一条samba-tool domain provision命令就能初始化出一个逻辑上等同Windows Server域控制器的环境Windows客户端可以正常加域、统一登录、下发组策略。所以在动手安装之前先给自己立一条硬性检查目标系统仓库里的Samba必须是4.x。判断方法很简单装完后跑samba --version或者smbd --version输出里只要版本号落在4.x就说明选型没有问题。3.x无论怎么配都走不到现代AD域控这个能力范围里。如果你手头的发行版软件源还停留在3.x我的建议是优先换个系统版本或者换源而不是继续在这个老版本上折腾建域。从另一个角度看Samba 4.x从2012年发布至今已经迭代了十几年版本成熟度相当高。主流Linux发行版默认仓库里的Samba虽然不是最新发布的小版本但用于稳定的内部域控完全够用。建域这件事内核逻辑这些年变化并不大真正考验人的是后面的周边环境配置而不是非要去追某个刚发布几周的新版本。1.2 发行版选择影响安装姿势Samba的安装动作实际上是被你的Linux发行版决定的。不同发行版有各自的包管理器和打包习惯命令不一样服务名不一样甚至连包的拆分方式都不一样。服务器领域最常见的是两大阵营RHEL及其衍生发行版比如Rocky Linux、AlmaLinux、CentOS Stream用dnf或yum安装核心包名是samba、samba-client、samba-common服务名是smb和nmb。Debian和Ubuntu系列用apt安装核心包名是samba、smbclient、winbind服务名是smbd和nmbd。除了这两大阵营如果你用的是SUSE系会走zypper包名类似RHEL系如果是Arch系则是pacman -S samba。思路都一样把Samba主程序和客户端管理工具两部分的包都装上再确认服务能启动即可。安装前我还建议先看一眼软件源里的版本避免装完才发现版本不满足需求。RHEL系可以用dnf info samba关注输出里的Version字段Debian系用apt-cache policy samba关注Candidate字段。这一步花不了十秒钟但能提前排除掉版本硬伤。1.3 包管理器与源码编译的整体取舍我见过不少人在安装阶段纠结一个问题要不要下载源码自己编译拿一个最新版Samba坦诚说除非你有极其特殊的定制需求否则在为了建域而安装Samba这个场景下我强烈建议老老实实走系统包管理器。理由可以看下面这个对比对比维度系统包管理器安装源码编译安装依赖处理自动安装并校验版本手动解决容易遇到版本互斥升级维护系统更新一条命令搞定需要重新configure、make、install安全补丁跟随发行版安全源及时获得自行跟踪Samba社区版本稳定性经过发行版打包验证与系统组件兼容取决于编译环境和参数适合场景绝大多数生产/测试环境需要新特性、深度定制Samba 4自身依赖的底层库不少比如libtalloc、libtevent、libldb、libkrb5这些都是和内核、glibc、python版本紧密挂钩的。系统包管理器会把这些依赖关系自动匹配好你装完拿到的就是一个能直接跑的二进制。源码编译这些库运气好半小时运气差能在依赖瀑布里绕一整个下午最后还是得回到系统包上来。真到了仓库版本老得没法用那一步换一个更新的发行版版本往往比重编译Samba划算得多。2. 包管理器安装实操RHEL系与Debian系的完整命令2.1 RHEL系更新源并安装samba全家桶在RHEL及其衍生发行版上安装命令非常直接。先更新软件源缓存然后一次性把需要的包都装上sudo dnf update -y sudo dnf install -y samba samba-client samba-common这里每个包都有明确分工samba核心服务端提供smbd、nmbd以及域控所需的samba进程。samba-client提供smbclient等客户端工具也包含samba-tool等管理命令所需的依赖。samba-common提供公共配置文件和文档装系统默认smb.conf模板时少不了它。如果你后续加入域后需要把Windows AD里的域用户映射成Linux本地用户可以顺手把winbind也装上sudo dnf install -y winbindwinbind不是建域的必需项但它在域用户登录Linux主机这个场景里迟早会用到。与其后面再补装依赖不如现在一次装齐。装完后建议用smbd --version确认二进制版本再用rpm -qa | grep samba看看到底装上了哪些包心里有个底。有一点要注意如果dnf install提示找不到匹配的包先检查一下软件源仓库是否可用执行sudo dnf repolist确认AppStream等必要的仓库处于启用状态。RHEL系衍生版经常因为仓库未启用而装不上Samba这属于最基础但也最容易忽略的坑。2.2 Debian/Ubuntu系apt安装与包名差异Debian和Ubuntu系的包拆分方式和RHEL系不同命令也不一样sudo apt update sudo apt install -y samba smbclient sudo apt install -y winbind在Debian系发行版里samba包本身就包含了核心服务端smbd、nmbd而smbclient提供客户端工具。你可能会发现一个细节RHEL系里的samba-client包在Debian系被拆得更细smbclient、samba-tool、testparm可能分布在smbclient和samba-common-bin这两个包里。最典型的例子是Ubuntu装了samba之后系统里未必有samba-tool这个命令。这是新手建域时最常遇到的装了但找不到命令的尴尬。解决办法很简单sudo apt install -y samba-common-bin装完后用which samba-tool验证一下。另外如果你习惯用apt-cache policy samba查看候选版本也会发现Debian系仓库里的Samba版本通常比RHEL系新一些这跟两个发行版的发布节奏有关不影响实际使用。服务管理命令也和RHEL系不一样在Debian系里要操作smbd和nmbd两个服务systemctl enable --now smbd nmbd systemctl status smbd nmbd --no-pager我见过不少从RHEL系切到Debian系的运维习惯性敲systemctl status smb结果提示服务不存在然后一脸懵。服务名记牢了能省不少排查时间。2.3 源码编译安装什么情况才值得走这条路源码编译Samba并不是完全不能考虑只是门槛比大多数人想象的高。它的适用场景基本只有两个一是发行版仓库里的Samba旧到完全无法满足功能需求二是你确实需要编译进一些定制参数。如果你只是想装个最新版玩玩我建议直接放弃这个念头。真要走源码编译典型流程大概是wget https://download.samba.org/pub/samba/stable/samba-4.19.0.tar.gz tar xf samba-4.19.0.tar.gz cd samba-4.19.0 ./configure --prefix/usr/local/samba make -j$(nproc) sudo make install看着简单实际在这一步之前你得先把gcc、make、python3开发头文件、libarchive、libpam、libldap等一堆编译依赖装好。编译过程中还可能遇到configure脚本检查失败需要你反复增加--bundled-libraries参数让Samba把某些第三方库捆绑编译进去。即便编译成功后续systemd服务文件、库路径、环境变量、以及升级时的重新编译都是额外工作量。我的看法是建域这个目标本身已经够复杂了不要在安装阶段给自己加戏。系统的Samba包稳定性经过发行版验证升级维护走系统更新通道这才是最省心的路径。3. 装完别急着配域验证安装的五个检查点3.1 版本必须落在4.x装完Samba后第一件事不是急着改配置而是确认版本。执行samba --version smbd --version两个命令只要输出来一个就行它们的输出格式一般是Samba version 4.x.x。看到4开头说明版本满足建域条件。如果出现3.x说明软件源有问题或者装错了包这时候先不要继续配置赶紧回头处理版本问题。还有一个容易忽略的隐性情况系统里可能残留了以前手工编译的旧Samba导致which samba指向了/usr/local/samba/bin/下的旧二进制而不是系统包管理器的/usr/sbin/samba。检查一下命令路径确保你操作的确实是刚装好的这个版本。路径不对的情况下后续任何调试都可能在错误的对象上浪费时间。3.2 核心工具链samba-tool、smbclient、testparm一个不能少建域不像配个共享目录那么简单你要用到一系列管理工具。安装后我把这几个命令逐一验证一遍which samba-tool smbclient testparm nmblookup每个工具的作用都很明确samba-tool域控初始化和日常管理的核心命令后续的domain provision、user add、domain info全靠它。smbclient连接和测试SMB共享既能看共享列表也能传文件。testparm验证smb.conf配置文件语法每次改完配置跑一遍能快速发现低级错误。nmblookupNetBIOS名称解析排障工具遇到Windows端解析不到主机时特别有用。如果which samba-tool没有任何输出那说明工具包没装全。RHEL系去补samba-common-toolsDebian系去补samba-common-bin。这一步补包成本极低但如果现在不补等后面初始化域控时才发现缺命令那就要中断流程回头装了。3.3 服务能启动SMB端口能监听安装Samba后的默认配置是可以直接拉起服务的。按你的系统服务名操作RHEL系systemctl enable --now smb nmb systemctl status smb nmb --no-pagerDebian系systemctl enable --now smbd nmbd systemctl status smbd nmbd --no-pager确认服务处于active (running)状态后再看端口监听情况ss -lntup | grep -E :(139|445)\b正常情况下TCP 139和TCP 445端口应该在监听中分别对应旧的NetBIOS SMB会话和现代SMB直接会话。如果端口没起来优先回头看服务状态。服务显示failed或者activating时用journalctl拉日志journalctl -u smb -u nmb --no-pager | tail -n 50大部分启动失败的根因是配置文件语法错误或者端口被占用。这一步把基础服务状态稳定住后面的域控初始化才有讨论的前提。3.4 默认配置能被testparm解析新装好的Samba/etc/samba/smb.conf是系统给的默认模板里面大量注释和示例配置。模板正确性通常没问题但为了形成检查习惯我每次都跑一遍testparm -s /etc/samba/smb.conf只要输出里有Loaded services file OK.就说明配置能够被Samba正常解析。后面的输出是Samba整理后的有效配置项集合里面会有workgroup WORKGROUP之类的默认值这些在建域时都会被覆盖重写不用管它。这里要特别说明testparm通过只代表配置文件语法没问题不等于Samba已经处于你想要的域控工作模式。真正生成域控配置要等后续用samba-tool domain provision操作它会重新生成一份适合域控的smb.conf。现在留一份默认模板到时候还能和生成的配置做对比方便理解Samba初始化时到底改动了什么。3.5 本机匿名连接自测配置验证的最后一步就是从Samba自己的视角测试一下SMB服务是否真的可用smbclient -L localhost -N-L是列出共享-N表示不询问密码。执行后你会看到两种结果一是列出了IPC$等共享二是提示匿名访问被拒绝。两种都说明SMB服务本身工作正常区别只是默认配置不允许匿名枚举而已。如果看到的是Connection refused或者Connection failed那就需要把问题隔离出来是服务没起来、端口没监听、还是防火墙挡住了。在RHEL系上有个常见的测试陷阱firewalld默认不会放行Samba导致本机自测直接失败。这种情况可以先临时停一下防火墙做连通性测试systemctl stop firewalld smbclient -L localhost -N确认Samba服务本身没问题后再把防火墙拉起来systemctl start firewalld这叫隔离验证能明确告诉你问题是出在服务还是出在网络层。具体怎么放行Samba端口下一章会说到。4. 建域前的周边配置时间、主机名、端口、SELinux一次理清4.1 主机名必须是完整的FQDN为什么单独把主机名拎出来说因为域控制器强烈依赖一个稳定、完整的域名标识。samba-tool domain provision初始化域控时默认会用当前系统主机名推导Kerberos realm、DNS域名、SPN等一堆关键标识。如果主机名是localhost或者只有一个短名dc1生成的域控标识会非常别扭轻则初始化报错重则域控跑起来后客户端加域各种异常。所以我建议在安装阶段就把主机名设置成完整的FQDN形式hostnamectl set-hostname dc1.example.internal后缀的规划也有讲究。尽量避免使用.local后缀因为它和mDNS机制存在冲突Windows客户端做AD域解析时容易出问题。比较稳妥的做法是规划一个明确的内网专用域名比如example.internal、corp.example这类既不会和公网域名冲突、又不会触发mDNS问题的命名空间。还要提醒一句很多系统里如果有DHCP客户端或者其他网络管理工具可能在重启后覆盖主机名。改了主机名之后最好再确认一次hostnamectl status确保Static hostname是你设置的FQDN。如果被改回去了需要在网络管理器里同步调整这个坑虽然小但会影响后续所有域控初始化流程。4.2 hosts与本地解析要干净主机名设置之后紧接着就要保证本机解析不出问题。Samba 4的域控进程尤其是KDC和LDAP启动时会依赖本机名解析。我最常推荐的/etc/hosts配置是这样的192.168.10.20 dc1.example.internal dc1 127.0.0.1 localhost localhost.localdomain ::1 localhost ip6-localhost ip6-loopback注意两点静态IP和FQDN的映射要放在前面而且不要用127.0.0.1去映射DC的FQDN。如果DC把自己解析成loopback地址Kerberos初始化时会各种奇奇怪怪的失败客户端更是怎么连都连不上。这个坑我见过太多次了。配置后用下面两条命令验证解析结果getent hosts dc1.example.internal hostname -fhostname -f输出应该是一个带点后缀的完整域名而不是孤零零的dc1。如果当时shell里还是旧主机名重新登录一下或者source /etc/profile刷新环境变量。确保这一步干净了域控初始化才能拿到正确的身份信息。4.3 时间同步是Kerberos认证的硬条件域环境里所有身份认证都走Kerberos协议Kerberos对时间偏差极度敏感。默认允许的时钟偏移大约是5分钟超过这个范围客户端加域或者登录时会直接报时钟偏移相关错误而且错误信息经常让人误以为是网络问题排查方向完全跑偏。所以安装阶段就应当把时间同步配好。RHEL系通常用chronysystemctl enable --now chronyd chronyc sources -vDebian系可能默认走systemd-timesyncd也可以用chronysystemctl enable --now systemd-timesyncd timedatectl statusNTP服务器可以指向内网已有的时间源也可以指向公共NTP源。关键是让系统时间保持在稳定、准确的状态。域控服务器一旦和域内客户端时间差异过大所有依赖Kerberos的操作都会受影响。这个问题在安装阶段花两分钟解决就能避免后面调试时多绕一大圈。4.4 提前规划防火墙放行的端口很多人在建域配置完成、客户端加域失败时才想起来去看防火墙其实完全可以在安装阶段就把端口规划好。Samba变成域控制器之后它不只是提供SMB文件服务还要响应DNS查询、Kerberos票据请求、LDAP目录查询等。这些服务各自占用特定端口服务/协议端口说明DNS53 TCP/UDPAD域控内置DNS解析Kerberos88 TCP/UDP域身份认证核心协议LDAP389 TCP/UDPAD目录服务查询SMB/CIFS139 TCP、445 TCP文件共享与组策略下发NetBIOS名称服务137/138 UDPnmbd名称解析如果你使用firewalld先放行Samba服务再把域控相关端口一次性加上firewall-cmd --permanent --add-servicesamba firewall-cmd --permanent --add-port53/tcp --add-port53/udp firewall-cmd --permanent --add-port88/tcp --add-port88/udp firewall-cmd --permanent --add-port389/tcp --add-port389/udp firewall-cmd --reload如果你用UFWDebian系常见思路相同ufw allow 53/tcp ufw allow 53/udp ufw allow 88/tcp ufw allow 88/udp ufw allow 389/tcp ufw allow 389/udp ufw allow 139/tcp ufw allow 445/tcp ufw allow 137/udp ufw allow 138/udpfirewalld里那个samba服务定义通常只覆盖137/138/139/445不会自动包含DNS、Kerberos、LDAP端口所以需要显式添加。建域初始化完成前这些端口不一定都用得上但提前放行能避免配置完成后反复改动防火墙。4.5 SELinux与AppArmor的处理思路RHEL系默认开启SELinuxSamba服务在这套强制访问控制下是受限的。很多教程图省事直接教人setenforce 0关掉SELinux我不太推荐这个做法因为关了之后你根本不知道下一次被拦截的是什么。更好的思路是让日志告诉你被什么阻挡然后精准放行。先确认当前模式getenforce如果输出是Enforcing启动Samba服务后一旦出现文件共享无法访问、域控进程异常等情况用审计日志定位ausearch -m avc -ts recent | grep samba根据日志提示再决定放行哪一个SELinux布尔开关。常见的建域场景可能会用到samba_export_all_rw、samba_domain_controller等具体哪些需要打开以日志文本为准。例如setsebool -P samba_export_all_rw on如果Samba需要共享某个自定义目录而该目录的SELinux标签不对用标准的fcontext方式打标签semanage fcontext -a -t samba_share_t /data/samba(/.*)? restorecon -Rv /data/sambaDebian系通常默认使用AppArmor而不是SELinux。Samba在AppArmor下一般不需要特殊处理默认配置文件就能跑。如果确实遇到过Samba相关日志被AppArmor拦截的情况再去查看aa-status或者/var/log/syslog里的拒绝记录针对性放行。4.6 备份默认配置熟悉未来数据目录安装完成、各项检查通过之后还有一个小动作建议养成习惯把初始的smb.conf备份一份。因为后续samba-tool domain provision会重新生成配置文件留着这份默认模板既能做前后对照又能在万一配置出错时快速回退到初始状态cp -a /etc/samba/smb.conf /etc/samba/smb.conf.default-$(date %F)顺便花一点时间熟悉Samba未来的数据目录/var/lib/samba/sysvol域控的共享目录存放组策略和登录脚本是全域复制的重要数据。/var/lib/samba/private域控密钥、Kerberos数据库等敏感信息默认权限700不要手动放宽。/var/log/sambaSamba运行日志目录后续排查问题时这里是第一站。安装阶段多知道一个目录结构后面调试域控时就能少翻一次文档。尤其是private目录如果哪天发现权限被人改成了755那基本等于把域控内部的密钥文件暴露在风险里这种低级失误要尽量避免。照着上面的流程走完一台可以开始建域的Linux服务器就绪了。坦白说我见过最多的返工场景并不是Samba本身装不上而是安装阶段贪快漏了包、或者完全没管主机名和防火墙等真正初始化域控时被连环报错卡住。版本、完整工具链、端口、时钟、主机名这五项在安装阶段处理好后面会顺畅很多。下一篇进入samba-tool domain provision的实操到时候你会感谢现在多花十分钟做检查的自己。