跳至正文
老丹的足迹 —— 代码写给机器,游记写给自己,感悟写给时间
老丹的足迹 老丹的足迹
老丹的足迹 老丹的足迹
  • 首页
  • 示例页面
  • 首页
  • 示例页面
老丹的足迹 老丹的足迹
老丹的足迹 老丹的足迹
  • 首页
  • 示例页面
  • 首页
  • 示例页面

Ubuntu Samba 服务安装与配置完全指南

Samba 是 Linux 与 Windows 之间共享文件和打印机的标准方案,通过实现 SMB/CIFS 协议,让 Ubuntu 可以作为文件服务器被 Windows、macOS 和其他 Linux 设备直接访问。本文覆盖从安装到常用配置的完整流程。

一、安装 Samba

首先更新软件包索引并安装 Samba 服务端和客户端工具:

sudo apt update
sudo apt install samba smbclient

samba 包提供 smbd 和 nmbd 等核心守护进程,smbclient 是命令行客户端,便于后续测试连接。

安装后验证服务状态和版本:

sudo systemctl status smbd
smbd --version

Ubuntu 较新版本(如 26.04)默认配置中包含 disable netbios = yes,因此 nmbd 服务可能不需要启动,smbd 在安装后会自动启用。

二、理解 smb.conf 的配置文件结构

Samba 的主配置文件位于 /etc/samba/smb.conf。文件由多个 段(Section) 组成,每个段以方括号中的段名开头,直到下一个段名结束。

  • [global]:全局设置段,其中的选项作为其他共享段的默认值。
  • [homes]:特殊段,自动将用户的主目录作为共享,用户连接时以用户名作为共享名访问自己的家目录。
  • [printers]:打印机共享段。
  • 自定义共享段:如 [share],每定义一个段就创建一个共享资源。

配置文件中的选项格式为 选项名 = 选项值。以 # 或 ; 开头的行是注释。逻辑值可以用 yes/no、1/0 或 true/false 表示,不区分大小写。

修改配置后,务必用 testparm 验证语法:

sudo testparm

三、配置匿名共享(公共目录)

匿名共享适合家庭或测试环境,客户端无需密码即可访问。

1. 创建共享目录并设置 Linux 权限

推荐遵循 FHS 标准,将共享数据放在 /srv 下:

sudo mkdir -p /srv/samba/public
sudo chmod 0777 /srv/samba/public

0777 允许所有用户读写执行,适合公共共享场景。

2. 编辑 smb.conf 添加共享段

用 sudo nano /etc/samba/smb.conf 打开配置文件,在末尾添加:

[public]
   comment = Public Share
   path = /srv/samba/public
   browsable = yes
   guest ok = yes
   read only = no
   create mask = 0775
   directory mask = 0775

关键参数含义:

  • comment:共享的描述信息。
  • path:共享目录的绝对路径。
  • browsable:是否允许 Windows 网络邻居浏览到该共享。
  • guest ok:设为 yes 时允许匿名访问,无需密码。
  • read only:设为 no 允许写入,设为 yes 则只读。
  • create mask:新建文件的默认权限掩码。
  • directory mask:新建目录的默认权限掩码。

3. 重启服务

sudo systemctl restart smbd

四、配置需要身份验证的共享

生产环境应使用用户认证。Samba 有独立的密码数据库,Linux 系统用户不会自动成为 Samba 用户。

1. 创建系统用户

如果还没有系统用户,先创建一个。对于仅用于 Samba 的用户,可以禁用 Shell 登录:

sudo adduser --shell /usr/sbin/nologin smbuser

2. 添加到 Samba 数据库并设置密码

sudo smbpasswd -a smbuser

系统会提示输入两次 SMB 密码。注意:默认的 passdb 后端要求该用户必须已存在于系统口令文件中,否则操作会失败。

smbpasswd 常用管理命令:

命令作用
smbpasswd -a <用户>添加 Samba 用户并设置密码
smbpasswd -x <用户>删除 Samba 用户
smbpasswd -d <用户>禁用 Samba 用户
smbpasswd -e <用户>启用 Samba 用户

3. 配置共享段

