Ubuntu 20.04 Server / Samba / 安装并创建共享文件夹

在 Ubuntu 20.04 Server 安装 Samba,配置共享、用户和文件权限后,即可通过 Windows 文件资源管理器读写文件。本例采用独立文件服务器,只允许专用组内的 Samba 认证用户访问,不使用免密码访客共享。

确认范围并安装 Samba

Samba 使用 SMB(Server Message Block,服务器消息块)协议向 Windows 等系统共享 Linux 文件。本文基于本地账户创建一个共享,不是 Active Directory 域控制器或域成员服务器。不要用此示例覆盖现有域环境的 [global] 设置。

需要 sudo 权限和足够空间,Windows 还必须能访问服务器私有 IP 或正确解析的主机名。示例服务器为 192.168.10.20,允许的内部网络为 192.168.10.0/24,请按实际环境替换。Ubuntu 20.04 标准支持已于 2025 年结束,应通过 Canonical 的 Ubuntu 20.04 支持说明确认安全维护覆盖。

在服务器安装软件包并检查版本。smbclient 是测试共享的客户端工具。安装基础见 Ubuntu Samba 文件服务器文档。

sudo apt update
sudo apt install samba smbclient
smbd --version
systemctl status smbd.service

现有服务器应先调查共享和用户,再备份 /etc/samba/smb.conf。备份名已存在时换一个名称。本例假设使用新建空目录,不对现有数据批量修改所有权和权限。

sudo cp -a /etc/samba/smb.conf /etc/samba/smb.conf.before-team-share
sudo testparm -s

创建用户、组与共享目录

  1. 确认示例账户 smbuser 和组 smbteam 是否已存在。存在时,检查用途和成员后再复用,或另选名称,并同步修改后面的所有设置。
getent passwd smbuser
getent group smbteam
  1. 两个名称都不存在的新环境中,创建组和文件共享专用账户,再登记 Samba 密码。最后一个命令设置的密码用于 Windows 连接。
sudo groupadd smbteam
sudo useradd -M -s /usr/sbin/nologin -G smbteam smbuser
sudo smbpasswd -a smbuser

此共享账户不创建主目录,也不提供交互登录 shell。Linux 的 passwd 与 Samba 的 smbpasswd 分别管理不同认证信息。使用已有 Linux 账户时,不要重复创建;用 sudo usermod -aG smbteam USERNAME 加组,再把相同名称登记到 Samba。条件见 Ubuntu 20.04 smbpasswd 手册。

  1. 创建新的共享目录。该命令设置路径的所有者、组和模式;如果目录已有数据,请先调查现有权限,再单独实施。
sudo install -d -o root -g smbteam -m 2770 /srv/samba/team
ls -ld /srv/samba/team
id smbuser

2770 赋予所有者和组读、写、目录进入权限,禁止其他用户访问。开头的 2 是用于组继承的 setgid 位。确认所属组为 smbteam,且 smbuser 是成员。Linux 权限和 Samba 策略都必须允许,不应靠 chmod 777 解决。

配置仅认证用户可用的共享

用 sudoedit /etc/samba/smb.conf 打开文件,在保留现有配置的前提下添加以下段。若已有 [Team],检查该段,不要重复添加。共享名 Team 与磁盘路径是不同的值。

[Team]
    path = /srv/samba/team
    browseable = yes
    read only = no
    guest ok = no
    valid users = @smbteam
    force group = smbteam
    create mask = 0660
    force create mode = 0660
    directory mask = 2770
    force directory mode = 2770

guest ok = no 禁止访客;valid users = @smbteam 允许该组的认证用户。read only = no 仅在 Samba 层允许写入,不会绕过 Linux 权限。force group 统一共享操作使用的组。

mask 限制新建项目的权限范围,force mode 补充组协作所需权限位。本例新文件目标为 0660、新目录为 2770,不会追溯修改已有文件。另有 ACL(Access Control List,访问控制列表)或权限模块时,应同时检查。参数说明见 Ubuntu 20.04 smb.conf 手册。

检查配置、应用服务并核实防火墙

  1. 检查配置文件。有错误时先修正,不要应用。testparm 成功表示配置可加载,不保证认证和实际文件操作成功。
sudo testparm -s

