集群架构 - CIFS文件共享服务

1. Samba基本概述

1.1 SMB协议简介

Server Message Block (SMB) 是Windows服务器和客户端之间实现文件共享的服务协议。

Samba服务通常用来做跨系统文件共享服务,实现不同操作系统之间的资源共享。

1.2 Samba相关功能

Samba服务提供以下主要功能:

  1. 用户验证: 支持多种用户认证方式
  2. 文件共享: 实现跨平台文件共享
  3. 打印共享: 共享打印机资源
  4. 域名解析: 提供NetBIOS名称解析

1.3 Samba软件包

软件包 说明 用途
samba samba服务端共享程序 提供Samba服务器功能
samba-common samba服务配置文件语法检验 提供testparm等工具
cifs-utils samba客户端软件 提供所需工具指令集

1.4 Samba主要程序

服务端程序:

  • smbd: SMB守护进程,处理文件共享和打印服务
  • nmbd: NetBIOS名称服务器,提供名称解析服务

客户端工具:

  • smbclient: SMB客户端工具
  • mount.cifs: 挂载CIFS文件系统

管理工具:

  • pdbedit: 管理Samba用户数据库
  • testparm: 测试Samba配置文件语法
  • smbpasswd: 管理Samba用户密码

2. Samba服务配置

2.1 实践环境准备

环境说明:

  • Samba服务器: 192.168.56.11
  • 客户端: Windows和Linux系统

2.2 安装Samba服务程序

1
2
3
4
5
6
7
8
# 停止防火墙
[root@xuliangwei ~]# systemctl stop firewalld

# 关闭SELinux
[root@xuliangwei ~]# setenforce 0

# 安装Samba服务
[root@xuliangwei ~]# yum -y install samba

2.3 Samba主配置文件

Samba主配置文件默认存放于/etc/samba/smb.conf

查看配置文件

1
2
# 筛选Samba注释配置文件
[root@xuliangwei ~]# egrep -v '^#|^$' /etc/samba/smb.conf

全局参数配置

1
2
3
4
5
6
7
8
9
10
11
12
[global]                    //全局参数
workgroup = SAMBA //工作组名称
hosts allow = 192.168.56. //表示允许IP或网段, 允许使用通配符或主机名
interfaces = eth0 //SambaServer监听网卡, 也可以写IP地址
max connections = 0 //最大连接数目, 超出拒绝, 0表示不限制
max log size = 50 //定义日志文件的最大容量为50KB
security = user //安全验证方式,总共有4种
passdb backend = tdbsam //定义用户密码的类型,共有3种
printing = cups //设置Samba共享打印机的类型
printcap name = cups //设置共享打印机的配置文件
load printers = yes //设置在Samba服务启动时是否共享打印机设备
cups options = raw //打印机的选项

全局参数详细说明

workgroup: 工作组名称

  • 默认值: SAMBA
  • 说明: 设置Samba服务器所属的工作组

hosts allow: 允许访问的主机

  • 格式: IP地址或网段
  • 示例: 192.168.56.192.168.56.0/24
  • 说明: 允许使用通配符或主机名

interfaces: 监听网卡

  • 格式: 网卡名称或IP地址
  • 示例: eth0192.168.56.11
  • 说明: SambaServer监听网卡

max connections: 最大连接数

  • 默认值: 0(不限制)
  • 说明: 超出连接数将拒绝新连接

max log size: 日志文件最大容量

  • 默认值: 50(KB)
  • 说明: 定义日志文件的最大容量

security: 安全验证方式

验证方式 说明 安全性
share 无需验证身份 简单方便,安全性差
user 需要验证用户密码才可访问 安全性高
server 需要通过三方服务验证账号密码 集中管理账户
domain 使用域控制器进行身份验证 企业级方案

passdb backend: 用户密码类型

类型 说明 管理工具
smbpasswd 为系统用户设置Samba服务程序的密码 smbpasswd
tdbsam 创建数据库文件并使用pdbedit命令建立Samba服务程序的用户 pdbedit
ldapsam 基于LDAP服务进行账户验证 LDAP服务

