Linux Samba 服务详解

简介: Samba 是一个开源软件套件,实现了 SMB/CIFS 网络协议,允许 Linux/Unix 系统与 Windows 系统之间进行文件和打印机共享。

Samba 概述

Samba 是 Linux/Unix 系统与 Windows 系统之间实现文件共享、打印机共享和域控制的标准解决方案。它支持 Active Directory、域控制等企业级功能。

核心功能
  • 文件与目录共享
  • 打印机共享
  • 用户认证与权限管理
  • Active Directory 域控制器
  • Windows 客户端支持
协议支持
  • SMB1/SMB2/SMB3 协议
  • CIFS 协议
  • NetBIOS over TCP/IP
  • LDAP 集成
  • Kerberos 认证

安装 Samba

Debian/Ubuntu 系统安装

# 更新软件包列表
sudo apt update

# 安装Samba服务器
sudo apt install samba

# 安装Samba客户端工具
sudo apt install samba-client smbclient cifs-utils

RHEL/CentOS/Fedora 系统安装

# CentOS/RHEL 7/8
sudo yum install samba samba-client

# Fedora
sudo dnf install samba samba-client

# 启动Samba服务
sudo systemctl start smb
sudo systemctl start nmb

# 设置开机启动
sudo systemctl enable smb
sudo systemctl enable nmb

Samba 主要组件

组件/命令 功能说明
smbd Samba 守护进程,处理文件和打印服务请求
nmbd NetBIOS 名称服务器,处理名称解析和浏览
smbclient SMB 客户端,类似 FTP 客户端,用于访问共享
testparm 检查 smb.conf 配置文件的语法错误
smbstatus 查看当前 Samba 连接状态
pdbedit Samba 用户数据库管理工具
net 管理 Samba 域和用户(类似 Windows net 命令)
mount.cifs 挂载 Windows/Samba 共享到本地目录

Samba 配置文件详解

Samba 的主要配置文件是 /etc/samba/smb.conf,包含全局设置和共享定义。

smb.conf 基本结构

# 全局设置部分
[global]
    workgroup = WORKGROUP
    server string = Samba Server %v
    netbios name = SERVER01
    security = user
    map to guest = Bad User
    dns proxy = no

# 共享定义部分
[共享名称]
    comment = 共享描述
    path = /path/to/shared/directory
    browseable = yes
    writable = yes
    valid users = @groupname, username
    read only = no
    create mask = 0755
    directory mask = 0755

常用全局配置参数

参数 说明 示例值
workgroup 工作组名称 WORKGROUP
server string 服务器描述 Samba Server 4.9.1
security 安全模式 user, share, domain, ads
passdb backend 密码数据库后端 tdbsam
map to guest 访客映射 Bad User, Never, Bad Password
log file 日志文件路径 /var/log/samba/log.%m
max log size 最大日志大小 5000

常用命令示例

用户管理

# 添加Samba用户(必须先有系统用户)
sudo useradd smbuser
sudo smbpasswd -a smbuser

# 查看Samba用户列表
sudo pdbedit -L

# 删除Samba用户
sudo smbpasswd -x smbuser

# 禁用/启用Samba用户
sudo smbpasswd -d smbuser  # 禁用
sudo smbpasswd -e smbuser  # 启用

服务管理

# 检查配置文件语法
sudo testparm

# 重新加载Samba配置(不中断现有连接)
sudo smbcontrol all reload-config

# 查看Samba服务状态
sudo systemctl status smb
sudo systemctl status nmb

# 重启Samba服务
sudo systemctl restart smb nmb

连接与诊断

# 查看当前Samba连接状态
sudo smbstatus

# 查看详细连接信息
sudo smbstatus -v

# 查看特定用户的连接
sudo smbstatus -u username

# 查看共享列表
sudo smbclient -L localhost -U%

# 测试从Windows客户端访问
sudo smbclient //192.168.1.100/sharename -U username

客户端操作

# 连接到远程Samba共享
smbclient //server/sharename -U username

# 在smbclient中的常用命令
# ls - 列出文件
# get file - 下载文件
# put file - 上传文件
# mkdir dir - 创建目录
# rm file - 删除文件
# exit - 退出

# 挂载Samba共享到本地目录
sudo mount -t cifs //server/sharename /mnt/share -o username=user,password=pass

# 使用凭证文件挂载
sudo mount -t cifs //server/sharename /mnt/share -o credentials=/etc/samba/credentials

共享配置示例

公共只读共享

[public]
    comment = Public Read-Only Share
    path = /samba/public
    browseable = yes
    writable = no
    guest ok = yes
    read only = yes
    create mask = 0755

用户私有共享

[homes]
    comment = Home Directories
    browseable = no
    writable = yes
    valid users = %S
    create mask = 0700
    directory mask = 0700

组共享目录

[group_share]
    comment = Group Shared Directory
    path = /samba/group_share
    browseable = yes
    writable = yes
    valid users = @developers
    create mask = 0775
    directory mask = 0775
    force group = developers

故障排除

排查步骤:

# 1. 检查Samba服务是否运行
sudo systemctl status smb nmb

# 2. 检查防火墙设置
sudo firewall-cmd --list-all  # CentOS/RHEL
sudo ufw status               # Ubuntu

# 3. 检查SELinux状态(如有)
getenforce
sudo setenforce 0  # 临时关闭测试

# 4. 检查配置文件语法
sudo testparm -v

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

排查步骤:

# 1. 检查用户是否存在
sudo pdbedit -L

# 2. 重置用户密码
sudo smbpasswd username

# 3. 检查用户是否有访问共享的权限
# 检查smb.conf中的valid users设置

# 4. 检查系统用户和Samba用户的对应关系
id username
sudo pdbedit -Lv username

# 5. 测试本地认证
smbclient //localhost/sharename -U username

排查步骤:

# 1. 检查共享目录权限
ls -ld /path/to/share
ls -l /path/to/share

# 2. 检查Samba配置中的writable设置
# 确保共享设置为 writable = yes 或 read only = no

# 3. 检查创建掩码
# create mask 和 directory mask 设置

# 4. 检查SELinux上下文
ls -Z /path/to/share
sudo chcon -t samba_share_t /path/to/share -R

# 5. 检查force user/force group设置

安全配置建议

访问控制
  • 使用 valid users 限制访问
  • 设置 hosts allow/deny
  • 禁用匿名访问
  • 使用最小权限原则
认证安全
  • 使用强密码策略
  • 定期更换密码
  • 禁用不活跃账户
  • 启用日志审计
网络安全
  • 配置防火墙规则
  • 使用 VPN 访问
  • 禁用不必要的协议
  • 定期更新 Samba
文件安全
  • 设置合理的文件掩码
  • 使用加密传输 (SMB3)
  • 定期备份重要数据
  • 监控异常访问

高级功能配置

Active Directory 域控制器

[global]
    workgroup = EXAMPLE
    realm = EXAMPLE.COM
    server role = active directory domain controller
    dns forwarder = 8.8.8.8
    idmap_ldb:use rfc2307 = yes

打印机共享配置

[printers]
    comment = All Printers
    path = /var/spool/samba
    browseable = yes
    printable = yes
    guest ok = yes
    read only = yes
    create mask = 0700

相关命令和工具

smbclient

SMB 客户端

mount.cifs

挂载共享

nmblookup

NetBIOS 查询

findsmb

发现 SMB 主机