CentOS 7 Samba 共享实现(防火墙开启 + SELinux 强制模式)
目录
一、解释 Samba 共享
1. 背景
1987年,微软公司和英特尔公司共同制定了SMB(server Messages Block)协议用来解决局域网内的文件或打印机等的资源共享问题。但是这时后还是解决不了跨系统之间的文件共享。直到1991年,在读大学的Tridgwell 基于SMB协议开发能够解决Linux系统和windows系统之间的文件的问题——也就是SMBServer服务测序。后来被命名为samba(根据一个拉丁舞名字)。如今,samba服务测序成为了在Linux和windows系统之间共享文件的最佳选择
2. 什么是 Samba?
Samba 是一个开源的、功能强大的软件套件,它实现了 SMB/CIFS 协议。
-
SMB/CIFS 协议:这是微软 Windows 操作系统默认使用的文件和打印机共享网络协议。简单来说,它就是 Windows “网上邻居”或“网络”里看到其他电脑时所使用的“语言”。
-
Samba 的作用:通过安装 Samba,Linux 或 Unix 系统可以“说” Windows 的共享协议。这使得 Windows 客户端能够像访问另一台 Windows 电脑一样,无缝地访问 Linux 系统上的文件、目录和打印机。
3. 为什么需要 Samba?
在一个混合操作系统的网络环境中(例如,既有 Windows PC,又有 Linux 服务器),Samba 是必不可少的,因为它:
-
实现跨平台文件共享:让 Windows 用户能够方便地访问 Linux 服务器上的文件,是办公室、学校、家庭网络中非常常见的需求。
-
充当域控制器:高级版本的 Samba 甚至可以作为一个域控制器,管理 Windows 客户端的登录和身份验证,类似于 Windows Server 的 Active Directory。
-
提供打印机共享:可以让连接在 Linux 机器上的打印机被网络中的 Windows 电脑使用。
二、实现过程
1. 环境要求
-
CentOS 7 系统
-
防火墙
firewalld处于运行状态 -
SELinux 为
Enforcing模式 -
客户端通过专用账户进行认证和读写
2. 实现步骤
步骤 1:安装 Samba
[youke@Samba ~]$ sudo yum install -y samba samba-client samba-common
看到Complete即安装完成