printing: 共享打印机类型

  • 可选值: bsd, sysv, plp, lprng, aix, hpux, qnx, cups
  • 默认值: cups

共享参数配置

1
2
3
4
5
6
7
8
9
10
[共享名/访问名]
comment = 任意字符串 //共享描述
path = 共享目录路径 //共享目录的绝对路径
browseable = yes/no //指定该共享是否可以浏览
writable = yes/no //指定该共享路径是否可写
valid users = 用户名列表 //允许访问该共享的用户
invalid users = 用户名列表 //禁止访问该共享的用户
write list = 用户名列表 //允许写入该共享的用户
guest ok = yes/no //指定该共享是否允许guest账户访问
public = yes/no //等同于guest ok

共享参数说明:

参数 说明 示例
comment 共享描述 comment = This is share SMB Service
path 共享目录路径 path = /share/smb
browseable 是否可浏览 browseable = yes
writable 是否可写 writable = yes
valid users 允许访问的用户 valid users = bgx1,bgx2
invalid users 禁止访问的用户 invalid users = bgx3
write list 允许写入的用户 write list = bgx1
guest ok 允许guest访问 guest ok = no
public 等同于guest ok public = no

2.4 建立访问共享资源

在Linux 7系统中,Samba服务程序默认使用的是用户口令认证模式,确保仅让有密码且受信任的用户访问共享资源,不过需要使用pdbedit建立账户信息数据库来管理SMB服务程序。

pdbedit命令说明

1
2
3
4
5
//pdbedit [选项] 账户
//-a 用户名 建立Samba用户
//-x 用户名 删除Samba用户
//-L 列出用户列表
//-Lv 列出用户详细信息的列表

创建Samba用户

1
2
3
4
5
6
7
# 创建系统用户
[root@xuliangwei ~]# useradd bgx

# 添加Samba用户
[root@xuliangwei ~]# pdbedit -a -u bgx
new password: //输入密码
retype new password: //确认密码

注意: 必须先创建系统用户,然后才能添加为Samba用户。

2.5 创建共享目录

创建用于共享资源的文件目录,要考虑到文件读写权限的问题。

1
2
3
4
5
6
# 创建共享目录
[root@xuliangwei ~]# mkdir /share/smb -p

# 设置目录所有者和权限
[root@xuliangwei ~]# chown -R bgx.bgx /share/smb/
[root@xuliangwei ~]# chmod 755 /share/smb

2.6 修改Samba主配置文件

修改Samba服务程序的主配置文件,可以删除[homes][printers]部分。

1
2
# 编辑Samba主配置文件
[root@xuliangwei ~]# vim /etc/samba/smb.conf

完整配置示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[global]
workgroup = SAMBA
security = user
passdb backend = tdbsam
printing = cups
printcap name = cups
load printers = yes
cups options = raw

# 建立共享目录
[share]
comment = This is share SMB Service
path = /share/smb
public = no
writable = yes
valid users = bgx

2.7 重启smb服务并加入开机自启动

1
2
3
4
5
6
7
8
# 重启smb服务
[root@xuliangwei ~]# systemctl restart smb

# 加入开机自启动
[root@xuliangwei ~]# systemctl enable smb

# 检查服务状态
[root@xuliangwei ~]# systemctl status smb

2.8 防火墙配置

如果必须开启防火墙,注意执行如下指令:

1
2
3
4
5
6
7
8
# 开放Samba服务
[root@xuliangwei ~]# firewall-cmd --permanent --add-service=samba

# 重新加载防火墙
[root@xuliangwei ~]# firewall-cmd --reload

# 验证防火墙规则
[root@xuliangwei ~]# firewall-cmd --list-services

Samba需要开放的端口:

  • TCP 139: NetBIOS会话服务
  • TCP 445: SMB直接承载
  • UDP 137: NetBIOS名称服务
  • UDP 138: NetBIOS数据报服务

3. Win挂载Samba

3.1 Windows访问Samba共享

要在Windows系统中访问共享资源,只需在我的电脑上方输入\\192.168.56.11(服务器IP地址)即可。

