15%

全场主机优惠15%

测试技能,享折扣

使用代码:

Skills
开始使用
08.10.2024

如何在Linux上安装和配置Samba:完整技术指南

SambaSMB/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 需要开放以下端口:

端口协议服务用途
—————-——————
137UDPnmbdNetBIOS 名称服务
138UDPnmbdNetBIOS 数据报服务
139TCPsmbdNetBIOS 会话服务(SMB over NetBIOS)
445TCPsmbd直接 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 客户端上:

  1. 打开文件资源管理器
  2. 在地址栏中输入:`<server-ip>sambashare` 并按 Enter。
  3. 出现提示时,输入 Samba 用户名和密码。
  4. 要使连接持久化,右键单击共享并选择映射网络驱动器

对于脚本化或企业部署,从命令行映射驱动器:

“`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 版本年份主要特性安全性推荐用途
————-——————–———-—————–
SMB11983基本文件共享存在严重漏洞(EternalBlue)切勿使用——明确禁用
SMB22006流水线、减少冗余通信、签名有所改进旧版 Windows Vista/7 客户端
SMB2.12010客户端 oplock 租约有所改进Windows 7/2008 R2
SMB3.02012多通道、加密、故障转移Windows 8/2012 及更高版本
SMB3.1.12015预身份验证完整性、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`。

15%

全场主机优惠15%

测试技能,享折扣

使用代码:

Skills
开始使用