步骤 2:创建专用系统账户和组
# 创建专门用于文件共享的系统用户组
[youke@Samba ~]$ sudo groupadd samba_users
#验证用户组是否创建成功
[youke@Samba ~]$ grep samba_users /etc/group
samba_users:x:1001:
# 创建专用系统用户(不创建家目录,禁止shell登录)
[youke@Samba ~]$ sudo useradd -M -s /sbin/nologin -G samba_users samba_user
# 查看用户是否创建成功
[youke@Samba ~]$ grep samba_user /etc/passwd
samba_user:x:1001:1002::/home/samba_user:/sbin/nologin
步骤 3:创建共享目录并设置权限
# 创建共享目录
[youke@Samba ~]$ sudo mkdir -p /samba/shared_data
# 设置目录所有者和权限
# 控制哪个系统用户可以实际访问这些文件,防止服务器上的其他本地用户也能直接修改这些文件!
[youke@Samba ~]$ sudo chown -R samba_user:samba_users /samba/shared_data
# 2770中的2表示设置SGID,新建文件自动继承目录的组
[youke@Samba ~]$ sudo chmod 2770 /samba/shared_data
# 验证权限设置
[youke@Samba ~]$ ls -ld /samba/shared_data
drwxrws---. 2 samba_user samba_users 6 Oct 12 23:16 /samba/shared_data
步骤 4:配置 SELinux(关键步骤)
# 安装SELinux管理工具
[youke@Samba ~]$ sudo yum install -y policycoreutils-python
#确保selinux处于强制状态
[youke@Samba ~]$ getenforce
Enforcing
# 为共享目录设置SELinux安全上下文
# 只允许 Samba 读写共享特定的目录。
[youke@Samba ~]$ sudo semanage fcontext -a -t samba_share_t "/samba/shared_data(/.*)?"
# 应用SELinux上下文
[youke@Samba ~]$ sudo restorecon -R /samba/shared_data
# 验证SELinux上下文
[youke@Samba ~]$ ls -Z /samba/
drwxrws---. samba_user samba_users unconfined_u:object_r:samba_share_t:s0 shared_data
1)以上10,13行的命令是更精细、安全的做法。只给你需要共享的目录打上正确的 SELinux 标签,而不是全局放开。
2)另外一种比较宽泛的授权
# 永久启用一个 SELinux 布尔值,永久允许 Samba 读写共享任何目录。
[youke@Samba ~]$ sudo setsebool -P samba_export_all_rw on
步骤 5:配置 Samba 用户认证
# 设置Samba密码(与系统密码分开)
[youke@Samba ~]$ sudo smbpasswd -a samba_user
# 按照提示输入两次密码
New SMB password:
Retype new SMB password:
Added user samba_user.
# 启用Samba用户
[youke@Samba ~]$ sudo smbpasswd -e samba_user
Enabled user samba_user.
# 查看Samba用户列表
[youke@Samba ~]$ sudo pdbedit -L
samba_user:1001:
Samba服务器认证用来向Samba服务器证明你有权限访问这个共享目录
步骤 6:配置 Samba 服务
#先将配置文件备份再修改
[youke@Samba ~]$ sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.backup
[youke@Samba ~]$ sudo vim /etc/samba/smb.conf
在 [global] 部分确保以下配置:
[global]
workgroup = WORKGROUP # 工作组名称,与Windows网络邻居中显示的一致
server string = Samba Server on CentOS 7
security = user # 使用用户级安全认证,需要用户名密码
passdb backend = tdbsam # 用户密码数据库格式(TDB数据库)
logging = system # 使用系统日志
log file = /var/log/samba/log.%m # 日志文件路径,%m代表客户端机器名
max log size = 50 # 日志文件最大大小(MB)
# 禁止匿名访问
map to guest = bad user # 禁止匿名访问,无效用户视为访客
在文件末尾添加共享配置:
[secure_share] # 共享名称,在网络中显示为secure_share
path = /samba/shared_data # 实际共享的目录路径
browseable = yes # 在网络中可见
writable = yes # 允许写入
valid users = @samba_users # 只允许samba_users组成员访问
read only = no # 非只读模式(可写)
guest ok = no # 禁止访客访问
create mask = 0664 # 新建文件的默认权限
directory mask = 0775 # 新建目录的默认权限
force group = samba_users # 强制文件属组为samba_users
# 增强安全性
hide unreadable = yes # 隐藏用户无权限访问的文件
inherit permissions = yes # 继承父目录权限设置
验证配置文件语法:
[youke@Samba ~]$ sudo testparm
Load smb config files from /etc/samba/smb.conf
rlimit_max: increasing rlimit_max (1024) to minimum Windows limit (16384)
Processing section "[homes]"
Processing section "[printers]"
Processing section "[print$]"
Processing section "[secure_share]"
Loaded services file OK.
Server role: ROLE_STANDALONE
Press enter to see a dump of your service definitions
步骤 7:配置防火墙
#查看防火墙状态,确保其启动
[youke@Samba ~]$ sudo systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
#防火墙正在运行(running)
Active: active (running) since Sun 2025-10-12 23:38:33 CST; 1min 27s ago
Docs: man:firewalld(1)
Main PID: 1693 (firewalld)
# 添加Samba服务到防火墙白名单
[youke@Samba ~]$ sudo firewall-cmd --permanent --add-service=samba
success
[youke@Samba ~]$ sudo firewall-cmd --reload
success
# 验证防火墙规则
[youke@Samba ~]$ sudo firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33 ens37
sources:
services: ssh dhcpv6-client samba #允许samba服务
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
步骤 8:启动并启用 Samba 服务
# 启动服务
[youke@Samba ~]$ sudo systemctl start smb nmb
[youke@Samba ~]$ sudo systemctl enable smb nmb
Created symlink from /etc/systemd/system/multi-user.target.wants/smb.service to /usr/lib/systemd/system/smb.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/nmb.service to /usr/lib/systemd/system/nmb.service.
# 检查服务状态,均看到状态是running则启动成功
sudo systemctl status smb
sudo systemctl status nmb
步骤 9:全面验证配置
# 1. 检查SELinux模式(确认是Enforcing)
sudo getenforce
# 输出:Enforcing
# 2. 检查防火墙状态(确认是running)
sudo systemctl status firewalld
# 3. 本地测试Samba共享
[youke@Samba ~]$ smbclient -U samba_user -L //localhost
# 输入密码后应该能看到secure_share共享
# 成功认证:连接成功系统提示 Enter WORKGROUP\samba_user's password: 后您输入了密码,没有现"Authentication failure"或"Invalid password"等错误,并且正常返回了结果列表。
Enter WORKGROUP\samba_user's password:
Sharename Type Comment
--------- ---- -------
print$ Disk Printer Drivers
secure_share Disk
IPC$ IPC IPC Service (Samba Server on CentOS 7)
samba_user Disk Home Directories
Reconnecting with SMB1 for workgroup listing.
Server Comment
--------- -------
Workgroup Master
--------- -------
WORKGROUP SAMBA
# 4. 测试实际连接
[youke@Samba ~]$ smbclient -U samba_user //localhost/secure_share
Enter WORKGROUP\samba_user's password:
Try "help" to get a list of possible commands.
smb: \>
# 恭喜!您现在已成功进入 Samba 共享的命令行环境 smb: \>。这是一个功能完整的文件管理器,
你可以对共享目录进行操作了
smbclient命令:
-U 选项的作用就是指定用于认证的 Samba 用户名。
-L 列出指定服务器上可用的共享资源。
smb: \>部分命令:
| 功能 | smbclient 命令 |
|---|---|
| 列出文件 | ls 或 dir |
| 删除文件 | del 或 rm |
| 删除目录 | rmdir |
| 显示路径 | pwd |
| 改变目录 | cd |
| 创建目录 | mkdir |
| 上传文件 | put |
| 下载文件 | get |
| 重命名文件 | rename |
| 查看命令帮助 | help |
| 退出客户端 | exit 或 quit |
3. 客户端连接测试
1)从 Linux 客户端
使用能够与Samba服务器进行网络通信的Linux客户端。
# 安装客户端工具
[youke@pc207 ~]$ sudo yum install -y cifs-utils
# 创建挂载点
sudo mkdir /mnt/samba_share
# 挂载共享,password处写之前设置的samba_user账户密码,服务器IP为Samba服务器地址
# 这里的uid,gid 参数的作用是:在通过Samba认证后,让挂载的文件在本地Linux系统中"伪装"成属于当前用户,从而避免频繁使用sudo,提供更自然的文件操作体验。
[youke@pc207 ~]$ sudo mount -t cifs -o username=samba_user,password=123,uid=$(id -u),gid=$(id -g) //服务器IP/secure_share /mnt/samba_share
#查看挂载情况
[youke@pc207 ~]$ df -hT /mnt/samba_share/
Filesystem Type Size Used Avail Use% Mounted on
//192.168.4.60/secure_share cifs 17G 1.2G 16G 8% /mnt/samba_share
# 测试读写
touch /mnt/samba_share/test_file.txt
[youke@pc207 ~]$ touch /mnt/samba_share/test_file.txt
[youke@pc207 ~]$ ls /mnt/samba_share/
test_file.txt
#Samba服务器也确实创建了test_file.txt文件
[youke@Samba ~]$ sudo ls /samba/shared_data/
test_file.txt
如果挂载时不适用uid,gid,则挂载的文件会在本地显示为root所有,你需要sudo才能写文件。
为什么默认是 root?
-
CIFS 协议限制:不传递完整的用户身份信息
-
安全保守:当用户身份无法精确映射时,选择最高权限用户
-
挂载过程:
mount命令需要 root 权限,所以默认关联到 root
2)从 Windows 客户端
-
打开文件资源管理器
-
在地址栏输入:
\\CentOS服务器IP\secure_share -
输入用户名:
samba_user和对应的密码 -
应该能成功连接并具有读写权限


更多推荐
所有评论(0)