访问步骤:

  1. 打开”我的电脑”或”文件资源管理器”
  2. 在地址栏输入: \\192.168.56.11
  3. 按回车键

3.2 登录Samba共享

正确输入bgx账户名以及使用pdbedit命令设置的密码后,就可以登录到共享界面中了。

登录界面:

  • 用户名: bgx
  • 密码: 使用pdbedit设置的密码

3.3 操作共享资源

登录成功后,可以尝试执行以下操作:

  1. 查看文件: 浏览共享目录中的文件
  2. 写入文件: 创建新文件或修改现有文件
  3. 更名文件: 重命名文件或目录
  4. 删除文件: 删除文件或目录

3.4 Windows映射网络驱动器

可以将Samba共享映射为网络驱动器:

  1. 右键”此电脑” → “映射网络驱动器”
  2. 选择驱动器盘符
  3. 输入共享路径: \\192.168.56.11\share
  4. 勾选”登录时重新连接”
  5. 点击”完成”
  6. 输入用户名和密码

4. Linux挂载Samba

4.1 安装客户端工具

Samba服务可以实现Linux系统之间的文件共享,在客户端安装支持文件共享服务的软件包cifs-utils。

1
2
# 安装可以访问samba资源的客户端
[root@xuliangwei ~]# yum -y install cifs-utils

4.2 临时查看SMB服务端共享资源

以匿名身份查看授权资源

1
2
3
4
5
6
7
8
9
10
# 以匿名身份查看授权资源,直接回车即可
[root@samba-client ~]# smbclient -L 192.168.56.11
Enter SAMBA\root's password:
Anonymous login successful
OS=[Windows 6.1] Server=[Samba 4.6.2]

Sharename Type Comment
--------- ---- -------
samba-share Disk This is Share /data/samba/share
IPC$ IPC IPC Service (Samba 4.6.2)

以指定用户身份查看授权资源

1
2
3
4
5
6
7
8
# 以bgx身份查看授权资源
[root@samba-client ~]# smbclient -L 192.168.56.11 -U bgx%123
Domain=[SAMBA-SERVER] OS=[Windows 6.1] Server=[Samba 4.6.2]

Sharename Type Comment
--------- ---- -------
samba-share Disk This is Share /data/samba/share
IPC$ IPC IPC Service (Samba 4.6.2)

