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 = ,这两项内容必须相同。 计算机工作组和CentOS Samba conf

如果不相同,修改好 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

全部搞定,图片看看效果。 Windows访问CentOS搭建的Samba文件共享服务

四、设置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 和刚才设置的密码。 Windows访问CentOS搭建的Samba文件共享服务,输入用户名和密码

4. Windows下常见问题

这里有个经常会出现的问题,如下图,Windows不允许使用多个用户名连接同一ip的Samba服务。

Windows访问CentOS搭建的Samba文件共享服务,不允许使用多个用户名连接同一ip的Samba服务

这时需要Windows清除连接Linux的Samba服务缓存

  1. Windows命令行输入net use ,就会打印出当前的所有远程连接。
  2. 根据列表,一个个删除连接: net use 远程连接名称 /del
  3. 或者一次性全部删除: 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

其它相关文章:

CentOS访问Windows10的共享目录

Windows访问CentOS搭建的Samba文件共享服务

Windows访问CentOS搭建的NFS文件共享服务

在VMWARE虚拟机中使用宿主机的共享目录