Rocky Linux 9 从入门到精通009 — Samba 共享(理论篇)

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.0SMB2.0SMB3.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

Avatar photo

关于 木子

Email: muzi@vip.rockylinux.cn 微信:VebinLee QQ: 2306867585
Founder of the Rocky Linux Chinese community, MVP、VMware vExpert、TVP, advocate for cloud native technologies, with over ten years of experience in site reliability engineering (SRE) and the DevOps field. Passionate about Cloud Computing、Microservices、CI&CD、DevOps、Kubernetes, currently dedicated to promoting and implementing Rocky Linux in Chinese-speaking regions.
用一杯咖啡支持我们,我们的每一篇[文档]都经过实际操作和精心打磨,而不是简单地从网上复制粘贴。期间投入了大量心血,只为能够真正帮助到您。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