命令说明:

  • -L: 列出服务器上的共享资源
  • -U: 指定用户名和密码(格式:用户名%密码

直接访问共享

1
2
# 直接访问共享
[root@samba-client ~]# smbclient //192.168.56.11/share -U bgx%123

smbclient常用命令:

命令 说明
ls 列出文件
cd 切换目录
get 下载文件
put 上传文件
mkdir 创建目录
rm 删除文件
exit 退出

4.3 手动挂载SMB访问共享

建立挂载点

1
2
# 建立挂载点
[root@samba-client ~]# mkdir /cifs

以匿名身份挂载资源

1
2
# 以匿名的身份挂载资源
[root@samba-client ~]# mount -t cifs -o guest //192.168.56.11/samba-share /cifs

以账户密码身份挂载

1
2
# 以账户密码身份挂载
[root@samba-client ~]# mount -t cifs -o rw,user=bgx,pass=123 //192.168.56.11/samba-share /cifs

挂载参数说明:

参数 说明
-t cifs 指定文件系统类型为CIFS
-o rw 以读写方式挂载
-o user=用户名 指定用户名
-o pass=密码 指定密码
-o guest 匿名访问

4.4 使用配置文件保存密码

也可以将登录账户密码保存至配置文件,可以免输入密码去访问挂载。

创建密码文件

1
2
3
4
5
6
7
8
9
# 创建相应文件,并赋予安全权限
[root@samba-client ~]# vim /etc/samba/bgx

username=bgx
password=123
domain=MYGROUP

# 设置安全权限(必须600)
[root@samba-client ~]# chmod 600 /etc/samba/bgx

使用密码文件挂载

1
2
# 挂载时执行用户密码文件credentials=/etc/samba/bgx
[root@samba-client ~]# mount -t cifs -o rw,credentials=/etc/samba/bgx //192.168.56.11/samba-share /cifs

配置文件格式:

1
2
3
username=用户名
password=密码
domain=工作组名称

4.5 自动挂载SMB共享

编辑/etc/fstab文件

1
2
# 编辑fstab文件
[root@samba-client ~]# vim /etc/fstab

第一种方式:用户名密码方式

1
//192.168.56.11/samba-share    /cifs   cifs  domain=WORKGROUP,user=bgx,pass=123 0 0

第二种方式:使用配置文件

1
//192.168.56.11/samba-share   /cifs   cifs  credentials=/etc/samba/bgx 0 0

fstab格式说明:

1
设备名    挂载点    文件系统类型    挂载选项    备份    检查

挂载选项说明:

  • domain=WORKGROUP: 指定工作组
  • user=bgx: 指定用户名
  • pass=123: 指定密码
  • credentials=/etc/samba/bgx: 使用密码文件
  • _netdev: 网络设备,网络连通后挂载(重要)

测试自动挂载

1
2
3
4
5
# 测试fstab配置
[root@samba-client ~]# mount -a

# 验证挂载
[root@samba-client ~]# df -h | grep cifs

5. SMB多用户挂载

5.1 需求说明

在Samba Server服务器上,共享/data/samba/public,实现对访问挂载后的共享的每个用户单独的验证,实现权限隔离。

权限要求:

  • bgx1: 能够读写
  • bgx2: 能够读
  • bgx3: 不能访问

5.2 配置步骤

步骤1: 创建系统用户

1
2
3
4
# 创建系统用户
[root@samba-server ~]# useradd bgx1 -s /sbin/nologin
[root@samba-server ~]# useradd bgx2 -s /sbin/nologin
[root@samba-server ~]# useradd bgx3 -s /sbin/nologin

步骤2: 添加系统用户至samba服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 添加系统用户至samba服务
[root@samba-server ~]# pdbedit -a bgx1
new password: 123
retype new password: 123

[root@samba-server ~]# pdbedit -a bgx2
new password: 123
retype new password: 123

[root@samba-server ~]# pdbedit -a bgx3
new password: 123
retype new password: 123

# 查看Samba用户列表
[root@samba-server ~]# pdbedit -L
bgx2:1008:
bgx1:1007:
bgx3:1009:

步骤3: 修改samba配置文件共享目录

1
2
3
4
5
6
7
8
9
10
11
12
# 修改samba配置文件
[root@samba-server ~]# cat >> /etc/samba/smb.conf <<-EOF

[samba-public]
comment = This is a Share samba-public
path = /data/samba/public
public = no
valid users = bgx1,bgx2
invalid users = bgx3
writable = yes
write list = bgx1
EOF

配置说明:

  • valid users = bgx1,bgx2: 允许bgx1和bgx2访问
  • invalid users = bgx3: 禁止bgx3访问
  • writable = yes: 允许写入
  • write list = bgx1: 只有bgx1可以写入

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

1
2
3
4
5
6
# 创建共享目录
[root@samba-server ~]# mkdir -p /data/samba/public

# 设置目录所有者和权限
[root@samba-server ~]# chown bgx1 /data/samba/public/
[root@samba-server ~]# chmod 755 /data/samba/public

步骤5: 使用testparm测试配置

1
2
3
4
5
# 使用testparm测试配置
[root@samba-server ~]# testparm
Processing section "[samba-share]"
Processing section "[samba-public]"
Loaded services file OK.

testparm命令报错处理:

如果出现以下错误:

1
rlimit_max: increasing rlimit_max (1024) to minimum Windows limit (16384)

临时生效:

1
[root@samba-server ~]# ulimit -n 16384

重启后生效:

1
[root@samba-server ~]# echo "root - nofile 16384" >> /etc/security/limits.conf

步骤6: 重启smb服务

1
2
3
4
5
6
7
8
# 重启smb和nmb服务
[root@samba-server ~]# systemctl restart smb nmb

# 加入开机自启动
[root@samba-server ~]# systemctl enable smb nmb

# 检查服务状态
[root@samba-server ~]# systemctl status smb nmb

步骤7: 客户端挂载并测试权限

1
2
3
4
5
6
7
8
9
10
11
12
13
# 创建挂载点
[root@samba-client ~]# mkdir /bgx{1..3}

# 使用bgx1挂载(读写权限)
[root@samba-client ~]# mount -t cifs -o username=bgx1,pass=123 //192.168.56.11/samba-public /bgx1/

# 使用bgx2挂载(只读权限)
[root@samba-client ~]# mount -t cifs -o username=bgx2,pass=123 //192.168.56.11/samba-public /bgx2

# 使用bgx3挂载(应该被拒绝)
[root@samba-client ~]# mount -t cifs -o username=bgx3,pass=123 //192.168.56.11/samba-public /bgx3
mount error(13): Permission denied
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)

