《UNIX/Linux系统管理技术手册-读书笔记-第二十二章

SMB

1. SMB概述

1.1 什么是SMB

概念 说明 能做什么
SMB(Server Message Block) 微软主导的文件共享协议,始于20世纪80年代 Windows与UNIX/Linux间共享文件、打印机
CIFS(Common Internet File System) SMB的营销版本(1996年),现已弃用 历史遗留术语,实际仍是SMB
SMB版本演进 SMB 1.0 → SMB 2.0(2006)→ SMB 3.0(2012) 性能、安全性持续改进

1.2 Samba

概念 说明
Samba 在UNIX/Linux上实现SMB服务端的开源软件包(GPL)
作者 Andrew Tridgell(1992年逆向工程)
版本 本章聚焦Samba 4
功能范围 文件共享、打印共享、认证/授权、名称解析、服务宣告、AD域控制器(基础)

1.3 SMB vs NFS

对比 SMB NFS
位置 用户空间(守护进程) 内核(线程)
进程模型 每用户一个进程 多线程共享
访问控制 依赖OS权限 + 自身ACL 依赖OS权限
挂载方 通常个人用户 通常系统管理员
适用场景 混合环境(含Windows) UNIX/Linux纯环境
性能 优秀 最佳(内核级)

2. Samba安装与配置

2.1 安装

系统 软件包
Debian/Ubuntu samba-common
RHEL/CentOS samba
FreeBSD pkg install samba44

配置文件位置

  • Linux:/etc/samba/smb.conf
  • FreeBSD:/usr/local/etc/smb4.conf

2.2 两种认证方式

认证方式 适用场景 密码管理
本地认证security = user 小型环境,无集中目录 单独维护SMB密码(smbpasswd
AD集成认证security = ads 企业环境,有Active Directory 通过AD/Kerberos集中认证

本地认证配置smb.conf):

[global]
workgroup = ulsh
security = user
netbios name = freebsd-book

设置SMB密码

1
2
sudo smbpasswd -a tobi     # 添加用户并设置密码
smbpasswd                  # 当前用户修改自己的SMB密码

SMB密码与UNIX密码分开管理,用户需单独设置。此方法在现代企业环境中已显过时。

AD集成认证配置smb.conf):

[global]
workgroup = ulsah
realm = ulsah.example.com
security = ads
dedicated keytab file = FILE:/etc/samba/samba.keytab
kerberos method = dedicated keytab

2.3 配置共享

基本共享([sharename]节)

[bookshare]
path = /storage/bookshare
read only = no

Windows客户端访问\\sambaserver\bookshare

神奇共享[homes] —— 自动将用户主目录导出为SMB共享:

[homes]
comment = Home Directories
browseable = no
valid users = %S          # %S扩展为当前用户名
read only = no

用户janderson可通过\\sambaserver\janderson访问自己的主目录。

项目组共享示例

[eng]
comment = Group Share for engineering
valid users = eng         # 仅eng组成员可访问
path = /home/eng
nt acl support = no       # 禁用NT ACL(用UNIX权限)
create mask = 0660
directory mask = 2770     # 包含setgid位
force directory mode = 2000
force group = eng
browseable = no
read only = no
guest ok = no

💡 通过setgid权限位和force group确保共享中新建文件归eng组所有。

3. 客户端挂载SMB共享

3.1 挂载命令

系统 命令
Linux sudo mount -t cifs -o username=joe //redmond/joes /home/joe/mnt
FreeBSD sudo mount -t smbfs //joe@redmond/joes /home/joe/mnt

3.2 关键特性与限制

特性 说明
用户级挂载 SMB卷由特定用户挂载,而非系统级
所有权问题 挂载后所有文件显示为挂载用户所有
多用户限制 Windows服务器通常不支持多用户同时访问同一挂载
调优选项 uidgidfmaskdmask可调整文件权限映射

3.3 smbclient(无需挂载即可访问)

