目录

一、解释 Samba 共享

1. 背景

2. 什么是 Samba?

3. 为什么需要 Samba?

二、实现过程

1. 环境要求

2. 实现步骤

步骤 1:安装 Samba

步骤 2:创建专用系统账户和组

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

步骤 4:配置 SELinux(关键步骤)

步骤 5:配置 Samba 用户认证

步骤 6:配置 Samba 服务

步骤 7:配置防火墙

步骤 8:启动并启用 Samba 服务

步骤 9:全面验证配置

3. 客户端连接测试

从 Linux 客户端

从 Windows 客户端


一、解释 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?

    1. CIFS 协议限制:不传递完整的用户身份信息

    2. 安全保守:当用户身份无法精确映射时,选择最高权限用户

    3. 挂载过程mount 命令需要 root 权限,所以默认关联到 root

    2)从 Windows 客户端

    1. 打开文件资源管理器

    2. 在地址栏输入:\\CentOS服务器IP\secure_share

    3. 输入用户名:samba_user 和对应的密码

    4. 应该能成功连接并具有读写权限

    Logo

    助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

    更多推荐