权限验证:

1
2
3
4
5
6
7
8
9
10
11
12
13
# bgx1可以读写
[root@samba-client ~]# touch /bgx1/test.txt
[root@samba-client ~]# echo "test" > /bgx1/test.txt

# bgx2只能读
[root@samba-client ~]# cat /bgx2/test.txt
test
[root@samba-client ~]# touch /bgx2/test2.txt
touch: cannot touch '/bgx2/test2.txt': Permission denied

# bgx3无法访问
[root@samba-client ~]# ls /bgx3
ls: cannot access '/bgx3': Permission denied

步骤8: 自动挂载

注意: 挂载属性_netdev是关键选项,网络连通后挂载,否则容易引起服务器无法启动。

1
2
3
4
5
6
7
# 编辑fstab文件
[root@samba-client ~]# vim /etc/fstab

# 添加自动挂载配置
//192.168.56.11/samba-public /bgx1 cifs defaults,username=bgx1,password=123,_netdev 0 0
//192.168.56.11/samba-public /bgx2 cifs defaults,username=bgx2,password=123,_netdev 0 0
//192.168.56.11/samba-public /bgx3 cifs defaults,username=bgx3,password=123,_netdev 0 0

fstab参数说明:

  • defaults: 使用默认挂载选项
  • username=用户名: 指定用户名
  • password=密码: 指定密码
  • _netdev: 网络设备,系统启动时等待网络就绪后再挂载

测试自动挂载:

1
2
3
4
5
6
7
8
# 卸载现有挂载
[root@samba-client ~]# umount /bgx1 /bgx2

# 测试fstab配置
[root@samba-client ~]# mount -a

# 验证挂载
[root@samba-client ~]# df -h | grep bgx

6. Samba服务管理

6.1 服务管理命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 启动服务
systemctl start smb nmb

# 停止服务
systemctl stop smb nmb

# 重启服务
systemctl restart smb nmb

# 重载配置(不中断连接)
systemctl reload smb

# 查看状态
systemctl status smb nmb

# 开机自启
systemctl enable smb nmb

6.2 用户管理命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 添加Samba用户
pdbedit -a -u 用户名

# 删除Samba用户
pdbedit -x -u 用户名

# 列出所有Samba用户
pdbedit -L

# 列出用户详细信息
pdbedit -Lv

# 修改用户密码
pdbedit -u 用户名

6.3 配置文件测试

1
2
3
4
5
6
7
8
# 测试配置文件语法
testparm

# 测试配置文件并显示默认值
testparm -s

# 测试指定配置文件
testparm /etc/samba/smb.conf

6.4 日志查看

1
2
3
4
5
6
# 查看Samba日志
tail -f /var/log/samba/log.smbd
tail -f /var/log/samba/log.nmbd

# 查看系统日志
journalctl -u smb -f

7. Samba故障排查

7.1 常见问题

问题1: 无法连接Samba服务器

排查步骤:

1
2
3
4
5
6
7
8
# 检查服务状态
systemctl status smb nmb

# 检查端口监听
ss -lntup | grep -E '139|445'

# 检查防火墙
firewall-cmd --list-services | grep samba

