如何在Linux上安装和配置Samba:完整技术指南
Samba 是 SMB/CIFS(服务器消息块/通用互联网文件系统)协议的开源实现,使基于 Linux 和 Unix 的服务器能够与 Windows 客户端以及其他 Linux 机器共享文件、打印机和其他资源。它充当跨操作系统的桥梁,成为混合环境中跨平台网络文件共享的事实标准。
对于核心问题的简洁回答:在 Linux 上安装 Samba 需要通过发行版的包管理器安装 `samba` 软件包,在 `/etc/samba/smb.conf` 中定义共享块,使用 `smbpasswd` 创建 Samba 专用用户凭据,并在防火墙中开放 137–139 和 445 端口。以下各节将以精确的技术细节涵盖此过程的每个层面。
Samba 底层实际工作原理
Samba 以一组守护进程的形式运行。了解每个守护进程的功能可以避免大量配置错误:
- `smbd` — 通过 TCP 端口 445 和 139 处理文件和打印共享、身份验证及资源锁定。
- `nmbd` — 通过 UDP 端口 137 和 138 管理 NetBIOS 名称解析。Windows 网络浏览(文件资源管理器中的”网络邻居”/”网络”)需要此功能。
- `winbindd` — 将 Samba 与 Active Directory 或 NT4 域集成,在 Linux 主机上启用域用户身份验证。独立文件共享不需要此功能。
当 Windows 客户端打开 `servershare` 时,它首先通过 DNS 或 NetBIOS(nmbd)解析服务器名称,然后通过端口 445 与 smbd 建立 SMB 会话。Samba 协商双方支持的最高 SMB 方言——现代系统上为 SMB 3.1.1——并将远程共享映射到客户端上的驱动器号或 UNC 路径。
前提条件
在继续之前,请确认以下内容:
- 运行 Ubuntu 20.04/22.04/24.04、Debian 11/12、CentOS Stream 8/9、RHEL 8/9 或 Fedora 38+ 的 Linux 服务器。
- Root 或 `sudo` 访问权限。
- 分配给服务器的静态私有 IP 地址(对于稳定的共享挂载至关重要)。
- 具备终端操作和文件权限的基本知识。
- 防火墙访问权限(UFW、firewalld 或 iptables)以开放必要端口。
如果您在云端或虚拟服务器上部署 Samba,VPS 托管环境为您提供完整的 root 访问权限和网络控制,可在不受共享环境限制的情况下管理守护进程、防火墙规则和持久挂载。
第 1 步:安装 Samba
使用适合您发行版的包管理器。始终先更新包索引,以避免安装过时版本。
Debian / Ubuntu:
“`bash
sudo apt-get update
sudo apt-get install samba samba-common-bin
“`
CentOS Stream / RHEL:
“`bash
sudo dnf install samba samba-client samba-common
“`
Fedora:
“`bash
sudo dnf install samba samba-client samba-common
“`
Arch Linux:
“`bash
sudo pacman -S samba
“`
安装后,验证已安装的版本:
“`bash
smbd –version
“`
在基于 RHEL 的系统上,还需安装 `samba-client` 以获取 `smbclient` 诊断工具,您将在后续步骤中使用它进行连接测试。
第 2 步:备份并编辑主配置文件
整个 Samba 配置存储在 `/etc/samba/smb.conf` 中。这个单一文件控制全局服务器行为、安全模型、共享定义和日志记录。在修改之前,创建一个带时间戳的备份:
“`bash
sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.backup.$(date +%F)
“`
打开文件进行编辑:
“`bash
sudo nano /etc/samba/smb.conf
“`
该文件分为多个部分。`[global]` 部分定义服务器范围的参数。各个共享部分(例如 `[sambashare]`)定义特定的共享资源。
需要审查的关键全局参数
在 `[global]` 部分内,请注意以下设置:
“`ini
[global]
workgroup = WORKGROUP
server string = Samba Server %v
netbios name = MYSERVER
security = user
map to guest = bad user
dns proxy = no
log file = /var/log/samba/log.%m
max log size = 1000
logging = file
panic action = /usr/share/samba/panic-action %d
server role = standalone server
obey pam restrictions = yes
unix password sync = yes
passwd program = /usr/bin/passwd %u
passwd chat = *Entersnews*spassword:* %nn *Retypesnews*spassword:* %nn *passwordsupdatedssuccessfully* .
pam password change = yes
min protocol = SMB2
max protocol = SMB3
“`
关键提示:`min protocol = SMB2` 指令明确禁用了 SMB1,该协议自 2014 年起已被弃用,是 EternalBlue(MS17-010)等漏洞利用的攻击向量。切勿在生产服务器上启用 SMB1。现代 Windows 10/11 和所有当前的 Linux CIFS 客户端均原生支持 SMB2 和 SMB3。
第 3 步:创建并准备共享目录
创建将通过网络公开的目录:
“`bash
sudo mkdir -p /srv/sambashare
“`
设置所有权和权限。正确的方法取决于您是否需要访客访问或仅限身份验证的访问。
对于经过身份验证的用户访问(推荐用于生产环境):
“`bash
sudo chown root:sambashare /srv/sambashare
sudo chmod 2770 /srv/sambashare
“`
`2770` 权限分解如下:
- `2` — setgid 位:新文件继承目录的组,防止多用户共享中的所有权碎片化。
- `7` — 所有者(root)拥有读、写、执行权限。
- `7` — 组(sambashare)拥有读、写、执行权限。
- `0` — 其他人无访问权限。
对于访客/公共访问(仅限家庭实验室或内部 LAN):
“`bash
sudo chown nobody:nogroup /srv/sambashare
sudo chmod 0777 /srv/sambashare
“`
请勿在面向互联网的服务器上使用 `0777`。具有全局写入权限的访客共享仅适用于隔离的可信网络。
第 4 步:创建系统组和用户
对于经过身份验证的共享,创建一个映射到 Samba 共享的专用 Linux 组:
“`bash
sudo groupadd sambashare
“`
添加将访问共享的 Linux 用户:
“`bash
sudo useradd -M -s /sbin/nologin sambauser
sudo usermod -aG sambashare sambauser
“`
`-M` 标志跳过创建主目录(这是一个服务账户,而非交互式用户)。`-s /sbin/nologin` 标志阻止该账户用于 SSH 或控制台登录——这是大多数教程忽略的关键安全加固步骤。
现在在 Samba 自己的密码数据库中注册该用户(与 `/etc/shadow` 分开):
“`bash
sudo smbpasswd -a sambauser
sudo smbpasswd -e sambauser
“`
`-a` 标志添加用户;`-e` 标志启用账户。Samba 在 `/var/lib/samba/private/passdb.tdb`(或根据 `passdb backend` 设置的 `smbpasswd` 文件)维护自己的凭据存储。用户可以存在于 Linux 中而不在 Samba 数据库中,反之亦然——他们必须在两者中都注册。
第 5 步:在 smb.conf 中定义共享
在 `/etc/samba/smb.conf` 末尾添加以下块。显示了两种配置:一种用于经过身份验证的访问,一种用于访客访问。
经过身份验证的共享(推荐用于生产环境)
“`ini
[sambashare]
path = /srv/sambashare
comment = Authenticated Network Share
browsable = yes
writable = yes
read only = no
guest ok = no
valid users = @sambashare
create mask = 0660
directory mask = 2770
force group = sambashare
“`
参数说明:
- `valid users = @sambashare` — `@` 前缀表示”名为 sambashare 的 Linux 组的任何成员”。这比列出单个用户名更具可扩展性。
- `create mask = 0660` — 新文件以 rw-rw—- 权限创建,防止全局可读文件。
- `directory mask = 2770` — 新子目录继承 setgid 位和组权限。
- `force group = sambashare` — 强制所有文件操作使用 sambashare 组,无论连接用户的主组是什么。
访客共享(家庭实验室/内部 LAN)
“`ini
[public]
path = /srv/sambashare
comment = Public Network Share
browsable = yes
writable = yes
read only = no
guest ok = yes
guest account = nobody
create mask = 0664
directory mask = 0775
“`
第 6 步:验证配置
在重启任何服务之前,运行内置配置解析器:
“`bash
testparm
“`
`testparm` 读取 `smb.conf`,报告语法错误,并在应用默认值后打印有效配置。注意任何 `WARNING` 行——它们通常表示已弃用的参数或安全配置错误。干净的输出以以下内容结束:
“`
Loaded services file OK.
Server role: ROLE_STANDALONE
Press enter to see a dump of your service definitions
“`
如果 `testparm` 报告错误,请在继续之前修复它们。使用损坏的配置文件重启 smbd 会导致服务静默失败或恢复为默认值。
第 7 步:重启并启用 Samba 守护进程
Debian / Ubuntu:
“`bash
sudo systemctl restart smbd nmbd
sudo systemctl enable smbd nmbd
“`
CentOS / RHEL / Fedora:
“`bash
sudo systemctl restart smb nmb
sudo systemctl enable smb nmb
“`
验证两个守护进程是否正在运行:
“`bash
sudo systemctl status smbd nmbd # Debian/Ubuntu
sudo systemctl status smb nmb # RHEL/Fedora
“`
检查守护进程是否在正确的端口上监听:
“`bash
sudo ss -tlnp | grep -E '(smbd|nmbd|445|139)'
“`
预期输出应显示 `smbd` 绑定到端口 445 和 139。
第 8 步:配置防火墙规则
Samba 需要开放以下端口:
| 端口 | 协议 | 服务 | 用途 |
|---|
| —— | ———- | ——— | ——— |
|---|
| 137 | UDP | nmbd | NetBIOS 名称服务 |
|---|
| 138 | UDP | nmbd | NetBIOS 数据报服务 |
|---|
| 139 | TCP | smbd | NetBIOS 会话服务(SMB over NetBIOS) |
|---|
| 445 | TCP | smbd | 直接 SMB(SMB2/SMB3——主要端口) |
|---|
UFW(Debian/Ubuntu):
“`bash
sudo ufw allow 'Samba'
sudo ufw status
“`
firewalld(CentOS/RHEL/Fedora):
“`bash
sudo firewall-cmd –permanent –add-service=samba
sudo firewall-cmd –reload
sudo firewall-cmd –list-services
“`
iptables(手动):
“`bash
sudo iptables -A INPUT -p tcp –dport 445 -j ACCEPT
sudo iptables -A INPUT -p tcp –dport 139 -j ACCEPT
sudo iptables -A INPUT -p udp –dport 137:138 -j ACCEPT
“`
安全注意事项:如果您的 Samba 服务器可从互联网访问(不建议用于标准文件共享),请使用 `-s 192.168.1.0/24` 或等效方式将这些规则限制为特定源 IP 范围。将 SMB 端口暴露于公共互联网是严重的安全风险。
第 9 步:SELinux 注意事项(RHEL/CentOS/Fedora)
在 SELinux 强制执行的系统上,Samba 需要在共享目录上添加额外的上下文标签。如果没有这些标签,即使 Linux 权限正确,smbd 也会被阻止访问该路径。
“`bash
sudo setsebool -P samba_enable_home_dirs on
sudo setsebool -P samba_export_all_rw on
sudo semanage fcontext -a -t samba_share_t "/srv/sambashare(/.*)?"
sudo restorecon -Rv /srv/sambashare
“`
验证上下文是否已应用:
“`bash
ls -lZ /srv/sambashare
“`
输出应显示 `system_u:object_r:samba_share_t:s0` 作为 SELinux 上下文。跳过此步骤是 Samba 共享在 RHEL 系列系统上失败的最常见原因——服务看起来正常启动,但客户端收到”访问被拒绝”错误。
第 10 步:从 Windows 访问共享
在 Windows 客户端上:
- 打开文件资源管理器。
- 在地址栏中输入:`<server-ip>sambashare` 并按 Enter。
- 出现提示时,输入 Samba 用户名和密码。
- 要使连接持久化,右键单击共享并选择映射网络驱动器。
对于脚本化或企业部署,从命令行映射驱动器:
“`cmd
net use Z: 192.168.1.100sambashare /user:sambauser /persistent:yes
“`
第 11 步:从 Linux 访问共享
使用 smbclient(交互式,用于测试):
“`bash
smbclient //192.168.1.100/sambashare -U sambauser
“`
这将打开一个类似 FTP 的交互式 shell。使用 `ls`、`get`、`put` 和 `exit` 导航和传输文件。
使用 CIFS 持久挂载共享:
首先,安装 CIFS 工具包:
“`bash
sudo apt-get install cifs-utils # Debian/Ubuntu
sudo dnf install cifs-utils # RHEL/Fedora
“`
创建挂载点和凭据文件(切勿在 `/etc/fstab` 中以明文形式存储密码):
“`bash
sudo mkdir -p /mnt/sambashare
sudo nano /etc/samba/credentials
“`
在凭据文件中:
“`
username=sambauser
password=yourpassword
domain=WORKGROUP
“`
保护凭据文件:
“`bash
sudo chmod 600 /etc/samba/credentials
sudo chown root:root /etc/samba/credentials
“`
将挂载添加到 `/etc/fstab` 以在重启后持久化:
“`
//192.168.1.100/sambashare /mnt/sambashare cifs credentials=/etc/samba/credentials,uid=1000,gid=1000,iocharset=utf8,vers=3.0,_netdev 0 0
“`
`_netdev` 选项告诉系统在尝试挂载之前等待网络可用——这对于在启动时挂载网络共享的服务器至关重要。`vers=3.0` 选项强制使用 SMB3,避免回退到旧方言。
在不重启的情况下测试 fstab 条目:
“`bash
sudo mount -a
“`
SMB 协议版本比较
选择正确的 SMB 方言会影响性能、安全性和兼容性。下表总结了主要差异:
| SMB 版本 | 年份 | 主要特性 | 安全性 | 推荐用途 |
|---|
| ————- | —— | ————– | ———- | —————– |
|---|
| SMB1 | 1983 | 基本文件共享 | 存在严重漏洞(EternalBlue) | 切勿使用——明确禁用 |
|---|
| SMB2 | 2006 | 流水线、减少冗余通信、签名 | 有所改进 | 旧版 Windows Vista/7 客户端 |
|---|
| SMB2.1 | 2010 | 客户端 oplock 租约 | 有所改进 | Windows 7/2008 R2 |
|---|
| SMB3.0 | 2012 | 多通道、加密、故障转移 | 强 | Windows 8/2012 及更高版本 |
|---|
| SMB3.1.1 | 2015 | 预身份验证完整性、AES-128-GCM | 最强 | Windows 10/11、现代 Linux |
|---|
始终在 `[global]` 中设置 `min protocol = SMB2`,并在所有客户端支持的情况下优先使用 `SMB3`。对于包含敏感数据的任何共享,SMB3.1.1 加密(`smb encrypt = required`)是正确的选择。
Samba 与 NFS:选择正确的协议
Samba(SMB/CIFS)和 NFS 都广泛用于基于 Linux 的网络文件共享,但它们服务于不同的使用场景:
| 标准 | Samba(SMB/CIFS) | NFS |
|---|
| ———- | —————– | —– |
|---|
| 主要使用场景 | 跨平台(Linux + Windows) | Linux 到 Linux 共享 |
|---|
| Windows 客户端支持 | 原生支持,无需客户端软件 | 需要安装 NFS 客户端 |
|---|
| macOS 支持 | 原生支持(SMB) | 通过内置 NFS 客户端支持 |
|---|
| 身份验证 | 用户名/密码、AD 集成 | 基于主机(IP/主机名) |
|---|
| 性能(LAN) | 开销略高 | 开销更低,LAN 上速度更快 |
|---|
| 加密 | SMB3 支持 AES 加密 | NFSv4.2 支持 krb5 加密 |
|---|
| 配置复杂度 | 中等 | 纯 Linux 环境中较低 |
|---|
| 最适合 | 混合操作系统环境、域集成 | 同构 Linux 集群、HPC |
|---|
如果您的基础设施完全是 Linux——例如,运行容器化工作负载的独立服务器集群——NFS 可能提供更低的延迟。对于任何有 Windows 客户端或 macOS 用户的环境,Samba 是正确的选择。
常见陷阱和故障排除
共享可见但返回”访问被拒绝”
- 在 SELinux 系统上:按照第 9 步所述检查并应用 `samba_share_t` 上下文。
- 检查 Linux 权限:连接用户(或访客共享的 `nobody` 账户)必须在文件系统级别对路径具有读/写访问权限,独立于 Samba 自身的 ACL。
- 验证 smbpasswd:用户必须通过 `smbpasswd -a` 添加并通过 `smbpasswd -e` 启用。
浏览网络时共享不可见
- 确认 `nmbd` 正在运行:`sudo systemctl status nmbd`。
- 确保在共享定义中设置了 `browsable = yes`。
- Windows 10/11 禁用了依赖 SMB1 的”计算机浏览器”服务。使用直接 UNC 路径(`ipshare`)而不是依赖网络发现。
传输速度慢
- 在挂载选项中使用 `vers=3.0` 或 `vers=3.1.1` 强制使用 SMB3。
- 启用大 MTU:在 `[global]` 中添加 `socket options = TCP_NODELAY IPTOS_LOWDELAY SO_RCVBUF=131072 SO_SNDBUF=131072`。
- 检查 SMB 多通道是否可用:`smbstatus –verbose`。
日志和诊断
“`bash
sudo tail -f /var/log/samba/log.smbd
sudo smbstatus
sudo pdbedit -L -v # List all Samba users
“`
生产环境中的 Samba:架构注意事项
对于超出简单文件共享的生产部署,请考虑以下内容:
Active Directory 集成:Samba 4 可以作为完整的 Active Directory 域控制器运行,支持 LDAP、Kerberos、DNS 和组策略。这是超越独立文件共享的重要架构步骤,需要 `samba-ad-dc` 配置。
主目录共享:`smb.conf` 中的 `[homes]` 元服务自动为每个经过身份验证的用户创建个人共享,映射到其 Linux 主目录。这消除了为每个用户定义单独共享块的需要。
打印共享:Samba 与 CUPS 集成,通过网络共享打印机。`[printers]` 和 `[print$]` 共享定义处理此问题,尽管随着云打印服务的兴起,打印共享已变得不那么常见。
配额:Samba 遵守 Linux 文件系统配额。使用 `quota` 工具在文件系统级别实施配额,Samba 将透明地执行它们。
对于在文件共享旁边运行 Web 应用程序的团队,将 Samba 与带 cPanel 的 VPS 结合使用,可为您提供用于 Web 托管的托管控制面板,同时保留对 Samba 管理的完整 SSH 访问权限。对于需要在一个平台下运行多个托管服务的环境,查看可用的VPS 控制面板有助于为您的技术栈确定合适的管理层。
如果您的 Samba 服务器还托管 Web 内容或应用程序数据,为任何相关的面向 Web 的服务使用 SSL 证书进行保护,可确保整个技术栈符合现代安全标准。
技术关键要点检查清单
在认为您的 Samba 部署已准备好投入生产之前,请使用此检查清单:
- [ ] 通过 `[global]` 中的 `min protocol = SMB2` 明确禁用 SMB1
- [ ] 使用 `smbpasswd -a` 创建 Samba 用户并使用 `smbpasswd -e` 启用
- [ ] 服务账户使用 `-s /sbin/nologin` 阻止 shell 访问
- [ ] 共享目录使用 setgid 位(`chmod 2770`)以保持一致的组所有权
- [ ] `testparm` 运行干净,无警告或错误
- [ ] `smbd` 和 `nmbd` 均已启用并运行
- [ ] 防火墙规则将 SMB 端口(445、139、137-138)限制为仅受信任的源 IP
- [ ] 在 RHEL/CentOS/Fedora 系统上应用 SELinux 上下文(`samba_share_t`)
- [ ] CIFS 挂载的凭据文件为 `chmod 600` 且由 root 拥有
- [ ] `/etc/fstab` 条目对网络依赖挂载使用 `_netdev` 选项
- [ ] 初始部署后在 `/var/log/samba/` 处查看 Samba 日志
- [ ] `smbstatus` 在部署后确认活动会话和锁定文件
常见问题
Samba 使用哪些端口,是否所有端口都需要开放?
Samba 使用 TCP 445(直接 SMB,必需)、TCP 139(SMB over NetBIOS,旧版客户端需要)和 UDP 137-138(NetBIOS 名称解析,网络浏览需要)。对于使用直接 UNC 路径的 Windows 10/11 或 Linux 客户端的现代环境,严格来说只需要 TCP 445。如果不需要 NetBIOS 名称解析,可以阻止 UDP 137-138 和 TCP 139。
为什么我的 Samba 共享在 Linux 上可以访问,但从 Windows 返回”访问被拒绝”?
这几乎总是 Windows 端的凭据缓存问题。Windows 按会话缓存 SMB 凭据。打开凭据管理器(控制面板 > 凭据管理器 > Windows 凭据),删除服务器 IP 的所有缓存条目,然后重新连接。如果问题仍然存在,请使用 `sudo pdbedit -L -v` 验证用户是否在 Samba 数据库中启用。
smb.conf 中 `security = user` 和 `security = share` 有什么区别?
`security = share`(共享级安全)已弃用并在 Samba 4 中删除。`security = user`(用户级安全)是现代 Samba 中唯一支持的模式——每个连接都针对特定用户名和密码进行身份验证。访客访问通过 `guest ok` 和 `map to guest` 指令单独处理,而不是通过 `security` 参数。
Samba 可以与 NFS 在同一台服务器上共存吗?
可以。Samba 和 NFS 在完全不同的端口和协议上运行,在网络层面不会冲突。但是,同时通过两种协议共享同一目录可能会导致文件锁定冲突,特别是在写操作时。如果必须通过两种协议共享相同数据,请使用分布式锁管理器(DLM)或将一种协议限制为只读访问。
如何将多个用户添加到单个 Samba 共享?
使用 Linux 组。创建组(`groupadd teamshare`),将用户添加到其中(`usermod -aG teamshare user1`),设置共享目录的组所有权(`chown root:teamshare /srv/share`),并在 `smb.conf` 中使用 `valid users = @teamshare` 引用该组。这种方法可以干净地扩展——向共享添加用户只需要一个 `usermod` 命令和一个 `smbpasswd -a` 注册,无需更改 `smb.conf`。