核对输出中的 [Team]、路径及访问限制。testparm 手册也要求单独验证实际服务。重启可能断开已有共享连接,应先确认使用者并安排维护窗口。

  1. 检查成功后应用服务,并检查运行及开机启动状态。
sudo systemctl enable --now smbd.service
sudo systemctl restart smbd.service
systemctl is-active smbd.service
systemctl is-enabled smbd.service
sudo ss -ltnp | grep ':445'
  1. 防火墙已启用时,仅允许所需内部网络访问 TCP 445。先替换示例网段并确定范围,再检查是否与已有规则冲突。
sudo ufw status verbose
sudo ufw allow from 192.168.10.0/24 to any port 445 proto tcp

新增规则不会自动启用已停用的 UFW。不要未检查远程管理规则就执行 ufw enable。另行检查路由器和云安全规则,不要把 SMB 直接端口转发到互联网。本文按地址连接,无须批量开放旧 NetBIOS 发现端口。语法见 UFW 手册。

在服务器本机测试认证与目录列表。密码应在提示符中输入,不要写进命令。确认 Team 和目录内容后,再单独测试 Windows。用法见 smbclient 手册。

smbclient -L 127.0.0.1 -U smbuser
smbclient //127.0.0.1/Team -U smbuser -c 'ls'

从 Windows 连接并测试文件操作

  1. 打开文件资源管理器,在地址栏输入以下路径。将 192.168.10.20 替换为实际地址。服务器未自动出现在网络列表时,也可按路径直接连接。
\\192.168.10.20\Team
  1. 在凭据窗口输入 smbuser 和通过 smbpasswd -a 登记的密码,不要与 Windows 账户或 PIN 混淆。若自动选择了其他账户,请选择使用另一账户并指定服务器 Samba 用户。
  2. 创建测试文件夹和文件,修改内容后重新打开。删除测试文件,并确认其他获准用户也能修改需要协作的文件。不要用重要现有文件测试。

增加用户时,为每人准备 Linux 账户和 Samba 凭据,再加入 smbteam。使用个人账户,不共用一个密码。组或权限变化后,清理旧连接并用新 SMB 会话测试。

经常使用时,在资源管理器的此电脑 → 映射网络驱动器中选择盘符,把 \\192.168.10.20\Team 设为文件夹;必要时选择其他凭据。各版本菜单位置见 Microsoft 网络驱动器映射说明。

Windows 访客限制或 SMB 签名要求可能拒绝旧匿名共享。本例采用认证访问,不以安装 SMB1、启用不安全访客或关闭签名作为解决办法。组织若限制 NTLM 等认证,需要符合域及服务器策略的配置。版本与版本类别条件见 Microsoft SMB 签名文档。

排查连接错误与取消共享

先在 Windows PowerShell 测试 TCP 445。TcpTestSucceeded 为 True 不代表凭据和文件权限已通过验证;为 False 时先检查地址、路由、防火墙和监听服务。选项见 Microsoft Test-NetConnection 文档。

Test-NetConnection -ComputerName 192.168.10.20 -Port 445

密码被拒时,检查 Samba 注册、用户名和组限制。登录成功却不能写入时,用 namei -l /srv/samba/team、ls -ld /srv/samba/team、id smbuser 检查父路径进入权限与所属组,同时核对 Samba 只读策略。日志见 sudo journalctl -u smbd.service -n 50 --no-pager 和 /var/log/samba/。

Windows 持续使用旧凭据时,用 net use 查看连接。关闭打开的文件后,仅按下例断开有问题的共享,再连接。同一服务器的其他共享及凭据管理器也可能保留凭据,应一并检查。不要批量删除无关网络驱动器。

net use \\192.168.10.20\Team /delete

停用共享时,仅移除或还原 smb.conf 的本次 [Team] 段,用 testparm -s 验证,并在维护窗口重启 smbd.service。新增 UFW 规则若不再需要,只按相同条件删除该规则。检查残留连接;共享数据和 Linux 账户应另行保留。

sudo ufw delete allow from 192.168.10.0/24 to any port 445 proto tcp

还原整个配置备份前,先比较备份后其他共享是否发生变化。仅停用账户可使用 sudo smbpasswd -d smbuser,但不要假定已有会话立即终止。分别确认新连接被拒及残留会话。