问题2: 登录失败

排查步骤:

1
2
3
4
5
6
7
8
# 检查用户是否存在
pdbedit -L

# 检查用户密码
pdbedit -Lv

# 查看日志
tail -f /var/log/samba/log.smbd

问题3: 无法写入文件

排查步骤:

1
2
3
4
5
6
7
8
# 检查目录权限
ls -ld /share/smb

# 检查SELinux状态
getenforce

# 检查配置文件
grep writable /etc/samba/smb.conf

7.2 错误代码

错误代码 说明 解决方法
NT_STATUS_LOGON_FAILURE 登录失败 检查用户名密码
NT_STATUS_ACCESS_DENIED 访问被拒绝 检查用户权限和目录权限
NT_STATUS_BAD_NETWORK_NAME 共享名不存在 检查共享配置
NT_STATUS_IO_TIMEOUT 连接超时 检查网络和防火墙

8. Samba安全加固

8.1 安全建议

  1. 使用强密码: Samba用户密码要足够复杂
  2. 限制访问IP: 使用hosts allow限制访问来源
  3. 禁用匿名访问: 设置security = user
  4. 最小权限原则: 只给用户必要的权限
  5. 定期更新: 保持Samba软件最新版本

8.2 防火墙配置

1
2
3
4
5
6
7
8
9
10
# 开放Samba服务
firewall-cmd --permanent --add-service=samba
firewall-cmd --reload

# 或手动开放端口
firewall-cmd --permanent --add-port=139/tcp
firewall-cmd --permanent --add-port=445/tcp
firewall-cmd --permanent --add-port=137/udp
firewall-cmd --permanent --add-port=138/udp
firewall-cmd --reload

8.3 SELinux配置

1
2
3
4
5
6
# 如果启用SELinux,需要设置上下文
chcon -t samba_share_t /share/smb

# 或使用semanage
semanage fcontext -a -t samba_share_t "/share/smb(/.*)?"
restorecon -Rv /share/smb

9. Samba性能优化

9.1 性能参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 优化配置
vim /etc/samba/smb.conf

[global]
# 连接数限制
max connections = 100

# 日志大小
max log size = 50

# 读取缓冲区大小
read raw = yes
write raw = yes

# 套接字选项
socket options = TCP_NODELAY IPTOS_LOWDELAY SO_RCVBUF=131072 SO_SNDBUF=131072

9.2 系统优化

1
2
3
4
5
6
7
8
9
# 优化内核参数
cat >> /etc/sysctl.conf <<EOF
# Samba优化
net.core.somaxconn = 1024
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 8192
EOF

sysctl -p

10. Samba实战案例

10.1 案例1: 部门文件共享

需求: 为不同部门创建独立的共享目录,每个部门只能访问自己的目录。

配置步骤:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 1. 创建部门和用户
useradd -s /sbin/nologin dept1_user1
useradd -s /sbin/nologin dept2_user1
pdbedit -a dept1_user1
pdbedit -a dept2_user1

# 2. 创建共享目录
mkdir -p /data/samba/{dept1,dept2}
chown dept1_user1 /data/samba/dept1
chown dept2_user1 /data/samba/dept2

# 3. 配置Samba
cat >> /etc/samba/smb.conf <<EOF
[dept1]
comment = Department 1 Share
path = /data/samba/dept1
valid users = dept1_user1
writable = yes

[dept2]
comment = Department 2 Share
path = /data/samba/dept2
valid users = dept2_user1
writable = yes
EOF

# 4. 重启服务
systemctl restart smb

10.2 案例2: 公共只读共享

需求: 创建一个公共共享目录,所有用户只能读取,不能写入。

配置步骤:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 1. 创建共享目录
mkdir -p /data/samba/public
chmod 755 /data/samba/public

# 2. 配置Samba
cat >> /etc/samba/smb.conf <<EOF
[public]
comment = Public Read-Only Share
path = /data/samba/public
public = yes
writable = no
guest ok = yes
EOF

# 3. 重启服务
systemctl restart smb

实战优化