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 的权限检查分三层,任何一层拒绝都会导致操作失败:
- Samba 连接检查:用户能否访问该共享?由
valid users、invalid users等控制。 - Samba 写入检查:该共享是否为只读?用户是否在
write list中? - 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 依赖以下端口:
| 端口 | 协议 | 用途 |
|---|---|---|
| 137 | UDP | NetBIOS 名称服务 |
| 138 | UDP | NetBIOS 数据报服务 |
| 139 | TCP | NetBIOS 会话服务 |
| 445 | TCP | SMB 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 name | NetBIOS 名称 | netbios name = smbserver |
server string | 服务器描述 | server string = Samba Server |
security | 安全模式,独立服务器用 user | security = 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 | 禁用 NetBIOS | disable 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
十一、安全建议
- IP 白名单:在
[global]段中设置hosts allow和hosts deny = ALL,将访问限制在局域网内。 - 绑定接口:使用
interfaces和bind interfaces only = yes让 Samba 只监听内网接口。注意interfaces中务必包含lo,否则本机自身可能无法访问。 - 禁用匿名:不需要匿名访问时,在共享段中设置
guest ok = no,并通过valid users限制访问用户。 - 最小权限原则:共享目录的 Linux 权限尽量收紧,优先使用
force group和inherit permissions实现精细控制。
这份指南覆盖了 Ubuntu 上 Samba 从安装到常用配置的主要环节。实际部署时,建议先从一个简单的匿名共享开始验证连通性,再逐步叠加用户认证、权限控制和 IP 限制。