Debian13部署SMB

一、安装 Samba 服务

安装依赖sambasamba-common-binsmbclientcifs-utils

apt install samba samba-common-bin -y

#samba:
#  smbd提供SMB/CIFS服务,监听TCP的139和445
#  nmbd提供NetBIOS名称解析,监听UDP的137和138端口
#samba-common-bin:包含了Samba服务的一些常用命令行工具,使用net命令来管理
#smbclient:命令行工具,提供交互式和非交互式两种访问方式,支持文件上传/下载、目录操作、权限管理等,功能类似FTP客户端,适合脚本集成自动化完成文件传输任务
#cifs-utils:提供挂载和管理CIFS/SMB文件系统的工具

查看 Samba 版本信息:

smbd --version

检查服务状态:

systemctl status smbd nmbd

启动服务并设置开机自启:

systemctl enable smbd nmbd

二、配置 Samba

1.备份默认配置

cp /etc/samba/smb.conf /etc/samba/smb.conf.bak.$(date +%Y%m%d)

2.编辑主配置文件

vim /etc/samba/smb.conf

修改 [global] 部分:

[global]
   workgroup = WORKGROUP       # Windows 默认工作组,保持一致即可
   server string = Debian 13 Samba Server  # 服务器描述
   netbios name = DEB-SMB      # 网络中显示的主机名(可选)
   security = user             # 用户认证模式(最常用)
   map to guest = Bad User     # 未认证用户映射为 guest(匿名)
   dns proxy = no              # 关闭 DNS 代理
   log file = /var/log/samba/log.%m  # 日志文件
   max log size = 1000         # 日志最大 1MB
   panic action = /usr/share/samba/panic-action %d
   server role = standalone server  # 独立文件服务器
   obey pam restrictions = yes
   unix password sync = yes
   passdb backend = tdbsam     # 用户数据库格式
   pam password change = yes
   usershare allow guests = yes

在 /etc/samba/smb.conf 文件末尾添加以下内容:

示例 1:私有用户共享(需账号密码)

[PrivateShare]
   comment = Private Files for Authorized Users
   path = /srv/samba/private       # 共享目录路径
   ;browseable = yes                # 网络中可见
   ;read only = no                  # 可写 yes默认只读
   ;guest ok = no                   # 禁止匿名访问(需账号认证,更安全)
   valid users = @sambausers       # 仅允许 sambausers 组用户访问
   write list = @sambausers        # 指定有写入权限的用户或组
   create mask = 0664              # 新建文件权限
   directory mask = 0775           # 新建目录权限
   force group = sambausers        # 强制归属组

权限优先级

write list > read list > 共享默认读写设置(如read only)

