Samba AD域控安装全解析:组件、命令与验证
发布时间:2026/10/16 8:59:36 锦皓数字建站

上一篇文章把建域的整体规划和域名、主机规划聊完了这篇就是系列里偏实操的第一步把 Samba 装到系统里。很多朋友第一次碰“Linux 建域”这个概念总觉得要自己编译内核、手写配置其实完全不用。现代主流发行版直接通过包管理器就能装好一套能跑 AD 域控的 Samba关键是把该装的组件装全、把环境前置条件理清楚。这篇文章我会把“安装 Samba”这件事拆开讲透装哪些包、为什么需要这些包、不同发行版的安装命令、装完怎么验证以及安装阶段最容易踩的坑。不管你是准备用一台闲置服务器把公司内网的账号统一管起来还是单纯想练手搭一套 Windows 和 Linux 都能登录的域环境这篇文章都可以直接照着做。1. 安装前的整体规划与准备把安装命令敲下去之前我建议你先花半个小时把环境检查一遍。Samba 建域对系统环境的要求不算苛刻但有几个前置条件一旦不满足后面初始化域控的时候会卡得怀疑人生。我见过最典型的例子有人跳过时间同步直接装 Samba结果后面 Kerberos 认证永远报错查了两天才发现是系统时间偏了 10 分钟。1.1 先确认系统版本和仓库里的 Samba 版本不同发行版仓库里的 Samba 版本差异很大。Debian 12 和 Ubuntu 22.04/24.04 的仓库里 Samba 版本通常在 4.15 到 4.19 之间RHEL/Rocky/Alma 系则要看具体的系统小版本。这里要先建立一个认知Samba 从 4.0 开始才内置了 AD 域控功能版本越新对 AD 域控的兼容性和稳定性越好。如果你手头的发行版实在太老比如还在用 Samba 3.x那不建议直接在这上面做新域控。我一般建议至少选择 Samba 4.15 以上的版本。原因倒不是低版本完全不能用而是 4.15 之后对 AD 域控默认配置的生成、DNS 集成、Kerberos 支持都成熟了很多网上能查到的坑也基本都被填平了。检查仓库版本的方法很简单# Debian/Ubuntu 系 apt info samba 2/dev/null | grep -E ^Version # RHEL/Rocky 系 dnf info samba 2/dev/null | grep -E ^Version如果版本太低优先考虑升级整个系统到较新的发行版稳定版而不是只升级 Samba 包。因为 Samba 域控对依赖库版本很敏感单独升级 Samba 版本容易把系统里其他组件的依赖关系搅乱。1.2 固定主机名与 IP 地址域控的地址必须稳定这一点没什么好商量的。安装阶段就要把主机名和 IP 定下来因为 Samba 初始化域控的时候会把主机名写进 AD 数据库初始化完再改主机名会非常麻烦。主机名建议用全小写字母加短横线的形式比如dc01或srv-ad01尽量不要用DC01.test.com这种带点的主机名也不要夹杂下划线。这里的逻辑是Samba 在初始化域控时会自动用“主机名 DNS 域后缀”拼出完整的机器 FQDN如果主机名本身带了点解析逻辑会混乱。另外/etc/hosts 文件里要确保有一行把固定 IP 和完整 FQDN 对应起来例如10.10.10.10 dc01.example.lab dc011.3 时间同步是建域的前置条件Kerberos 认证协议对客户端和服务器之间的时间偏差极度敏感默认允许的最大偏移量是 5 分钟超过这个值就会直接拒绝认证。AD 域里时间偏差过大的机器甚至无法加入域。所以装 Samba 之前先确认系统安装了 chrony 或者 ntp并设置好时间服务器。这个步骤很多人觉得“无所谓”但实际上它决定了你后面/etc/krb5.conf配得再好、samba-tool domain provision执行得再顺利最终客户端加入域的时候能不能通过认证。我的习惯是装完系统第一件事就配好 chrony强制同步一次然后再开始装 Samba# Debian/Ubuntu apt install -y chrony systemctl enable --now chrony chronyc makestep # 确认时间已同步 timedatectl如果这一步没做后面出现“KDC has no support for encryption type”或者“Clock skew too great”这类报错再倒回来排查就很浪费时间。先把地基打牢后面会省很多事。2. 核心组件拆解一个 Samba 域控到底要装哪些东西很多新手在这里容易迷糊我明明装的是“Samba”为什么还要装 Kerberos 客户端为什么还要配 DNS这是因为 Samba 的 AD 域控本质上是用开源组件重新实现了 Windows AD 域控制器的一组服务它需要把 LDAP、Kerberos、DNS、SMB/CIFS 文件共享等多套协议组合在一起工作。装包的时候不能只装一个samba而是要把它周边的配套服务一并拉起来。2.1 samba、samba-client、samba-common 各自管什么以 Debian/Ubuntu 为例最基础的三个包是samba核心服务包包含 smbd文件共享服务进程、nmbdNetBIOS 名称服务进程以及 Samba 4.x 里作为 AD 域控主体的samba进程。samba-client客户端工具集合包含smbclient、rpcclient等命令行工具用来验证 SMB 连接和远程管理。samba-common公共文件与配置工具包含testparm、pdbedit、net等命令以及共享库。这三个包是所有 Samba 场景的基础。但在建域控的场景里光有它们还不够。2.2 域控模式下的关键组件Samba 4.x 的 AD 域控由一体化进程samba掌控它不再像传统文件共享模式那样只靠 smbd/nmbd 干活而是内部集成了四个关键服务角色服务角色实现协议对应端口Kerberos KDCKerberos 5 认证TCP/UDP 88LDAP 服务轻量目录访问协议TCP/UDP 389, 636DNS 服务DNS 域名解析内置或外部 BindTCP/UDP 53SMB/CIFS 文件共享文件和打印机共享TCP 445, 139这就解释了为什么在安装阶段要一并搞定 Kerberos 客户端库、DNS 相关组件。在 Debian/Ubuntu 上我习惯一次性安装下面这组包apt install -y samba smbclient samba-client samba-common \ attr acl winbind libpam-winbind libnss-winbind \ krb5-user bind9 bind9utils dnsutils这里逐个说说为什么需要它们winbind、libpam-winbind、libnss-winbind用来让 Linux 系统通过域账号认证登录虽然正式加入域之后才需要但安装阶段一起装掉可以避免后续反复补包的麻烦。attr、aclAD 域控需要处理大量的扩展属性和 POSIX ACLSamba 在初始化 SYSVOL 共享时需要这些工具来维护高级权限标记。krb5-user提供kinit、klist等 Kerberos 客户端工具用来测试域控的 Kerberos 认证是否正常。bind9在 Debian/Ubuntu 上Samba 域控默认可以自动生成一份面向 AD 的 DNS 配置也可以选择让 Samba 自带内置 DNS。装 Bind9 是为了保留“用外部 DNS 托管 AD 区域”这个选项避免后面想切换的时候发现系统里根本没有 DNS 服务。装完这组包之后你在/etc/samba目录下会看到smb.conf初始模板但这还只是一个普通的文件共享配置模板远不是域控配置。真正的域控配置要在执行samba-tool domain provision之后才会生成这是下一篇系列文章要聊的内容。2.3 RHEL 系的包管理差异如果你用的是 Rocky Linux 或者 AlmaLinux安装逻辑稍微有点区别。在 RHEL 8/9 系里Samba 的一体化域控支持在不同版本里有所调整部分官方源的samba-dc包已经不再提供。所以在 RHEL 系上跑 Samba AD 域控最好先确认仓库里有没有可用的域控支持包dnf install -y samba samba-client samba-common \ krb5-workstation bind bind-utils \ python3 python3-libs # 查看是否存在域控支持包 dnf list --all | grep samba-dc如果samba-dc包不存在通常有两个选择第一改用 Debian/Ubuntu 来跑域控第二使用 Samba 内置 DNS 的模式不依赖外部 Bind。国内很多老教程还在用 CentOS 7 samba4 的套路但到了 RHEL 9 时代这个路线已经没那么顺畅了。我个人的经验是如果纯粹是为了跑 AD 域控Debian/Ubuntu 对 Samba 的支持更省心官方文档和社区示例也都以 Debian 系为第一参考对象。3. 分发行版安装实操从命令到出结果明确了要装哪些包之后下面进入实战环节。我分 Debian/Ubuntu 和 RHEL/Rocky 两条线来写命令直接复制就能用。3.1 Debian/Ubuntu 系安装步骤第一步先更新软件包索引避免源缓存里是旧版本apt update apt install -y samba smbclient samba-client samba-common \ attr acl winbind libpam-winbind libnss-winbind \ krb5-user bind9 bind9utils dnsutils安装过程中Debian 系会弹出 Kerberos 配置交互界面问你默认 Realm 和 KDC 服务器地址。这里有个小技巧先随便填或者直接留空跳过不用太在意因为安装完我们还要针对 Samba 域控重新生成 krb5.conf。如果在这里填错了也没关系后面用模板覆盖就行。装完之后检查一下版本smbd --version输出类似Version 4.19.3-Debian看到 4.x 就放心了。然后确认服务状态systemctl status smbd nmbd在 Debian/Ubuntu 上传统文件共享服务默认会自动启动。但我要强调一点如果这台机器将来要作为域控samba一体化进程会成为唯一的主进程smbd 和 nmbd 甚至建议直接禁用避免端口冲突。不过在“安装”这个阶段它们起来也无妨只要不急着初始化域控不影响我们验证安装结果。3.2 RHEL/Rocky 系安装步骤Rocky Linux 9 上启用仓库后直接安装dnf update -y dnf install -y samba samba-client samba-common \ krb5-workstation bind bind-utils \ attr acl python3 \ vim-enhancedRHEL 系默认不启动任何 Samba 服务需要手动启用systemctl enable --now smb nmb不过这里同样要注意将来做域控的时候samba进程才是主角RHEL 系上 smb 和 nmb 也不参与域控逻辑。验证安装时执行smbd --version testparm --version如果都能正常输出版本号说明核心组件已经就位。3.3 什么时候才需要编译安装有人会问为什么不直接源码编译 latest Samba这里必须泼一盆冷水。Samba 4.x 的 AD 域控功能依赖python3-dns、gssapi、ldb等一堆底层库源码编译时如果某个依赖版本匹配不上configure阶段就会失败。而且编译安装完之后你在系统目录结构里的配置文件路径会跟发行版默认差异很大以后排查问题、升级维护都更费劲。所以我的结论很明确除非你有特殊需求否则一律用发行版仓库里的包。编译安装主要适合那些需要自定义 Samba 特性集、或者目标系统仓库版本过于陈旧的场景。这类场景少之又少而且需要你先具备完整的 C 编译链和 Python 开发库的排错能力新手不建议碰。3.4 安装完成后的目录结构与配置文件说明安装完成之后有几个关键路径你需要心里有数路径作用/etc/samba/smb.confSamba 主配置默认是通用模板/etc/samba/域控初始化后还会生成private/子目录存放密钥数据库/var/lib/samba/Samba 状态数据AD 数据库sam.ldb最终会在这里/var/lib/samba/sysvol/域控制器共享卷目录存放组策略文件/etc/krb5.confKerberos 主配置域控初始化时会被 Samba 自动生成注意现在这些目录大多还是空的或者只有样板文件真正的内容要等执行samba-tool domain provision后才会生成。安装阶段的成果标准是命令可执行、服务能启动、库文件齐全。4. 安装后的初步验证与配置前检查别急着去编辑什么配置文件我先带你把安装结果系统地验证一遍。这个环节能在几分钟内暴露 80% 的环境问题而且比等初始化失败后再返工要快得多。4.1 验证 Samba 相关命令可用逐个执行下面这些命令看它们是否在 PATH 里且能正常输出which smbd nmbd samba smbclient testparm net smbd --version samba --version smbclient --versionsamba-tool 也是最重要的管理命令之一检查它是否存在samba-tool --help | head -30如果你正常能看到帮助信息说明 Python 模块加载没有问题。这一步卡住的人非常多最常见的原因是在装 Samba 之前没有装好python3-dns或者python3-gpg导致 samba-tool 启动时直接报模块找不到。4.2 检查系统服务端口监听情况安装完成后可以确认一下 Samba 相关的端口是否在监听。这里要特别提醒在还没初始化域控之前传统的 smbd/nmbd 会监听 445/139 端口但 Kerberos 的 88 端口不会监听DNS 的 53 端口也不会监听。如果这时候你用netstat看不到 88 端口这完全正常。你可以检查一下当前实际监听情况ss -tlnp | grep -E 445|139看到 445 在 LISTEN 即可说明 smbd 起来了。如果你在 Debian 系装好了 bind953 端口也应该在监听systemctl status named ss -tlnp | grep :53在 RHEL 系里bind 服务名一般叫named在 Debian/Ubuntu 上则叫named或bind9。无论哪种确认 DNS 服务已启用就行。4.3 用 testparm 检查默认配置testparm 是我们检查 smb.conf 是否合法的工具。刚装完不可能有语法错误但跑一遍可以验证配置解析正常testparm -s这个命令会把/etc/samba/smb.conf的最终有效配置打印出来看起来内容很长但基本是模板加注释。此时不用去理解每一行只要确认没有ERROR字样即可。4.4 防火墙与 SELinux 预检查ufw 或 firewalld 是否开启决定了后续客户端能不能连过来。安装阶段就顺手把端口放行后面初始化域控后省得再折腾# RHEL 系 firewalld firewall-cmd --permanent --add-servicedns firewall-cmd --permanent --add-servicekerberos firewall-cmd --permanent --add-serviceldap firewall-cmd --permanent --add-servicesmb firewall-cmd --reload # Debian/Ubuntu ufw ufw allow dns ufw allow kerberos ufw allow ldap ufw allow smb ufw reload顺带提一句即使没有开防火墙也建议把上面的命令记录下来因为很多云服务器或内网环境还有安全组这一层过滤规则端口不通会导致后面“服务明明起来了客户端就是连不上”的诡异问题。如果你用的是 RHEL 系还需要看看 SELinux 的状态getenforce如果返回Enforcing在初始化域控之前就要考虑调整 Samba 相关布尔值。最直接的方式是先临时放到 Permissive 模式做验证setenforce 0确认域控和客户端登录都正常之后再回去决定是否需要补 SELinux 策略。这里不是让你直接关闭 SELinux 然后不管而是建域初期用 Permissive 模式排除 SELinux 干扰能大幅减少排查变量的数量。4.5 检查域名解析和主机名解析在安装阶段我还喜欢做一个简单的 DNS 查询测试确认系统能正确解析自己的 FQDNping -c 2 $(hostname -f) getent hosts $(hostname -f)如果/etc/hosts写得对应该能解析到你自己设定的固定 IP。这一步看起来基础但 Samba 域控初始化时会用本机的主机名做大量用途如果解析结果指向127.0.1.1或者解析失败初始化时会出现“无法确定主机名对应的 IP 地址”这类问题。5. 安装阶段的常见问题与排查技巧写这篇文章之前我在自己预装的虚拟机和几台测试服务器上把安装流程跑了几遍也回忆了不少以前带新人时遇到的共同问题。下面这些都是安装阶段真实发生过的高频故障我把典型报错和排查思路整理成了一张速查表。5.1 安装报错速查表典型报错场景可能原因处理方法apt update时源仓库签名错误系统源配置过期或时区不对导致密钥校验失败先校正时间再apt-key adv --refresh-keys或重新配置源列表E: Unable to locate package samba-dcUbuntu 源里没有单独 samba-dc 包建域不需要单独 samba-dc一体化功能已集成在samba包内dnf install提示包冲突系统里已有的旧版 samba 相关包与新包冲突dnf remove samba*后用dnf clean all再重装samba-tool执行后报ModuleNotFoundErrorPython 依赖库未安装齐安装python3-dns、python3-gpg或直接重装samba包smbd --version显示 3.x源仓库版本太旧或者装错套件检查源优先顺序升级系统到较新稳定版再装启动服务时Failed to start smb.service配置文件语法错误运行testparm -s定位错误行445 端口被占用其他 SMB 服务或旧实例仍在运行lsof -i :445找到 PID停掉冲突进程或换端口5.2 安装后服务反复重启的排查思路如果你发现 smbd 或 nmbd 启动后几秒钟就自动退出打开系统日志看一下journalctl -u smbd --no-pager | tail -50多数情况下问题的根源不是 Samba 包本身而是配置文件里写入了无效路径或权限不对。安装阶段如果只是回答向导、没有手动改过 smb.conf服务不应该反复重启。如果确认没改过配置还出问题就检查一下/etc/samba和/var/log/samba目录的属主确保是 root 或 samba 用户可写。5.3 关于“装完了但 88 端口没监听”的一个规律这个问题我几乎每次带人都会遇到。很多人装完 Samba查端口发现 88 端口没起来就以为安装失败了。实际上Samba 的 Kerberos KDC 是由一体化进程samba在初始化完成域控后才会加载的而samba进程默认不随包安装自动启动。换句话说只要还没有执行samba-tool domain provision88 端口和 389 端口永远都不会出现。顺带说一个很多人忽略的小规律在装完但尚未初始化的时候系统里只会有smbd和nmbd压根没有samba这个常驻进程。所以后续我们在系列第三篇配置域控的时候一定要先把这些传统服务管理起来再启动一体化进程。5.4 时间同步相关的坑前面提到了时间同步很重要这里再展开讲一个真实场景在同一套测试环境里有一台 Windows 主机加入域后总是每隔几分钟就被踢下线排查日志看到大量 Kerberos 错误最后发现是域控服务器本身的 BIOS 时钟漂移了 8 分钟。而安装 Samba 的当时chronyc makestep确实同步过但后续服务器重启过程中 RTC 时间没有正确同步回系统。解决办法是在安装阶段就设置好时间同步的持久化服务并且确保 chrony 或 ntp 开机自启systemctl enable --now chrony另外如果这套环境用的是虚拟机建议在宿主机和虚拟机两端都开启时间同步选项避免每次快照回滚之后时间又歪掉。5.5 安装阶段要不要禁用 IPv6这个问题在多个网络环境里反复出现。逻辑是Samba 服务默认监听 IPv6 地址但很多内网环境并没有正确配置 IPv6 路由导致为客户端服务的某些请求解析到 IPv6 地址后超时。我的个人习惯是除非明确有 IPv6 需求否则从安装阶段就把 IPv6 在系统层禁用掉这样可以减少后续域控对外提供解析服务时出现未知问题的概率。具体做法是编辑/etc/default/grub在GRUB_CMDLINE_LINUX这一行追加ipv6.disable1然后更新 grub 并重启sed -i s/^GRUB_CMDLINE_LINUX\(.*\)/GRUB_CMDLINE_LINUX\1 ipv6.disable1/ /etc/default/grub update-grub reboot不过要说明一点禁用 IPv6 不是一个必须动作只是我在这里统一的习惯。如果你的网络里需要在 AD 域控上启用 IPv6那就不动它。6. 安装完成后的经验收尾Samba 的安装本身不复杂但我不建议把它当成“敲完命令就结束”的流程。我个人在实际操作中有一个固定习惯装完系统里所有 Samba 相关组件后先把/etc/samba、/var/lib/samba和/etc/krb5.conf这三个位置分别打一个干净的备份包存到独立目录。这一步只需要三分钟但能让你在执行域控初始化前始终有一个绝对干净的“可回滚点”。另外装完之后我还会顺手把smbd --version的输出、systemctl status smbd的信息、以及hostnamectl的主机名状态全部记录到一个部署笔记里。这样做不是为了形式主义而是当整个域环境后续出现莫名其妙的问题时你可以快速确认“安装阶段的基线到底是什么状态”不用靠记忆去翻。最后再分享一个利用零碎时间的技巧装完 Samba 之后、真正初始化域控之前强烈建议你动手敲一遍smbclient -L localhost -U guest看看能不能连上本机的 SMB 匿名共享。如果能出现共享列表或者正常的拒绝访问提示那至少说明 445 端口的服务链路是通的这能为下一篇配置域控减少一个变量。到这里Samba 的安装已经算真正完成了接下来就等samba-tool domain provision这一步了。
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。