Linux 系统实现 SMB 文件共享
在 RHEL 9 上配置 Samba 服务,实现 Windows 电脑安全、稳定地访问 Linux 服务器上的共享文件夹。
一、介绍
Samba 是在 Linux/Unix 上实现 SMB/CIFS 协议的开源软件,能让 Windows、macOS、Linux 客户端像访问本地磁盘一样访问 Linux 上的共享目录。相比 NFS 和 SFTP,Samba 对 Windows 的原生兼容性最好,无需在 Windows 端安装额外客户端。
核心组件:
smbd:负责文件共享和打印共享,监听 TCP 139/445。nmbd:负责 NetBIOS 名称解析和网络浏览,监听 UDP 137/138。可选,但为了方便用主机名访问和出现在“网络”中,通常也启动。
三层安全关卡(缺一不可):
- Linux 传统权限(DAC):文件/目录的
rwx和所有者。 - SELinux(MAC):强制访问控制,决定
smbd进程能否访问特定文件。 - 防火墙:网络流量能否到达 Samba 端口。
二、前期准备
- 一台 RHEL 9 服务器,已配置好网络,能 ping 通。
- 一个用于共享的目录,建议放在
/srv/samba/share,避免与家目录权限纠缠。 - 一个专用系统用户(如
coco),不要用 root。 - Windows 电脑与服务器在同一局域网,或可路由。
三、安装 Samba
sudo dnf install samba samba-client samba-common -y说明:
samba:主服务包,包含smbd、nmbd。samba-client:客户端工具,如smbclient。samba-common:配置文件与通用工具。
安装完成后,Samba 配置文件位于 /etc/samba/smb.conf。
四、创建共享目录与 Linux 权限
1. 创建目录
sudo mkdir -p /srv/samba/share2. 创建专用系统用户
# 1. 创建专用系统用户
sudo useradd -M -s /sbin/nologin coco
# 2. 设置 Samba 密码(会提示输入两次)
sudo smbpasswd -a coco说明:
-M:不创建家目录,因为共享目录独立。-s /sbin/nologin:禁止该用户登录 Shell,仅用于 Samba 认证,提升安全性。
3. 设置目录所有者与权限
sudo chown -R coco:coco /srv/samba/share
sudo chmod -R 775 /srv/samba/share说明:
775表示所有者与同组可读写执行,其他人可读可执行。若需其他人也可写,可改为777,但安全性降低。- 确保父目录
/srv/samba也对smbuser可进入。通常755即可。
注意: 如使用 /home/share,需检查 /home 的权限。默认 /home 是 700,会阻止其他用户进入。可执行 ls -ld /home 查看,若为 700,建议将共享移出 /home,或谨慎调整 /home 权限(会影响所有用户)。
五、理解并配置 SELinux(关键步骤)
1. SELinux 是什么?
SELinux(Security-Enhanced Linux)是 Linux 内核的强制访问控制系统。每个文件、进程都有安全上下文标签,格式如 system_u:object_r:samba_share_t:s0。其中第三段 类型(Type) 决定访问规则。Samba 的 smbd 进程默认只能访问类型为 samba_share_t 的文件。如果共享目录标签不对,即使 chmod 777,SELinux 也会拦截,导致无法访问或无法写入。
2. 为共享目录打上正确的 SELinux 标签
推荐方式:持久化规则 + restorecon
# 添加持久化上下文规则
sudo semanage fcontext -a -t samba_share_t "/srv/samba/share(/.*)?"
# 应用规则
sudo restorecon -Rv /srv/samba/share说明:
semanage fcontext添加的规则会写入策略数据库,重启或重新标记后依然有效。restorecon立即应用标签。- 验证:
ls -Zd /srv/samba/share,应看到samba_share_t。
不推荐的方式:chconchcon 只临时修改标签,文件系统重新标记或系统更新后会丢失。若已用 chcon,请改用上述持久化方法。
3. 检查 SELinux 布尔值
getsebool -a | grep samba确保:
samba_export_all_rw为 offsamba_export_all_ro为 offsamba_enable_home_dirs根据需求设置(若共享家目录则 on)
为什么不推荐 samba_export_all_rw on? 该布尔值允许 Samba 读写任意文件,绕过 samba_share_t 标签限制,大幅削弱安全性。仅在共享无法打标签的特殊文件系统(如外部 USB、NFS 挂载点)时临时使用。
4. 查看 SELinux 拒绝日志
sudo ausearch -m avc -ts recent | grep samba若有 denied,说明标签或布尔值有问题。
六、创建 Samba 用户
Samba 有独立的密码数据库,用户必须对应已存在的 Linux 系统用户。
sudo smbpasswd -a coco说明:
- 输入两次 Samba 专用密码(与系统密码无关)。
- 验证:
sudo pdbedit -L,应看到coco。 - 修改密码:
sudo smbpasswd coco - 删除用户:
sudo smbpasswd -x coco - 禁用/启用:
sudo smbpasswd -d/-e coco
注意: 不要用 root 作为 Samba 用户,安全风险极高。
七、配置 smb.conf
1. 备份原配置
sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.bak2. 编辑配置文件
sudo vi /etc/samba/smb.conf在文件末尾添加共享段:
[share]
comment = Shared Folder
path = /srv/samba/share
browseable = yes
writable = yes
valid users = coco
create mask = 0664
directory mask = 0775参数说明:
| 参数 | 作用 |
|---|---|
path | 共享目录绝对路径 |
browseable | 是否在 Windows 网络邻居中可见 |
writable | 是否允许写入(必须 yes,否则只能读) |
valid users | 允许访问的用户,多个用空格分隔 |
create mask | 新文件默认权限掩码 |
directory mask | 新目录默认权限掩码 |
3. 禁用默认的 [homes] 段(可选)
默认配置中可能启用了 [homes],导致 Windows 登录后除了 share 还显示一个以用户名命名的文件夹。若不需要共享家目录,注释掉:
# [homes]
# comment = Home Directories
# valid users = %S
# read only = No
# browseable = No4. 验证配置语法
sudo testparm若报错,先修复再继续。
八、配置防火墙
sudo firewall-cmd --permanent --add-service=samba
sudo firewall-cmd --reload说明:samba 服务会自动放行 TCP 139、445 和 UDP 137、138。
若需限制来源 IP,更安全:
sudo firewall-cmd --permanent --remove-service=samba
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" service name="samba" accept'
sudo firewall-cmd --reload九、启动并启用 Samba 服务
sudo systemctl enable --now smb nmb说明:
smb:核心文件共享服务,必须启动。nmb:名称解析与网络浏览,可选。若只用 IP 访问,可只启动smb。
检查状态:
sudo systemctl status smb
sudo systemctl status nmb十、Windows 端连接
- 打开文件资源管理器。
- 地址栏输入:
\\<服务器IP>,例如\\192.168.1.100。 - 弹出认证窗口,输入 Samba 用户名
coco和之前设置的 Samba 密码。 - 即可看到
share文件夹,进行读写操作。
若想用主机名访问,确保 nmb 运行且网络支持 NetBIOS,或配置 DNS。
十一、常见故障排查
1. 文件传不进去,提示“需要权限”
按以下顺序排查:
A. SELinux 层
getenforce # 应为 Enforcing
ls -Zd /srv/samba/share # 应包含 samba_share_t
getsebool -a | grep samba # samba_export_all_rw/ro 应为 off
sudo ausearch -m avc -ts recent | grep samba # 查看拒绝日志若怀疑 SELinux,可临时设为 Permissive 测试:
sudo setenforce 0
# 测试上传,若成功则确认是 SELinux 问题
sudo setenforce 1B. Linux 权限层
ls -ld /srv/samba /srv/samba/share确保 smbuser 对目录有写权限,父目录可进入。
C. Samba 配置层
sudo testparm确认 writable = yes、valid users 包含 smbuser。
D. 重启服务并清除 Windows 凭据
sudo systemctl restart smbWindows 端:控制面板 → 凭据管理器 → 删除对应服务器凭据,重新连接。
2. 出现两个文件夹(如 coco 和 share)
原因:smb.conf 中 [homes] 段启用,自动为登录用户共享家目录。解决:注释掉 [homes] 段,重载 Samba。
3. nmb 服务的作用
- 负责 NetBIOS 名称解析(把主机名转 IP)和网络浏览。
- 不启动不影响通过 IP 访问,但会影响用主机名访问和在“网络”中显示。
十二、Samba 用户管理命令速查
| 操作 | 命令 |
|---|---|
| 添加 Samba 用户 | sudo smbpasswd -a 用户名 |
| 修改 Samba 密码 | sudo smbpasswd 用户名 |
| 删除 Samba 用户 | sudo smbpasswd -x 用户名 |
| 禁用/启用 | sudo smbpasswd -d/-e 用户名 |
| 列出所有用户 | sudo pdbedit -L |
| 查看用户详情 | sudo pdbedit -L -v 用户名 |
十三、服务管理命令速查
| 操作 | 命令 |
|---|---|
| 启动并开机自启 | sudo systemctl enable --now smb nmb |
| 停止 | sudo systemctl stop smb nmb |
| 停止并禁止自启 | sudo systemctl disable --now smb nmb |
| 重载配置 | sudo systemctl reload smb |
| 重启 | sudo systemctl restart smb |
| 查看状态 | sudo systemctl status smb |
十四、总结
配置 Samba 共享的核心流程:
- 安装:
dnf install samba。 - 目录与权限:创建共享目录,设置 Linux 所有者与权限。
- SELinux:用
semanage fcontext+restorecon打上samba_share_t标签,确保布尔值正确。 - Samba 用户:创建系统用户并用
smbpasswd -a设置 Samba 密码。 - 配置:编辑
smb.conf,定义共享段,设置writable = yes和valid users。 - 防火墙:放行
samba服务。 - 启动服务:
systemctl enable --now smb nmb。 - Windows 访问:
\\服务器IP,输入 Samba 凭据。
只要三层安全关卡(Linux 权限、SELinux、防火墙)都正确,Samba 共享就能稳定运行。遇到权限问题,优先检查 SELinux 标签和 Linux 目录权限。