Debian13部署SMB
一、安装 Samba 服务
安装依赖samba、samba-common-bin、smbclient和cifs-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