#所有sambausers组成员可读写,无需write list。
valid users=@sambausers`
writable=yes
#sambashare组可访问,但仅mkt_managers组可写入。
valid users=@sambausers
read only=yes
write list=@mkt_managers

示例 2:公共匿名共享(无需密码)

[PublicShare]
   comment = Public Anonymous Share
   path = /srv/samba/public        # 共享目录路径
   browseable = yes                # 网络中可见
   read only = no                  # 可写
   guest ok = yes                  # 允许匿名访问
   force user = nobody             # 匿名用户映射为 nobody
   force group = nogroup           # 强制归属组
   create mask = 0666              # 新建文件权限
   directory mask = 0777           # 新建目录权限

3.配置共享目录

创建目录并授权

# 创建共享目录private和public
mkdir -p /srv/samba/{private,public}
# 1. 私有共享:创建专用用户组并授权
# 创建用户组
groupadd sambausers
chown -R root:sambausers /srv/samba/private
#2770其他用户无权限,也可用改775其他用户读、执行,无写权限
#2775组可读写,其他用户只读,粘滞位防止误删
chmod -R 2770 /srv/samba/private

# 2. 公共共享:授权匿名访问
chown -R nobody:nogroup /srv/samba/public
chmod -R 2777 /srv/samba/public

三、创建 Samba 用户

Samba 使用独立的用户数据库,需将 Linux 系统用户添加为 Samba 用户。

1. 添加系统用户(如已有则跳过)

# 创建 Samba 用户组
groupadd sambausers
# 创建用户 admin 并加入 sambausers 组
useradd -m -G sambausers admin  
# 也可以先创建无shell的系统用户
useradd -M -s /usr/sbin/nologin admin01
#将用户加入sambateam组
usermod -aG sambausers admin01

Samba 用户必须基于系统用户创建,但 Samba 用户可以拥有与系统用户不同的密码。如果只需要 Samba 访问权限而不需要登录 Shell,可以将系统用户的 Shell 设置为 /usr/sbin/nologin,以提高安全性。

创建系统用户(无需家目录和登录权限,无shell的系统用户):

useradd -M -s /usr/sbin/nologin -G sambausers admin

2. 创建 Samba 用户密码

smbpasswd -a admin
# 按提示输入两次 SMB 密码(与系统密码可不同)

3. 管理 Samba 用户(常用命令)

# 列出所有 Samba 用户
pdbedit -L
pdbedit -L -v
# 修改 Samba 用户密码
smbpasswd admin

smbpasswd 命令的常用选项包括:

# -a 添加新用户;-x 删除用户;-d 禁用用户;-e 启用用户;-n 设置空密码
# 启用用户(默认添加后是禁用状态)
smbpasswd -e admin
# 删除 Samba 用户
smbpasswd -x admin

四、启动 / 重启 Samba 服务

# 重启服务
systemctl restart smbd nmbd
# 设置开机自启
systemctl enable smbd nmbd
# 检查服务状态
systemctl status smbd nmbd

五、防火墙配置

防火墙放行 Samba 端口:

# 放行 Samba 服务
ufw allow Samba
#如果需要更精细的控制,也可以手动开放各个端口:
ufw allow 139/tcp
ufw allow 445/tcp
ufw allow 137/udp
ufw allow 138/udp
ufw reload
#指定IP段开放端口
ufw allow from 192.168.1.0/24 to any port 139,445 proto tcp
ufw allow from 192.168.1.0/24 to any port 137:138 proto udp
# 查看规则
ufw status numbered

#确保防火墙默认阻止所有传入连接,仅允许显式定义的规则:
#deny incoming(拒绝所有入站流量)
#allow outgoing(允许所有出站流量)
#规则优先级:编号越小优先级越高(如规则1优先于规则4)
#默认拒绝规则:通常显示为Anywhere DENY IN Anywhere,位于最后
ufw default deny incoming

#在特定位置插入规则,使用insert命令
ufw insert 1 allow from 192.168.1.50 to any port 22 proto tcp

#出站规则
#默认拒绝所有出站流量
ufw default deny outgoing
# 出站允许DNS查询
ufw allow out to 8.8.8.8 port 53 proto udp
# 允许出站TCP 80和443端口(逗号分隔多端口)
ufw allow out proto tcp to any port 80,443
# 简写形式
ufw allow out 80/tcp

#重置UFW
ufw --force reset

六、测试并挂载 SMB

本地smbclient测试

#安装smbclient命令
apt install smbclient

# 测试匿名访问公共共享
smbclient //localhost/PublicShare -N

#列出服务器共享(匿名访问用 -N)
smbclient -L localhost -U admin
smbclient -L //192.168.1.100/ -N

# 测试admin用户认证访问私有共享
smbclient //localhost/PrivateShare -U admin
# 输入 admin 的 SMB 密码

#或者交互式访问
smbclient //192.168.0.1/tmp -U username%password
#非交互式访问列出目录并退出 -c
smbclient //192.168.0.1/tmp -U username%password -c "ls; exit"

#文件传输示例
## 下载文件
smbclient //192.168.0.1/tmp -U username%password -c "get remote_file.txt local_file.txt"
## 上传文件
smbclient //192.168.0.1/tmp -U username%password -c "put local_file.txt remote_file.txt"

smbclient交互界面常用命令

命令作用示例
ls列出当前目录文件ls
cd切换目录cd docs
pwd查看当前远程目录pwd
get 文件名下载文件到本地get test.txt
put 文件名上传本地文件到远程put local.txt
mget 通配符批量下载(如 *.txt)mget *.log
mput 通配符批量上传mput *.pdf
mkdir 目录创建远程目录mkdir new_folder
rm 文件名删除远程文件rm old.txt
rmdir 目录删除远程空目录rmdir empty_folder
exit/quit退出交互界面exit
help查看所有支持的命令help

进阶参数:

参数作用示例
-p 端口指定非默认 SMB 端口(默认 445)smbclient -L //192.168.1.100/ -p 1445 -N
--password=密码直接指定密码(脚本用,注意安全)smbclient //192.168.1.100/PrivateShare -U alice --password=123456
-d 级别开启调试模式(1-10,级别越高越详细)smbclient -L //192.168.1.100/ -N -d 3
-k使用 Kerberos 认证(域环境)smbclient //dc01.domain.com/Share -U alice@DOMAIN.COM -k

Linux挂载cifs-utils

临时挂载

#安装挂载工具cifs-utils
apt install cifs-utils
# 挂载私有共享
mount -t cifs //192.168.1.1/share /mnt/share -o user=smbuser,password=你的密码

# 挂载公共共享
mount -t cifs //192.168.1.1/PublicShare /mnt/public -o guest

永久挂载密码外置或内置

# 步骤1:创建密码文件(权限必须 600,否则挂载失败)
mkdir -p /etc/smbcredentials
vim /etc/smbcredentials/admin.cred
# 写入以下内容
username=admin
password=你的SMB密码

# 步骤2:设置权限(关键!)
chmod 600 /etc/smbcredentials/admin.cred
chown root:root /etc/smbcredentials/admin.cred

# 步骤3:编辑 fstab
vim /etc/fstab
# 添加行(引用密码文件)
//192.168.1.100/PrivateShare /mnt/smb_private cifs credentials=/etc/smbcredentials/admin.cred,uid=1000,gid=1000,file_mode=0644,dir_mode=0755 0 0
#密码写到fstab里
//192.168.1.100/PrivateShare /mnt/smb_private cifs username=admin,password=123456,uid=1000,gid=1000,file_mode=0644,dir_mode=0755 0 0
# 步骤4:测试挂载
mount -a

指定 SMB 3.0 协议 + 中文支持

mount -t cifs //192.168.1.100/PrivateShare /mnt/smb_private -o username=admin,password=123456,uid=1000,gid=1000,vers=3.0,iocharset=utf8

七、常见问题排查

无法访问共享

# 检查语法错误
testparm
# 检查  smbd / nmbd 服务是否运行:systemctl status smbd
# 检查防火墙是否放行: ufw status
# 检查共享目录权限:ls -ld /srv/samba/private
# 查看日志:tail -f /var/log/samba/log.smbd

权限不足(无法写入)

# 确认 smb.conf 中 read only = no、writable = yes
# 确认文件系统权限(chmod / chown)与 Samba 配置一致
# 检查 valid users/force group 配置

Windows 看不到服务器

# 确保  nmbd 服务运行
# 检查 workgroup 与 Windows 一致
# 尝试直接用 IP 访问(\\IP)

八、安全加固建议

禁用匿名共享(guest ok = no

限制 valid users 为特定用户 / 组

使用强密码,定期轮换

配置 hosts allow 限制访问 IP:

#在 `[global]` 中添加
# 仅允许局域网访问
hosts allow = 192.168.1.0/24 172.16.1.9
hosts deny = all

启用详细日志:

log level = 2
log file = /var/log/samba/log.%m
max log size = 1000

中文文件名乱码:

#在 [global] 中添加 
unix charset = UTF-8
display charset = UTF-8

并发连接数限制:

#默认并发连接数没有限制
max connections = 100