Samba 简介
Samba 是在 Linux 和 Unix 系统上实现与 Windows 互操作性的标准程序套件。作为一款遵循 GNU 通用公共许可证(GPL)发布的自由软件,Samba 项目也是软件自由保护协会的成员。自 1992 年诞生以来,Samba 持续为所有支持 SMB/CIFS 协议的客户端(包括各版本的 DOS、Windows、OS/2 以及 Linux 等)提供安全、稳定且高效的文件和打印共享服务。Samba 还可将 Linux/Unix 服务器与桌面系统无缝集成到 Active Directory 环境中,既能充当域控制器,也能作为普通域成员,成为混合网络环境中不可或缺的关键组件。
Samba 服务是企业内用到非常多的服务,比如:
- 您和同事之间通过共享文件夹传输文件
- 共享打印机服务
- 群晖文件共享服务
- TrueNAS 文件共享服务
这些功能都用到了 Samba 服务。但大部份的企业会使用 Windows Server 自带的 SMB 服务与 Windows Active Directory 结合实现统一认证管理。而在本章节将向大家介绍 FreeIPA LDAP + Samba 组合。
SMB 发展史
谈到 Samba,就不得不说 SMB 协议发展史,SMB(Server Message Block) 协议经历了多个版本的演变,包括:SMB1.0、SMB2.0、SMB3.0 和 SMB over QUIC。它们主要特性、安全性、漏洞、性能等对比如下:
| 维度/版本 | SMB 1.0 | SMB 2.0 | SMB 3.0 | SMB 3.1.1 | SMB over QUIC |
|---|---|---|---|---|---|
| 首发时间 | 1980s / 1992 (Win for WG/NT) | 2006 (Vista/Server 2008) | 2012 (Win8/Server 2012) | 2015 (Win10/Server 2016) | 2021 (Windows Server 2022/Win11) |
| 协议版本号 | 1.0 | 2.0 | 3.0 | 3.1.1 | 3.0 (基于 QUIC) |
| 最大带宽 | 100 Mbps (理论) | 1 Gbps (理论) | 10 Gbps 及以上 (理论) | 10 Gbps 及以上 (理论) | 1-10 Gbps(取决 QUIC 网络) |
| 传输加密 | 不支持 | 不支持 | 支持(AES-128) | 更强(AES-128 GCM) | 支持(TLS 1.3) |
| 完整性验证 | 不支持 | 可选(弱签名) | 强签名与数据完整性验证 | 强化的数据完整性 | 支持 |
| 压缩支持 | 不支持 | 不支持 | 支持 | 更强压缩 | 支持 |
| 多通道 | 不支持 | 不支持 | 支持 | 支持 | 支持 |
| 认证机制 | 弱,易被嗅探/攻击 | 改进(NTLM 等) | 支持 Kerberos/NTLMv2/多重认证 | 强化 NTLMv2/Kerberos | TLS 加密+Windows 认证 |
| 主要安全漏洞 | 漏洞多(永恒之蓝 WannaCry、Badlock、远程代码执行、NULL 会话、中间人攻击等) | 漏洞减少(缓冲区溢出、DoS、信息泄露、未认证访问) | 典型:CVE-2020-0796(SMBGhost)、被动及时修复 | 已知高危漏洞少,强加密抗中间人 | 典型:CVE-2023-24898(DoS,需补丁) |
| 典型攻击案例 | WannaCry、Badlock、信息泄露等 | 部分缓冲区溢出与拒绝服务 | SMBGhost 蠕虫、高危远程代码执行 | 暂无大规模公开案例 | CVE-2023-24898 远程 DoS |
| 主要改进/特性 | 早期文件共享协议,功能有限,极易被攻击 | 性能显著增强、减少协议开销 | 加密、持久句柄、多通道、RDMA 直连支持 | 更强加密算法,预防中间人,默认更安全 | TCP 免 VPN 远程访问,低延迟,内建加密 |
| 典型场景 | 老旧局域网或遗留兼容 | 现代局域网文件共享 | 企业主流,虚拟化/大带宽/高安全 | 企业云、远程办公,分布式环境 | 远程/混合云/穿越防火墙高安全场景 |
| 操作系统支持 | Windows NT/95/98/XP/老 Linux 等 | Vista/Server2008 及以上 | Win8/Server2012 等 | Win10/Server2016 及以上 | Win11/Server2022/支持 QUIC 的系统 |
| 默认启用现状 | 新系统默认关闭(强烈不建议继续用) | 新系统默认启用 | 新系统默认启用 | 新系统默认启用 | 需手动配置,适合远程新部署 |
目前 SMB 1.0 因为安全性问题,已经被淘汰,不推荐使用。SMB 2.0 性能有所提升,但安全性不如高级版本。SMB 3.0/3.1.1 作为企业首选,兼顾性能与安全。SMB over QUIC 适合现代远程和云场景,安全性最强。此外,最大传输速度仅为协议理论峰值,受实际硬件、网络环境、加密等级等多因素影响。
SMB VS Samba 实现支持表
| SMB 版本 | Windows 原生支持 | Samba 支持版本 | Linux 发行版(通过 Samba) | macOS 支持说明 |
|---|---|---|---|---|
| SMB 1.0 | NT/95/98/2000/XP/Vista/7/8/10(新版本默认关闭) | Samba 2.x及以下(默认启用,Samba 4.x仍可手动启用) | 主流发行版内Samba 2.x/3.x/4.x(可启用兼容) | macOS 10.9及以下,10.10起默认禁用 |
| SMB 2.0/2.1 | Vista/Server 2008/Win7/Server 2008 R2及以上 | Samba 3.0.0(2003年起)至今(默认支持SMB2及2.1) | 2008年以后大部分主流发行版(默认支持) | macOS 10.9起默认支持SMB 2.x |
| SMB 3.0 | Win8/Server2012及以上 | Samba 4.0.0(2012年发布)起支持,推荐4.2以上版本 | Ubuntu 14.04/Debian 8/RHEL7/SUSE 12等内置或可升级 | macOS 10.11及以上,默认SMB 3.0 |
| SMB 3.1.1 | Win10/Server 2016/2019/2022 | Samba 4.3.0(2015年发布)及以上(需开启加密,部分特性如Pre-auth需4.7+) | Ubuntu 18.04+/Debian 10+/RHEL8+/SUSE15+等(Samba 4.7+) | macOS 10.13及以上,部分实现支持 |
| SMB over QUIC | Win11/Server 2022 Azure Edition 及以上 | 暂不支持(Samba 当前未实现 QUIC,社区有开发计划) | 暂不支持 | 暂不支持 |
注:在 Samba+ 2025 年 5 月 12 日发文中表示 SMB over QUIC 的基础工作已完成,但目前还未集成至某个发行版中,持续观察。
Samba 配置详解
为确保后续 Samba 服务器部署过程中的配置逻辑连贯,我们将在此单独对 Samba 配置文件进行详细讲解,提前说明相关内容。主要参考 /etc/samba/smb.conf.example 文件进行说明。如果您想了解更加全面的 Samba 参数,可以使用 man smb.conf 获取。
全局选项
# 指定 Samba 服务器所属的 Windows 工作组名(Workgroup)或 Windows 域名(Domain)。此选项决定了在 Windows 网络邻居浏览窗口中服务器显示在哪个组下。
workgroup = WORKGROUP
# 为 Samba 服务器设置描述信息,Windows 客户端在资源浏览器看到的服务器备注内容(相当于 Win 上“计算机说明”)。%h 表示主机名,%v 表示 Samba 版本号。
server string = Samba Server (%h) Version %v
# 指定 Samba 服务器在网络内展示的 NetBIOS 名(即 Windows 共享资源列表里的机器名),最长 15 个字符。一般可省略此项,默认与主机名一致,如有需要可以单独设置。
netbios name = FILESERVER
# 指定 Samba 监听(绑定)哪些网络接口或地址,只响应指定网卡的访问请求。常用于多网卡主机只做内网文件服务,增强安全性。不要遗漏 lo(本地回环网卡),否则本机访问共享会失败。
interfaces = lo eth0 192.168.0.0/16
# 指定哪些主机可以连接 Samba 服务,支持 IP 或子网段,允许多个配置,用空格或逗号分隔。还可以设置为只允许 localhost 访问、特定网段等,提升安全性。也可在单独共享下单独配置。
# 只允许本机和内网 192.168.1.0/24 访问 Samba,"127." 表示所有 localhost 本地环回地址。hosts allow 支持以“前缀”的方式识别网段(如写 192.168.1. 就等同于 /24)。
# 以下两种 hosts allow 的写法都支持,推荐使用第二种写法(CIDR 格式)
hosts allow = 127. 192.168.1.
hosts allow = 127.0.0.0/8 192.168.1.0/24
# 指定哪些主机禁止访问 Samba 服务。一般与 hosts allow 配合使用。
# 拒绝其它所有主机
hosts deny = ALL
日志选项
# 指定 Samba 服务端日志文件的路径和命名方式。%m 是变量,代表发起连接的客户端主机名。所以 log.%m 会为每个客户端生成各自独立的日志文件,便于排查和追踪单台客户端的行为。您也可以用 %U(用户名)、%I(客户端IP地址)等变量,详情见man smb.conf。
log file = /var/log/samba/%m.log # %m=客户端NetBIOS名称
log file = /var/log/samba/%I.log # %I=客户端IP
log file = /var/log/samba/%U.log # %U=用户名
log file = /var/log/samba/all.log # 为了方便统一日志管理,可以将日志写入一个文件
# 指定 Samba 每个日志文件最大容量(单位:KB)。达到此上限后,Samba 会自动轮转(rotate)日志文件,即老日志重命名为 .old,新日志文件重新开始。为防止磁盘空间被日志淹没,必须合理设置此项。
max log size = 1024
# 控制日志级别
log level = 1 # 推荐生产环境
日志级别设置,建议参考链接:Configuring Logging on a Samba Server - SambaWiki
独立服务器选项
# security 用于指定 Samba 的认证(安全)模式,即 Samba 服务如何验证用户身份。
# 常用值有:
# user:推荐,每个用户单独认证,最常见最安全。要求每个客户端提供 Samba 服务器上存在的用户名和密码,支持设置不同的用户权限、主目录等。
# share:已废弃,不推荐,用于早期匿名访问场景。
# server:已废弃,不推荐,通过另一台服务器转发认证请求。
# domain/ads:分别用于作为 Windows NT 域成员、Active Directory 成员的情景(AD整合方案)。
security = user
# passdb backend 决定 Samba 如何存储和管理账户与密码。
# 可用后端包括:
# tdbsam:推荐,默认选项。账户信息保存在本地 tdbsam 数据库(如 /var/lib/samba/passdb.tdb)。不依赖系统用户,管理方便。
# ldapsam:适用于与 LDAP 目录集成的大型或复杂环境。
# smbpasswd:老式纯文本文件方式。出于兼容需要才用(如 /etc/samba/smbpasswd)。
# 新安装建议用 tdbsam。LDAP部署或大规模集中认证可用 ldapsam,需额外配置。
# 如果用 tdbsam,无需额外配置,工具 pdbedit、smbpasswd 都支持其管理。
passdb backend = tdbsam
域成员服务器选项
简单理解就是当采用 LDAP 认证模式时,需要对以下配置进行设置。
# 控制 Samba 服务器的认证模式。
# 当 Samba 需要作为 Windows 域成员或 Active Directory 成员时,security 必须设为 domain(NT域)或 ads(Active Directory 域)。
# security = domain:传统 NT4 域成员方式。
# security = ads:推荐,用于与现代Windows AD集成(Kerberos、LDAP等)。
security = ads
# 参考上述说明
passdb backend = ldapsam
# 当 Samba 以 security = ads 模式加入 Active Directory 时,此项才需要配置。
# 指定 AD 域的 Kerberos Realm,写法通常为全大写(如 ROCKYLINUX.LAN)。
# 必须与您的 AD 域名完全一致(包括主机加入到域时使用的名字)。
realm = ROCKYLINUX.LAN
# 通常不推荐手填,让 Samba 通过 DNS SRV 记录自动发现域控制器。
# 仅针对特殊情况下(比如域控制器无法通过 DNS 发现,或特定负载场景)才指定。
# 格式可以写具体控制器主机名,如 password server = pdc.rockylinux.lan [bdc.rockylinux.lan]。
# 若设为 password server = *,则让 Samba 自动定位所有 DC。
password server = *
域控制器选项
在企业内部使用 Samba PDC 做为域控制器的并不常见,所以木子暂不计划撰写此章节。
WINS 名称服务器选项
在 Windows 2003 之前,此组件被广泛使用,但从 Windows 2008 开始,微软已将其移除,目前已经不再被主流系统采用。Samba 之所以仍保留相关功能,主要是为了兼容 Windows XP、Windows 2000、Windows 98 等老旧操作系统。同样木子暂不计划撰写此章节。
打印服务选项
# 设置为 yes 时,Samba 会自动根据系统可用的打印机进行加载和共享,无需手动添加每台打印机的配置。
load printers = yes
# 允许您向 CUPS(Common Unix Printing System)库传递选项。例如:设置该选项为 raw 时,能够让您的 Windows 客户端使用本地驱动程序。
cups options = raw
# 指向一个包含可用打印机信息的文件。通过更改该路径可以让 Samba 从不同的源获得打印机列表。一般情况下,UNIX 系统会将 printcap 文件放在 /etc/printcap。
;printcap name = /etc/printcap
# 将该参数设置为 lpstat 时,Samba 会通过 lpstat 命令动态获取正在系统中注册的打印机,而不是读取固定文件。
;printcap name = lpstat
# 指定 Samba 使用哪种打印管理系统,cups 是最常用的现代打印服务。
;printing = cups
文件系统选项
本节中的选项可以在文件系统支持扩展属性(extended attributes)且已启用这些属性(通常通过 user_xattr 挂载选项)时使用。通过这些选项,管理员可以指定将 DOS 属性存储在扩展属性中,并确保 Samba 不会更改权限位。这些选项主要用于提高 Windows 与 UNIX 文件属性兼容性,同时保护 UNIX 权限不受影响(需在挂载文件系统时启用扩展属性支持)。
注意:这些选项可以针对单个共享(share)进行设置。如果在 [global] 部分(全局设置)设置,则对所有共享默认为此值。
# 设置为 no 时,归档标志不会和 UNIX 文件的某个权限位关联,通常和文件的“是否被修改”相关。
;map archive = no
# 设置为 no 时,隐藏标志不会写入 UNIX 权限位。否则,Samba 会尝试让具有隐藏属性的文件在 UNIX 下也表现为隐藏(通常通过某些权限位实现)。
;map hidden = no
# 设置为 no 时,文件的只读属性不会影响或更改 UNIX 的写权限,否则 Samba 会根据 DOS 标志调整 UNIX 文件的读写权限。
;map read only = no
# 设置为 no 时,系统标志不会反映在 UNIX 权限中。
;map system = no
# 启用后,Samba 会将如归档、隐藏、只读、系统等 DOS 属性保存到文件的扩展属性(而不是直接修改 UNIX 权限位),这样可以更好地兼容 Windows 的文件属性管理,同时不影响 UNIX 文件的实际权限设置。
;store dos attributes = yes
共享定义
Share Definitions 简单理解就是共享打印机或文件夹配置。在 Samba 中通过配置参数,可以限制谁可以访问、能否写入,以及共享的类型(普通文件夹/打印机/登录脚本等)。注释符号(分号)表示该项当前未启用,只要去掉分号即可生效。配置可全局生效,也能每个共享分别设置。
[homes] 用户主目录共享
[homes]
comment = Home Directories # 共享的描述说明。例如"主目录"。
browseable = no # 是否能被用户在网络邻居中看到。no 表示隐藏,该共享只对认证用户显示。
writable = yes # 是否允许用户写入。yes 表示可写。
; valid users = %S # 指定允许访问共享的用户列表,%S 为自动匹配用户名。
; valid users = MYDOMAIN\%S # 指定允许访问共享的用户列表,MYDOMAIN 指定域,%S 为用户名。
[printers] 打印机共享
[printers]
comment = All Printers # 共享描述
path = /var/tmp # 打印作业临时文件存放目录
browseable = no # 是否能被用户在网络邻居中看到。no 表示隐藏,该共享只对认证用户显示。
guest ok = no # 是否允许匿名 guest 用户访问。no 表示拒绝。
writable = no # 是否允许写操作,no 表示不允许。
printable = yes # 是否作为打印机共享,yes 启用。
[netlogon] 域登录服务共享
用于 Windows 域控制器的登录脚本与策略。默认不启用。
;[netlogon]
; comment = Network Logon Service # 描述信息
; path = /var/lib/samba/netlogon # 共享路径
; guest ok = yes # 是否允许匿名 guest 用户访问。no 表示拒绝。
; writable = no # 是否允许写操作,no 表示不允许。
; share modes = no # 是否启用共享模式,no 表示不启用。
[Profiles] 漫游配置文件共享
存放 Windows 用户漫游配置文件的目录,通常只在需要域漫游服务时才启用。
;[Profiles]
; path = /var/lib/samba/profiles # 共享路径
; browseable = no # 是否能被用户在网络邻居中看到。no 表示隐藏,该共享只对认证用户显示。
; guest ok = yes # 是否允许匿名 guest 用户访问。no 表示拒绝。
[public] 公开目录
;[public]
; comment = Public Stuff # 描述信息
; path = /home/samba # 共享路径
; public = yes # 是否公开,yes 表示公开。
; writable = no # 是否允许写操作,no 表示不允许。
; printable = no # 是否打印机,no 表示非打印机共享。
; write list = +staff # 指定哪些用户或组可写,这里表示只有 staff 组成员可写。
参考文献
[1] Samba Documentation\
[2] User Documentation - SambaWiki
[3] 使用 Windows Server 中的 SMB 3 协议的文件共享概述 | Microsoft Learn