1
2
3
4
5
6
7
8
# 列出共享
smbclient -L //hoarder -U dan

# 交互式访问(类似FTP)
smbclient //hoarder/Docs -U dan
> help          # 查看可用命令
> get file      # 下载文件
> put file      # 上传文件

4. 安全配置

安全措施 说明
hosts allow 限制允许访问的IP地址/范围
hosts deny 拒绝指定主机(优先于allow
防火墙 阻止外部访问SMB端口
SMB端口 UDP 137-139、TCP 137/139/445
数据传输 Samba仅加密密码,数据明文传输 → 需VPN或内部可信网络

生产建议:SMB不应暴露在Internet上,必须在防火墙层阻断。数据明文传输问题可通过SMB 3.0加密或VPN解决。

5. 调试

5.1 smbstatus —— 查看活动连接和锁

1
sudo smbstatus

输出三部分:

  1. 连接列表:PID、用户名、客户端IP
  2. 已挂载共享:Service、连接时间
  3. 文件锁:锁定文件详情(排查锁定问题的关键

💡 当Windows提示“文件被锁定”时,先在客户端关闭违规应用,而非在服务器端暴力破解锁。

5.2 日志配置

[global]
log file = /var/log/samba.log.%m    # %m = 客户端主机名
max log size = 10000                # 10MB后轮替
syslog = 7                          # 发送到syslog的最低级别
syslog only = no

日志级别调整(运行时)

1
2
sudo smbcontrol smbd debug "4 auth:10"    # 全局级别4,认证级别10
sudo smbcontrol <PID> debug "5"           # 仅特定守护进程

常见日志错误

  • NT_STATUS_WRONG_PASSWORD:密码错误
  • NT_STATUS_LOGON_FAILURE:登录失败(密码/域/账户问题)
  • NT_STATUS_ACCESS_DENIED:权限不足

5.3 字符集管理

Samba 3.0+默认使用UTF-8文件名编码。若服务器使用ISO 8859 locale,需配置:

unix charset = ISO8859-15
display charset = ISO8859-15

6. 本章核心命令速查表

命令 功能
sudo smbpasswd -a user 添加SMB用户(本地认证)
smbpasswd 当前用户修改SMB密码
sudo mount -t cifs -o username=user //server/share /mnt 挂载SMB共享(Linux)
sudo mount -t smbfs //user@server/share /mnt 挂载SMB共享(FreeBSD)
smbclient -L //server -U user 列出服务器共享
smbclient //server/share -U user 交互式访问共享(类FTP)
sudo smbstatus 查看活动连接和文件锁
sudo smbcontrol smbd debug "4" 运行时调整调试级别
testparm -v 列出所有Samba配置选项及当前值
/etc/samba/smb.conf Samba主配置文件(Linux)
/usr/local/etc/smb4.conf Samba主配置文件(FreeBSD)

DBA视角补充

  • 备份传输:SMB可用于将数据库备份文件传送到Windows存储服务器。注意数据明文传输问题,建议使用SMB 3.0加密或VPN隧道。
  • 跨平台报表:数据库生成的报表(PDF/Excel)可通过SMB共享直接供Windows用户访问,无需额外传输工具。
  • 与NFS对比选型:纯UNIX/Linux环境(含数据库集群)优选NFS;含Windows客户端或存储服务器时,SMB是必要选择。
  • AD集成:若企业已部署Active Directory,Samba可加入AD域(security = ads),实现数据库服务器与Windows环境统一认证,简化权限管理。
  • 性能考量:Samba运行于用户空间,性能略低于内核级NFS。大数据量传输场景下,需评估网络带宽和延迟,必要时使用专用存储网络。
  • 文件锁定:数据库文件(如.mdf.ibd)通过SMB共享时需特别注意锁行为,不建议将生产数据库文件直接存放在SMB共享上,除非使用支持SMB 3.0集群的SQL Server等明确支持的场景。