22.Linux samba服务
Linux : samba服务
Samba 是一种在 Linux 和 Windows 系统之间实现文件共享的工具,基于 SMB(Server Message Block)协议。它允许 Linux 系统模拟 Windows 的文件共享功能,从而实现跨平台的文件和打印机共享
工作原理
- 请求连接
- 客户端发送协议版本请求 → 服务器确认请求内容 → 无响应则失败。
- 协商
- 服务器返回协议版本/端口信息 → 客户端确认自身配置。
- 认证
- 客户端发送认证信息 → 服务器响应成功则建立会话。
- 访问
- 会话建立后,客户端通过命令访问共享资源。
端口分配
进程 | 端口 | 协议 | 功能 |
---|---|---|---|
smbd | 139 | TCP | 传统SMB会话服务(基于NetBIOS) |
445 | TCP | 现代直接SMB服务(无NetBIOS封装) | |
nmbd | 137 | UDP | NetBIOS名称服务(域名解析) |
138 | UDP | NetBIOS数据报服务(浏览共享资源) |
samba服务部署
关闭防火墙和selinux
安装samba软件包
yum install samba samba-client -y
rpm -q samba
-samba-4.8.3-4.el7.x86_64
rpm -q samba-client
-samba-client-4.8.3-4.el7.x86_64
创建共享目录/kiva,共享名为kiva,可以浏览,允许decade和 kami用户访问,decade拥有读写权限,kami拥有只读权限
mkdir /kiva
cd /kiva
touch kiva1 kiva2 kiva3
ls
-kiva1 kiva2 kiva3
useradd decade
useradd kami
编辑配置文件
vim /etc/samba/smb.conf
设置samba用户
smbpasswd -a decade
-New SMB password:
-Retype new SMB password:
smbpasswd -a kami
-New SMB password:
-Retype new SMB password:
给用户设置权限,确保用户的访问权限与服务权限一致
setfacl -m u:kami:r-x /kiva
setfacl -m u:decade:rwx /kiva
查看所有samba用户
pdbedit -L
-decade:1003:
-kami:1004:
重启服务
systemctl restart smb
systemctl enable smb
systemctl restart nmb
systemctl enable nmb
客户端配置
安装samba-client 软件包和 cifs-utils 软件包
yum install samba-client cifs-utils
rpm -q samba-client
-samba-client-4.8.3-4.el7.x86_64
rpm -q cifs-utils
-cifs-utils-6.2-10.el7.x86_64
以匿名用户访问samba服务器,匿名用户直接访问,不需要密码
smbclient -L 192.168.100.10
匿名用户访问samba服务器的共享资源
smbclient //192.168.100.10/kiva
匿名用户访问失败
samba用户访问共享目录列表
smbclient //192.168.100.10/kiva -U decade
输入密码后访问成功,
将samba服务器上的共享目录挂载到本地文件/kuga
mkdir /kuga
mount -t cifs -o username=decade //192.168.100.10/kiva /kuga #交互式挂载
输入密码后成功挂载
查看挂载情况
df -h
mount -t cifs -o username=decade,password=555,sec=ntlmssp //192.168.100.10/kiva /kuga #非交互式直接挂载,不需要输入密码
实现多用户挂载(multiuser可以让普通用户拥有samba用户的权限来访问共享目录)
vim /etc/fstab
普通用户使用cifscreds命令借用kami用户的权限
useradd kabuto
su - kabuto
cifscreds add 192.168.100.10 -u decade
测试是否能够创建目录
能够创建说明借用权限成功
在windows系统上进入共享目录
如果不能查看, 通常是因为当前用户已经与服务器建立了多个连接。为了解决这个问题 可以在计算机上打开命令窗口,输入 net use * /del /y
来终止所有共享连接
补充
组件/工具 | 功能描述 | 关键命令/操作 | 使用场景 |
---|---|---|---|
smbd | SMB 服务器守护进程,提供文件和打印服务 | systemctl start smb systemctl status smb | 文件共享、打印机共享、用户认证 |
nmbd | NetBIOS 名称服务守护进程,提供网络浏览支持 | systemctl start nmb systemctl status nmb | 局域网计算机发现、主机名解析 |
smbclient | SMB 客户端工具,访问远程共享资源 | smbclient -L //server smbclient //server/share -U user | 浏览共享列表、交互式访问文件、调试连接 |
mount.cifs | 挂载 SMB 共享(现代替代 smbmount ) | mount -t cifs //server/share /mnt -o user=name | 持久化挂载远程共享 |
umount | 卸载 SMB 共享(现代替代 smbumount ) | umount /mnt | 安全卸载网络共享 |
smbpasswd | Samba 用户密码管理工具 | smbpasswd -a user smbpasswd -e user smbpasswd -x user |
Samba SELinux 配置
配置场景 | 操作命令 | 作用 | 持久性说明 |
---|---|---|---|
共享用户家目录 | setsebool -P samba_enable_home_dirs on | 允许用户通过 Samba 访问自己的家目录 | -P 参数确保重启后生效 |
共享自定义目录 | chcon -t samba_share_t /path/to/directory | 临时设置目录为 Samba 共享类型 | 重启失效 文件系统重打标签时丢失 |
只读共享目录 | setsebool -P samba_export_all_ro on | 以只读权限共享目录时,需要设置的bool值 | -P 参数确保重启后生效 |
读写共享目录 | setsebool -P samba_export_all_rw on | 以读写权限共享目录时,需要设置的bool值 | -P 参数确保重启后生效 |
security 参数 (认证模式)
模式 | 说明 | 适用场景 |
---|---|---|
user | 使用 Samba 本地数据库验证用户身份 (需通过 smbpasswd 添加用户) | 标准文件服务器 需要用户级访问控制的场景 |
share | 匿名共享模式 无需密码即可访问共享资源 | 公共文件分发 打印机共享等无安全要求的场景 |
server | 委托其他服务器认证 (Samba 将凭据转发给外部认证服务器) | 旧版兼容场景(存在中间人攻击风险) |
Samba 共享目录配置参数详解
参数 | 可选值 | 默认值 | 详细说明 |
---|---|---|---|
comment | 任意字符串 | 无 | 共享描述信息,用于说明共享内容 |
path | 绝对路径 | 无 | 必须配置:共享目录的物理路径 目录需事先创建且权限正确 |
browseable | yes /no | yes | 控制共享是否在网络中可见 yes :出现在网络邻居 no :隐藏共享(需直接访问路径) |
read only | yes /no | yes | 全局只读控制 yes :所有用户只读 no :允许写操作(需配合writable 或write list ) |
writable | yes /no | no | 全局可写控制 yes :所有用户可写 no :禁止写操作 注意:与read only 冲突(后者优先级更高) |
write list | 用户/组列表 | 空 | 精确写控制:指定具有读写权限的用户/组 用户:user1,user2 组:@group1,@group2 未列用户仅读 |
guest ok | yes /no | no | 是否允许匿名访问 yes :无需认证 no :必须认证 |
valid users | 用户/组列表 | 所有用户 | 访问白名单:允许访问的用户/组 空值=所有Samba用户 格式:user1,user2,@group1 |
public | yes /no | no | guest ok别名:功能完全等同于guest ok (历史遗留参数,建议优先使用guest ok ) |
读写权限规则
场景 | 配置组合 |
---|---|
完全只读共享 | read only = yes writable = no |
认证用户可写 | read only = no writable = yes |
仅管理员可写 | read only = no write list = @admins |