3.9.3 SMB/CIFS共享与Samba部署

SMB/CIFS 是面向文件共享的网络协议,主要用于 Windows 与 Linux 跨平台共享。在 Linux 上通过 Samba 提供 SMB/CIFS 服务,实现共享目录、用户鉴权、访问控制与审计。典型场景包括部门文件共享、应用共享配置与跨系统文件交换。

原理与架构草图:

文章图片

核心组件与端口:
- smbd:文件与打印共享服务,监听 TCP 445/139。
- nmbd:名称解析与浏览(旧版环境使用)。
- winbindd:与 AD/域集成的身份映射。

安装与基础部署(以 Rocky/Ubuntu 为例,任选其一):

# Rocky/Alma/CentOS
sudo dnf -y install samba samba-client

# Ubuntu/Debian
sudo apt -y install samba smbclient cifs-utils

创建共享目录并设置权限:

sudo mkdir -p /srv/samba/public
sudo chmod 2775 /srv/samba/public
sudo chown -R root:sambashare /srv/samba/public
# 说明:2775 保持目录继承组;确保组有写权限

编辑配置文件 /etc/samba/smb.conf(完整示例):

[global]
   workgroup = WORKGROUP
   server string = Samba Server
   security = user
   map to guest = never
   log file = /var/log/samba/%m.log
   log level = 1
   server min protocol = SMB2
   server max protocol = SMB3
   unix charset = UTF-8
   dos charset = CP936

[public]
   path = /srv/samba/public
   browseable = yes
   read only = no
   valid users = @sambashare
   create mask = 0664
   directory mask = 2775
   force group = sambashare

创建系统用户与 Samba 账户:

sudo groupadd sambashare
sudo useradd -m -G sambashare alice
sudo passwd alice
sudo smbpasswd -a alice
sudo smbpasswd -e alice
# 说明:smbpasswd -a 添加 Samba 账户;-e 启用

启动服务与开机自启:

sudo systemctl enable --now smb
sudo systemctl status smb

客户端访问与挂载示例:

# 查看共享
smbclient -L //192.168.10.10 -U alice

# 交互式访问
smbclient //192.168.10.10/public -U alice
# 进入后可执行: ls, put file, get file

# Linux 挂载
sudo mkdir -p /mnt/public
sudo tee /etc/samba/creds_public <<'EOF'
username=alice
password=StrongPassw0rd
EOF
sudo chmod 600 /etc/samba/creds_public

sudo mount -t cifs //192.168.10.10/public /mnt/public \
  -o credentials=/etc/samba/creds_public,iocharset=utf8,uid=1000,gid=1000,file_mode=0664,dir_mode=2775

/etc/fstab 持久化挂载示例:

//192.168.10.10/public /mnt/public cifs credentials=/etc/samba/creds_public,iocharset=utf8,uid=1000,gid=1000,file_mode=0664,dir_mode=2775,_netdev 0 0

权限与 ACL 示例(解决“共享允许但系统拒绝”):

# 赋予用户对共享目录读写
sudo setfacl -m u:alice:rwx /srv/samba/public
sudo getfacl /srv/samba/public

常用命令解释与排错步骤:

# 校验配置语法
testparm
# 预期:显示解析后的配置,无错误信息

# 检查端口监听
ss -lntp | grep -E '445|139'
# 预期:smbd 监听 0.0.0.0:445

# 查看共享列表
smbclient -L //192.168.10.10 -U alice
# 预期:列出 [public] 等共享

# 检查日志
tail -f /var/log/samba/*.log

常见故障与处理:
1) 客户端挂载失败(NT_STATUS_LOGON_FAILURE)
- 检查 smbpasswd 是否添加并启用用户
- 凭据文件权限应为 600

sudo smbpasswd -x alice   # 删除
sudo smbpasswd -a alice   # 重新添加
sudo smbpasswd -e alice

2) 访问被拒绝(Permission denied)
- 检查目录权限与 ACL
- 检查 valid users / force group 设置

namei -l /srv/samba/public
getfacl /srv/samba/public

3) 协议版本不兼容
- 客户端指定 vers=3.0 或 2.1

sudo mount -t cifs //192.168.10.10/public /mnt/public \
  -o credentials=/etc/samba/creds_public,vers=3.0

4) SELinux 拦截(RHEL 系)

sudo getenforce
sudo setsebool -P samba_enable_home_dirs on
sudo chcon -t samba_share_t /srv/samba/public -R

性能与安全要点:
- 关闭匿名写入(guest ok = no)
- 限制来源网段(hosts allow = 192.168.10.0/24)
- 记录审计日志(log level=1~3)
- 大规模环境建议域控集成(winbind)

练习与实践:
1) 创建两个用户(alice/bob),验证 valid users 仅允许 alice 写入,bob 只读。
2) 设置不同子目录 ACL,验证“共享允许但子目录拒绝”的排错流程。
3) 配置客户端 fstab 持久挂载,模拟网络断开后重连测试。
4) 修改 server min/max protocol,验证 Windows/旧客户端兼容性变化。