news 2026/10/16 8:59:16

Samba AD域控安装全解析:组件、命令与验证

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Samba AD域控安装全解析:组件、命令与验证

上一篇文章把建域的整体规划和域名、主机规划聊完了,这篇就是系列里偏实操的第一步:把 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 dc01

1.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(文件共享服务进程)、nmbd(NetBIOS 名称服务进程),以及 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 88
LDAP 服务轻量目录访问协议TCP/UDP 389, 636
DNS 服务DNS 域名解析(内置或外部 Bind)TCP/UDP 53
SMB/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、acl:AD 域控需要处理大量的扩展属性和 POSIX ACL,Samba 在初始化 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-enhanced

RHEL 系默认不启动任何 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 --version

samba-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 系装好了 bind9,53 端口也应该在监听:

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-service=dns firewall-cmd --permanent --add-service=kerberos firewall-cmd --permanent --add-service=ldap firewall-cmd --permanent --add-service=smb 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 查询测试,确认系统能正确解析自己的 FQDN:

ping -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 provision,88 端口和 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.disable=1,然后更新 grub 并重启:

sed -i 's/^GRUB_CMDLINE_LINUX="\(.*\)"/GRUB_CMDLINE_LINUX="\1 ipv6.disable=1"/' /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这一步了。

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

Anki 间隔重复记忆卡:三步跑起来,4 个技巧让记忆效率翻倍

Anki 间隔重复记忆卡:三步跑起来,4 个技巧让记忆效率翻倍 【免费下载链接】anki Anki is a smart spaced repetition flashcard program 项目地址: https://gitcode.com/GitHub_Trending/an/anki 还在为"昨天背的单词今天全忘"而烦恼吗…

作者头像 李华
网站建设 2026/10/16 8:52:52

YOLO11 Neck优化:递归特征金字塔RFP闭环精化原理与工程落地方案

YOLO11出来后,我们做检测方向的朋友都在纠结同一个问题:该从哪个部位下手优化。有人去换Backbone,有人去改检测头,我折腾了一圈后发现,最容易被低估、其实提升空间最大的是Neck。Neck在YOLO11里承担的是跨尺度特征融合…

作者头像 李华
网站建设 2026/10/16 8:52:26

C++指针与引用:从底层原理到实战避坑指南

几乎每个写过C的人都绕不开这个问题:指针和引用到底有什么区别?面试会被问到,写代码时会纠结,甚至读开源代码时也会被各种“引用”用法绕晕。教科书上往往给一段干巴巴的对比表:引用不能为空、不能重新绑定、指针可以……

作者头像 李华
网站建设 2026/10/16 8:52:01

markdownlint 与 Prettier `--tab-width=4` 的列表缩进配置实战

开发工具代码质量Lint静态分析 【免费下载链接】markdownlint A Node.js style checker and lint tool for Markdown/CommonMark files. 项目地址: https://gitcode.com/gh_mirrors/ma/markdownlint 点击查看 免费下载 本指南围绕仓库 doc/Prettier.md 中记录的 Pr…

作者头像 李华