Windows访问CentOS搭建的Samba文件共享服务
关于Samba所有你想知道的都记录在这里了
零、先说明具体环境
Windows 10专业版 1909,18363.778
VMware Workstation Pro 15.5.0
VMware 安装 CentOS 7.7,最小化安装,ip为: 192.168.1.32, hostname: pxecentos7
这里下载 CentOS 7.7 安装包ISO文件,942MB
注意Vmware的虚拟机网络,要选择 【桥接模式】,这样其它机子才能访问到虚拟机。
一、CentOS安装配置Samba服务
yum -y install samba samba-client
修改配置文件
vi /etc/samba/smb.conf
全部内容为:
[global]
workgroup = WORKGROUP
server string = Samba Server Version %v
log file = /var/log/samba/log.%m
max log size = 50
map to guest = Bad User
passdb backend = tdbsam
security = USER
guest account = nobody
public = Yes
dns proxy = No
nt acl support = No
kernel oplocks = no
# hosts allow = 192.168.1.0/255.255.255.0
[data]
comment = CentOS Samba Data
path = /data
read only = No
browseable = yes
public = yes
printable = no
guest ok = yes
【注意】上面配置了一个有完整读写权限,并且不需要密码的共享目录 /data ,你应该知道这里的风险。
验证配置文件并启动服务:
testparm
systemctl start smb
systemctl start nmb
二、安装使用过程中碰到的问题
第1个坑:
如果只启动了 smb,没有启动 nmb,那么Windows可以通过ip地址直接访问Samba,类似这样子 \\192.168.1.32\data
能够成功;但是不能使用主机名字(域名)访问,类似 \\pxecentos7\data
这样访问失败。
组成Samba运行的有两个服务,一个是smb,另一个是nmb;
smb 是 Samba 的核心启动服务,主要负责建立 Linux Samba服务器与Samba客户机之间的对话,验证用户身份并提供对文件和打印系统的访问,只有smb 服务启动,才能实现文件的共享,smb 监听139和445 TCP端口;
nmb 服务是负责解析用的,类似与DNS实现的功能,可以把Linux系统共享的工作组名称与其IP对应起来,如果nmb服务没有启动,就只能通过IP来访问共享文件,nmb 监听137和138 UDP端口。
可以检查一下CentOS端口使用情况,来确认一下。
yum -y install net-tools
netstat -tulpn | grep [sn]mb
应该要有监听 137,138,139,445 总共四个端口。
第2个坑:
Windows上 Win+R 直接 \\192.168.1.32\data
地址访问Samba正常,但是 文件资源管理器 的 【网络】(网上邻居)里面没有显示。
Win10,此电脑,右键,属性,查看计算机的当前工作组。 检查/etc/samba/smb.conf
配置文件里面的 workgroup =
,这两项内容必须相同。
如果不相同,修改好 smb.conf 配置后,重启 smb, nmb 两个服务。(或者修改Win10的工作组后重启Windows)
这样改一致后,在Win10的【网络】(网上邻居)里面还是没有显示。原因是:
因安全原因,Win10的1709版本之后默认关闭了 SMB1.0/CIFS文件共享支持,导致linux系统使用Samba软件开启的共享在Win10的【网络】中不能被发现。网上大多数的解决办法是启用Win10的SMB1.0/CIFS文件共享支持,但这个方法只对支持SMB1协议的共享端有效,如共享端强制使用SMB1之上协议,在【网络】中还是发现不了共享主机。
这都 2020 年啦,你确定还要使用 1983 年的 SMB1.0协议吗?三十多年了,不管是从安全,还是从传输速度考虑都不应该用它。
正确的解决方法是使用Web Services Dynamic Discovery
服务,现在可以使用github上的wsdd这个python3程序。无需设置Win10即可发现共享主机。
yum -y install unzip wget python3
wget https://github.com/christgau/wsdd/archive/master.zip
unzip master.zip
cp wsdd-master/src/wsdd.py /usr/bin/wsdd
cp wsdd-master/etc/systemd/wsdd.service /lib/systemd/system
设置完成后,启动 systemctl start wsdd
查看状态 systemctl status wsdd
如果启动成功后在Win10的【网络】(网上邻居)中还是没有出现共享的Samba主机,则需要检测是否是CentOS防火墙屏蔽了3702、5357
这两个端口。
简单粗暴的先把安全防护都关掉: (你应该知道这里有风险)
systemctl stop firewalld
setenforce 0
第3个坑:
访问Samba正常,但是只能读,不能写,不能创建目录。
先确认/etc/samba/smb.conf
配置文件内容,
再确认目录权限,试试777:
chmod 777 /data
三、设置开机自动运行Samba服务
systemctl enable smb
systemctl enable nmb
systemctl enable wsdd
全部搞定,图片看看效果。
四、设置Samba用户名和密码
1. 修改Samba配置文件
vi /etc/samba/smb.conf
增加以下内容
[doc]
comment = CentOS Samba Doc (需要用户名密码)
path = /doc
read only = No
browseable = Yes
public = No
printable = No
guest ok = No
create mask = 0664
directory mask = 0775
并确保[global]区域中,这两项设置正确
passdb backend = tdbsam
security = USER
上面设置使用tdbsam方式来保存Samba的用户名密码。
该方式则是使用一个数据库文件来建立用户数据库。数据库文件默认为 /var/lib/samba/private/passdb.tdb
2. 建立Samba账户
我们可以使用pdbedit命令来建立Samba账户,具体用法如下:
要注意,建立的Samba用户必须首先是Linux系统用户。
pdbedit -a username :新建Samba账户
pdbedit -x username :删除Samba账户。
pdbedit -L :列出Samba用户列表,读取passdb.tdb数据库文件。
pdbedit -Lv :列出Samba用户列表的详细信息。
pdbedit -c "[D]" -u username :暂停该Samba用户的账号。
pdbedit -c "[]" -u username :恢复该Samba用户的账号。
这里先创建2个Linux系统用户,并设置密码为123456:
groupadd smbgroup
adduser -g smbgroup -s /sbin/nologin smbuser1
adduser -g smbgroup -s /sbin/nologin smbuser2
echo 123456 | passwd --stdin smbuser1
echo 123456 | passwd --stdin smbuser2
再用pdbedit创建Samba帐号。
[root@pxecentos7 ~]# pdbedit -a smbuser3
new password:
retype new password:
Failed to add entry for user smbuser3.
[root@pxecentos7 ~]# pdbedit -a smbuser1
new password:
retype new password:
Unix username: smbuser1
NT username:
Account Flags: [U ]
User SID: S-1-5-21-0000000000-0000000000-0000000000-1000
Primary Group SID: S-1-5-21-0000000000-0000000000-0000000000-513
Full Name:
Home Directory: \\pxecentos7\smbuser1
HomeDir Drive:
Logon Script:
Profile Path: \\pxecentos7\smbuser1\profile
Domain: PXECENTOS7
Account desc:
Workstations:
Munged dial:
Logon time: 0
Logoff time: 三, 06 2月 2036 23:06:39 CST
Kickoff time: 三, 06 2月 2036 23:06:39 CST
Password last set: 六, 25 4月 2020 00:42:44 CST
Password can change: 六, 25 4月 2020 00:42:44 CST
Password must change: never
Last bad password : 0
Bad password count : 0
Logon hours : FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
[root@pxecentos7 ~]# pdbedit -L
smbuser1:1000:
可以看到我们创建Samba帐号 smbuser3 是失败了。原因是Linux系统没有smbuser3这个用户,而 smbuser1 创建成功了。
要注意这里 重新设置了Samba帐号 smbuser1的密码,这个是访问共享目录要输入的密码,可以跟登录Linux系统的用户密码【不相同】。
3. 设置目录读写权限
现在设置目录读写权限,然后重启Samba服务
chown -R smbuser1:smbgroup /doc/
chmod -R 775 /doc/
systemctl restart smb
然后就可以在Windows上正常访问 \\192.168.1.32\doc
,弹出的输入框里,填入 smbuser1 和刚才设置的密码。
4. Windows下常见问题
这里有个经常会出现的问题,如下图,Windows不允许使用多个用户名连接同一ip的Samba服务。
这时需要Windows清除连接Linux的Samba服务缓存
- Windows命令行输入
net use
,就会打印出当前的所有远程连接。 - 根据列表,一个个删除连接:
net use 远程连接名称 /del
- 或者一次性全部删除:
net use * /del
删除完之后,就可以正常访问 \\192.168.1.32\doc
输入用户密码名啦。
5. 将Windows常用命令建立批处理
建立磁盘映射:
net use Z: \\192.168.1.32\doc 123456 /user:smbuser1
Z: 映射到Windows的哪个磁盘
\\192.168.1.32\doc 远程Samba的目录
123456 Samba用户密码
smbuser1 Samba用户名
删除磁盘映射:
net use * /del /y
* 所有映射到windows的磁盘盘符,也可以指定具体的如 Z: Y:
/y 如果不加这个,每次都会提示你是否删除磁盘映射
将两行常用命令,建立两个批处理.bat文件,点击即可运行。
6. Windows开机自动建立Samba磁盘映射
【Win+R】打开“运行” —> 输入 gpedit.msc
—> 打开组策略 —> 选择“计算机配置” —> 选择“Windows设置” —> 选择“脚本(启动/关机)” —> 选择“启动” —> 点击“添加” —> 选择上一步骤刚创建好的.bat脚本文件。
五、在另一台Linux系统上访问Samba共享目录
yum -y install samba-client cifs-utils
smbclient -L //192.168.1.32 -N
mount.cifs //192.168.1.32/data /mnt/data
mount.cifs -o username="用户名",password="密码" //192.168.1.32/doc /mnt/doc
umount /mnt/data