[private]
   comment = Private Share
   path = /srv/samba/private
   browsable = yes
   guest ok = no
   read only = no
   valid users = smbuser
   create mask = 0660
   directory mask = 0770
  • valid users:指定允许访问该共享的用户或用户组(@组名)。
  • guest ok = no:禁用匿名访问。

4. 设置目录权限

sudo mkdir -p /srv/samba/private
sudo chown smbuser:smbuser /srv/samba/private
sudo chmod 0770 /srv/samba/private

五、Samba 权限模型详解

Samba 的权限检查分三层,任何一层拒绝都会导致操作失败:

  1. Samba 连接检查:用户能否访问该共享?由 valid users、invalid users 等控制。
  2. Samba 写入检查:该共享是否为只读?用户是否在 write list 中?
  3. Linux 文件系统检查:用户的 Linux UID/GID 对实际文件是否有权限?

重要:在 smb.conf 中设置 read only = no 但如果 Linux 目录权限是 755 且属主为 root,用户仍然无法写入。

常用权限参数对照:

参数作用
valid users允许访问的用户/组
invalid users明确拒绝的用户/组(优先级高于 valid users)
write list在只读共享中拥有写权限的用户/组
read list只读共享中的只读用户
force group强制新建文件属于指定组
force user强制以指定用户身份执行操作
inherit permissions新文件/目录继承父目录权限
hosts allow允许访问的 IP 或网段
hosts deny拒绝访问的 IP 或网段

示例:部门共享(仅组内成员可读写)

[Department]
   comment = Department Files
   path = /srv/samba/department
   valid users = @finance
   write list = @finance
   guest ok = no
   read only = no
   create mask = 0660
   directory mask = 0770
   force group = finance
   inherit permissions = yes

对应的 Linux 目录设置:

sudo mkdir -p /srv/samba/department
sudo chown root:finance /srv/samba/department
sudo chmod 2770 /srv/samba/department
sudo chmod g+s /srv/samba/department

2770 中的 2 是 setgid 位,确保新创建的文件自动继承 finance 组。

六、限制访问 IP(局域网限定)

在 [global] 段或具体共享段中添加:

[global]
   hosts allow = 127.0.0.1 192.168.1.0/24
   hosts deny = ALL

hosts deny = ALL 是明确的“默认拒绝”策略,hosts allow 中列出的地址才是白名单。也可以使用 EXCEPT 排除特定地址,例如 hosts allow = 192.168.1.0/24 EXCEPT 192.168.1.99。

七、防火墙配置

UFW 默认会阻止 Samba 的通信端口。Samba 依赖以下端口:

端口协议用途
137UDPNetBIOS 名称服务
138UDPNetBIOS 数据报服务
139TCPNetBIOS 会话服务
445TCPSMB over TCP(现代客户端主要使用)

最简单的放行方式:

sudo ufw allow samba

也可以显式指定端口:

sudo ufw allow 137/udp
sudo ufw allow 138/udp
sudo ufw allow 139/tcp
sudo ufw allow 445/tcp

如果只允许特定局域网网段访问:

sudo ufw allow from 192.168.1.0/24 to any port 445
sudo ufw allow from 192.168.1.0/24 to any port 139

八、客户端访问方式

Windows:在文件资源管理器地址栏输入 \\服务器IP地址(如 \\192.168.1.100),回车后按提示输入 Samba 用户名和密码。

Linux 命令行测试:

smbclient //192.168.1.100/public -U%
smbclient //192.168.1.100/private -U smbuser

-U% 表示匿名连接,-U smbuser 会提示输入密码。

Linux 挂载共享:

sudo mkdir -p /mnt/samba
sudo mount -t cifs //192.168.1.100/private /mnt/samba -o username=smbuser,vers=2.0

vers=2.0 指定 SMB 协议版本,可根据服务器兼容性调整。

九、常用全局参数速查

以下参数写在 [global] 段中:

参数说明示例
workgroup工作组名称,需与 Windows 端一致workgroup = WORKGROUP
netbios nameNetBIOS 名称netbios name = smbserver
server string服务器描述server string = Samba Server
security安全模式,独立服务器用 usersecurity = user
passdb backend密码后端passdb backend = tdbsam
log file日志文件路径,%m 代表客户端主机名log file = /var/log/samba/log.%m
log level日志级别(0-10)log level = 1
max connections最大连接数,0 为不限制max connections = 0
interfaces监听的接口interfaces = lo eth0
bind interfaces only仅绑定指定接口bind interfaces only = yes
disable netbios禁用 NetBIOSdisable netbios = yes

关于日志级别:排查问题时可将 log level 临时设为 3 或更高,获取详细日志;正常运行时建议保持较低级别,避免磁盘被日志快速占满。

十、故障排查

1. 检查服务状态

sudo systemctl status smbd
sudo systemctl status nmbd

2. 验证配置文件语法

sudo testparm

testparm 会检查参数和值是否有效,每次修改配置后都应运行。

3. 查看日志

journalctl -u smbd --no-pager -n 50

传统日志文件位于 /var/log/samba/,包括 log.smbd、log.nmbd 等。

4. 常见问题对照

现象可能原因排查方向
无法访问共享服务未运行或防火墙拦截检查 smbd 状态,确认 UFW 放行 139/445
权限错误(能连不能写)Linux 文件系统权限不足检查目录的 ls -l 权限和属主
身份验证失败Samba 用户未创建或密码错误确认 smbpasswd -a 已执行
Windows 看不到共享网络发现未启用直接通过 \\IP地址 访问
配置不生效未重载或语法错误运行 testparm,重启 smbd

5. 重载配置

修改配置后,不必重启整个服务,可以只重载配置:

sudo smbcontrol smbd reload-config

或直接重启:

sudo systemctl restart smbd

十一、安全建议

  1. IP 白名单:在 [global] 段中设置 hosts allow 和 hosts deny = ALL,将访问限制在局域网内。
  2. 绑定接口:使用 interfaces 和 bind interfaces only = yes 让 Samba 只监听内网接口。注意 interfaces 中务必包含 lo,否则本机自身可能无法访问。
  3. 禁用匿名:不需要匿名访问时,在共享段中设置 guest ok = no,并通过 valid users 限制访问用户。
  4. 最小权限原则:共享目录的 Linux 权限尽量收紧,优先使用 force group 和 inherit permissions 实现精细控制。

这份指南覆盖了 Ubuntu 上 Samba 从安装到常用配置的主要环节。实际部署时,建议先从一个简单的匿名共享开始验证连通性,再逐步叠加用户认证、权限控制和 IP 限制。

作者

老丹

关注我
其他文章
上一个

从零开始:用 Docker 部署 Jellyfin 并启用英特尔核显硬件加速

下一个

SSCG:让自签名证书不再“危险”的生成工具

关于博主

    老丹是一名C/C++后台开发工程师,信奉“无抽象不设计,无性能不生产”。

  • 技术栈:Modern C++、Linux环境编程、多线程/并发、网络编程等。
  • 信条:能用constexpr解决的问题绝不拖到运行时,能靠RAII避免的泄漏绝不写析构。
  • 正在填坑:从解封装到渲染的C++全链路实现,正在驯服FFmpeg与H.264/H.265。
  • 输出原则:这里的每一段代码都经过-Wall -Wextra -Werror -O2的洗礼。

近期文章

  • Ubuntu 防火墙迁移指南:从 UFW 到 firewalld 的完整实践 2026年9月12日
  • Nano 编辑器完全操作指南:从入门到熟练 2026年9月12日
  • SSCG:让自签名证书不再“危险”的生成工具 2026年9月12日
  • Ubuntu Samba 服务安装与配置完全指南 2026年9月12日
  • 从零开始:用 Docker 部署 Jellyfin 并启用英特尔核显硬件加速 2026年9月11日

文章分类

  • C/C++开发 (22)
  • Docker容器 (5)
  • Linux工具包 (17)
  • Linux服务配置 (50)
  • Linux系统 (16)
  • OpenWrt路由 (3)
  • Shell脚本 (3)
  • 代码管理 (1)
  • 安防技术 (4)
  • 数据安全 (36)
  • 未分类 (1)
  • 网络协议 (25)
  • 计算机理论 (23)
  • 音视频技术 (5)
联系我们:📍 地址:中国·广东省深圳市   |   ✉️ 邮箱:support@tanglinux.com   |   💬 QQ:870866607
版权所有:老丹的足迹粤ICP备2026061170号-1       公安备案图标 粤公网安备44030002013274号