搭建Samba共享Linux和Windows文件夹

转载 2022-08-30 16:01 Java 29

配置Linux服务端

1. 安装服务端

1.1 CentOS安装

Shell 复制代码
# 安装服务端
$ yum install -y samba samba-client

1.2 Debian安装

Shell 复制代码
# 安装服务端
$ apt-get install -y samba

2. 创建共享目录

Shell 复制代码
# 创建文件夹
$ mkdir -p /file
# 给予文件夹权限
$ chmod 755 -R /file/

3. 编辑Samba配置文件

Samba完整注释内容在 /etc/samba/smb.conf.example 这个模板文件中,而 /etc/samba/smb.conf 只保留生效的配置参数

Shell 复制代码
$ vim /etc/samba/smb.conf

# See smb.conf.example for a more detailed config file or
# read the smb.conf manpage.
# Run 'testparm' to verify the config is correct after
# you modified it.

[global]						 # 全局设置
        workgroup = SAMBA        # 工作组
        security = user			 # 这里指定samba的安全等级。关于安全等级有四种。share:用户不需要账户及密码即可登录samba服务器;user:由提供服务的samba服务器负责检查账户及密码(默认);server:检查账户及密码的工作由另一台windows或samba服务器负责;domain:指定windows域控制服务器来验证用户的账户及密码。
		#map to guest=Bad User    # 添加此项,开启免密码认证
        passdb backend = tdbsam  # passdb backend (用户后台),samba有三种用户后台:smbpasswd, tdbsam和ldapsam。smbpasswd:该方式是使用smb工具smbpasswd给系统用户(真实用户或者虚拟用户)设置一个Samba 密码,客户端就用此密码访问Samba资源。smbpasswd在/etc/samba中,有时需要手工创建该文件。tdbsam:使用数据库文件创建用户数据库。数据库文件叫passdb.tdb,在/etc/samba中。passdb.tdb用户数据库可使用smbpasswd –a创建Samba用户,要创建的Samba用户必须先是系统用户。也可使用pdbedit创建Samba账户。pdbedit命令可参考 pdbedit --help

        printing = cups
        printcap name = cups
        load printers = yes      # load printers 和 cups options 两个参数用来设置打印机相关。
        cups options = raw
        #hosts allow = 192.168.20.4 # 用来设置允许的主机,如果在前面加”;”则表示允许所有主机
        #netbios name = MYSERVER # 设置出现在“网上邻居”中的主机名
        #log file = /var/log/samba/%m.log #定义samba的日志,这里的%m是上面的netbios name
        #max log size = 50 # 指定日志的最大容量,单位是K

[homes] # 该部分内容共享用户自己的home目录,也就是说,当用户登录到samba服务器上时实际上是进入到了该用户的home目录,用户登陆后,共享名不是homes而是用户自己的标识符,对于单纯的文件共享的环境来说,这部分可以注视掉。
        comment = Home Directories
        valid users = %S, %D%w%S
        browseable = No
        read only = No
        inherit acls = Yes

[printers] # 该部分内容设置打印机共享。
        comment = All Printers
        path = /var/tmp
        printable = Yes
        create mask = 0600
        browseable = No

[print$]
        comment = Printer Drivers
        path = /var/lib/samba/drivers
        write list = @printadmin root
        force group = @printadmin
        create mask = 0664
        directory mask = 0775
        
[file] # 共享目录显示的名称
		comment=hello guest      #描述信息(可以自定义)
		path=/file               #共享的目录
		browseable=yes           #共享目录是否对所有人可见
		guest ok=no              #允许匿名用户访问
		#writable=yes             #匿名用户可写
		#public=yes               #所有人可见
		writable=yes             #可写

4. 创建一个用户并转为Samba用户

Shell 复制代码
# 创建一个系统用户
$ useradd -M -s /sbin/nologin guest      
# 将系统用户转化成Samba用户
$ pdbedit -a guest 

new password:
retype new password:
Unix username:        guest
NT username:
Account Flags:        [U          ]
User SID:             S-1-5-21-2500030998-3215874083-1041928306-1001
Primary Group SID:    S-1-5-21-2500030998-3215874083-1041928306-513
Full Name:
Home Directory:       \\localhost\guest
HomeDir Drive:
Logon Script:
Profile Path:         \\localhost\guest\profile
Domain:               LOCALHOST
Account desc:
Workstations:
Munged dial:
Logon time:           0
Logoff time:          Wed, 06 Feb 2036 10:06:39 EST
Kickoff time:         Wed, 06 Feb 2036 10:06:39 EST
Password last set:    Mon, 05 Nov 2018 06:23:37 EST
Password can change:  Mon, 05 Nov 2018 06:23:37 EST
Password must change: never
Last bad password   : 0
Bad password count  : 0
Logon hours         : FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

# 列出所有Samba用户
$ pdbedit -L
guest:1001:

5. 重启SMB服务,并设置开机自启动

Shell 复制代码
$ systemctl restart smb
$ systemctl enable smb

6. 开启Samba端口

Shell 复制代码
# 开启137、138、139、445端口
$ firewall-cmd --add-port=137/udp --zone=public --permanent
$ firewall-cmd --add-port=138/udp --zone=public --permanent
$ firewall-cmd --add-port=139/tcp --zone=public --permanent
$ firewall-cmd --add-port=445/tcp --zone=public --permanent
$ firewall-cmd --reload

# 或者直接关闭防火墙
$ systemctl stop firewalld
$ systemctl disable firewalld

配置Linux客户端

1. 安装Linux客户端工具

Shell 复制代码
$ yum install -y samba-client

2. 登录用户并扫描资源

Shell 复制代码
# 查看共享目录
$ smbclient -U guest -L //192.168.20.4

# 查看共享文件
$ smbclient -U guest //192.168.20.4/file

3. 挂载Samba

Shell 复制代码
# [文件格式]  [/smb_file共享目录][挂载到/mnt] [username=smb用户名][password=smb密码]
$ mount -t cifs //192.168.20.4/file /file -o username=guest,password=guest
$ df -h

文件系统                 容量  已用  可用 已用% 挂载点
//192.168.20.4/file    50G   13G  38G 26%  /file

配置Windows客户端

1. 开启SMB配置

Win+R 输入control 打开控制面板

在控制面板内找到 程序 -> 启用或关闭windows功能 然后勾选上SMB相关功能

windwos功能开启

2. 挂载Samba

在我的电脑中选择添加映射网络驱动器

映射网络驱动器

输入之前配置过的Samba地址和配置的账户

添加映射网络文件夹

完事~

完成

docker-compose配置Samba服务端

1. 安装并启动docker

1.1 安装docker

1.1.1 CentOS安装docker

更新软件源

Shell 复制代码
$ yum update -y

卸载旧的docker(按需)

Shell 复制代码
$ yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine

安装yum工具

Shell 复制代码
$ yum install -y yum-utils

添加docker源

Shell 复制代码
$ yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

安装docker及相关插件

Shell 复制代码
$ yum install -y docker-ce docker-ce-cli containerd.io

启动docker并设为开机自启

Shell 复制代码
$ systemctl start docker && systemctl enable docker

创建个人网络

Shell 复制代码
$ docker network create veddy-base-net

配置docker国内镜像源

Shell 复制代码
$ cat <<EOF>> /etc/docker/daemon.json
{
"registry-mirrors": ["https://t0gam4iy.mirror.aliyuncs.com"]
}
EOF

重启docker

Shell 复制代码
$ systemctl restart docker

下载docker-compose

Shell 复制代码
$ wget -O /usr/local/bin/docker-compose https://github.com/docker/compose/releases/download/v2.6.1/docker-compose-linux-x86_64

给与docker-compose权限

Shell 复制代码
$ chmod 777 /usr/local/bin/docker-compose

查看docker以及docker-compose版本

Shell 复制代码
$ docker --version
Docker version 20.10.17, build 100c701
$ docker-compose version
Docker Compose version v2.6.1

2. docker-compose配置

yaml 复制代码
version: "3.7"

networks:
  veddy-base-net:
    driver: bridge

services:
  samba:
    image: dperson/samba
    container_name: samba
    restart: on-failure
    networks:
      - veddy-base-net
    command: '
                -u "guest;guest123"
                -s "shared;/shared;no;no;no;guest"'
    volumes:
      - /shared:/shared
    ports:
      - 137:137/udp
      - 138:138/udp
      - 139:139/tcp
      - 445:445/tcp

Samba更改默认端口

1. 服务端配置

Shell 复制代码
# 修改Samba配置文件
$ vim /etc/samba/smb.conf
# 在[global]选项下加入以下内容
smb ports = 1314
# 保存配置后重启Samba
$ systemctl restart smb

2. windows客户端使用端口转发

客户端通过访问本地445然后将端口转发成访问远程端的8445端口

bash 复制代码
netsh interface portproxy add v4tov4 listenport=445 listenaddress=127.0.0.1 connectport=8445 connectaddress=192.168.20.4

后续连接至本地445就可以了 我的后缀是/file你们改成自己的即可

连接至服务

Samba Example示例文件翻译

部分参数注释为机翻 我也不太清楚具体作用 还请各位大佬加以指正

Shell 复制代码
# ======================= 全 局 参 数 =======================
[global]
# ----------------------- 网络相关选项 -----------------------
	# 设定Samba所要加入的工作组或者域
	workgroup = WORKGROUP
	# 设定Samba Server的注释 %v代表版本 一般不建议显示版本号 以防针对某一版本漏洞进行攻击
	server string = Samba Server Version %v
	# 设置Samba Server的NetBIOS名称 用于指定不与主机名绑定的服务器名称 最多15个字符 如果不填 则默认会使用该服务器的DNS名称的第一部分 netbios name和workgroup名字不要设置成一样
	netbios name = MYSERVER
	# 设置Samba Server监听哪些网卡,可以写网卡名,也可以写该网卡的IP地址
	interfaces = lo eth0 192.168.12.2/24 192.168.13.2/24
	# 表示允许连接到Samba Server的客户端 多个参数以空格隔开 可以用一个IP表示 也可以用一个网段表示
	hosts allow = 127. 192.168.12. 192.168.13.
# ----------------------- 日志记录选项 -----------------------
	# 日志路径 %m 是一个变量 标识Netbios主机名
	log file = /var/log/samba/log.%m
	# 日志最大大小 单位是kb
	max log size = 50
# ---------------------- 独立服务器选项 ----------------------
	# 指定samba的安全等级 关于安全等级有四种
	# share:用户不需要账户及密码即可登录samba服务器
	# user:由提供服务的samba服务器负责检查账户及密码(默认)
	# server:检查账户及密码的工作由另一台windows或samba服务器负责
	# domain:指定windows域控制服务器来验证用户的账户及密码。
	security = user
	# passdb backend(用户后台)samba有三种用户后台:smbpasswd, tdbsam和ldapsam
	# smbpasswd:该方式是使用smb工具smbpasswd给系统用户(真实用户或者虚拟用户)设置一个Samba密码 客户端就用此密码访问Samba资源 smbpasswd在/etc/samba中 有时需要手工创建该文件
	# tdbsam:使用数据库文件创建用户数据库 数据库文件叫passdb.tdb在/etc/samba中 passdb.tdb用户数据库可使用smbpasswd –a创建Samba用户 要创建的Samba用户必须先是系统用户 也可使用pdbedit创建Samba账户 pdbedit命令可参考pdbedit --help
	# ldapsam:该方式则是基于LDAP的账户管理方式来验证用户 首先要建立LDAP服务 然后设置passdb backend = ldapsam:ldap://LDAP Server
	passdb backend = tdbsam
# ---------------------- 域成员选项 ----------------------
	# 配置注解如上
	security = domain
	# 配置注解如上
	passdb backend = tdbsam
	# 所有的成员必须在一个realm中 并且realm必须为大写
	realm = MY_REALM
	# 默认值为* 通过赐选项指定域控制器名称 可以让Samba使用特定远程服务器进行用户名/密码验证
	# 示例值 password server = windc.mydomain.com:389 192.168.1.101 *
	password server = *
# ---------------------- 域控制选项 ----------------------
	# 配置注解如上 域控制必须为user
	security = user
	# 配置注解如上
	passdb backend = tdbsam
	# 将该Samba指定为域主 允许Samba整理多个子网之间的浏览列表 控制器只能存在一个 如果已经有一个的话就不要启动该选项
	domain master = yes
	# 允许Samba为windows提供网络登录服务
	domain logons = yes
	# 指定再客户端登陆时运行的脚本 脚本名必须在NETLOGON的共享中提供
	# %m为机器名
	logon script = %m.bat
	# 存储用户配置文件的位置
	logon path = \\%L\Profiles\%u
	# 可以在域控制器上或者单机上使用脚本来做出相应的添加上山账户
	add user script = /usr/sbin/useradd "%u" -n -g users
	add group script = /usr/sbin/groupadd "%g"
	add machine script = /usr/sbin/useradd -n -c "Workstation (%u)" -M -d /nohome -s /bin/false "%u"
	delete user script = /usr/sbin/userdel "%u"
	delete user from group script = /usr/sbin/userdel "%u" "%g"
	delete group script = /usr/sbin/groupdel "%g"
# ---------------------- 浏览控制选项 ----------------------
	# 设置为no时Samba不会成为你网络上的主浏览器 设置为yes时将会正常的选举应用
	local master = no
	# 选举优先级
	os level = 33
	# 首选服务器 当设置为yes时Samba在启动时强制进行本地浏览器选举并给自己更高的选举机会
	preferred master = yes
# ------------------------ 名称解析 ------------------------
	# 名称解析是对windows internet名称服务(WINS)的支持
	# 设置为yes时 Samba的NMBD组将将启用其WINS服务器
	wins support = yes
	# 告诉Samba的NMBD组件将要成为WINS客户端
	wins server = w.x.y.z
	# 设置为yes时Samba代表不支持WINS客户端回答名称解析查询 为此网络上必须至少有哦一个WINS服务器 默认为no
	wins proxy = yes
	# 设置为yes时Samba会尝试通过DNS nslookups解析NetBIOS名称
	dns proxy = yes
# ------------------------ 打印选项 ------------------------
	# 设置为yes时将会自动加载打印机列表而不是单独设置他们
	load printers = yes
	# 允许将选项传递给CUPS库 例如设置值为raw允许在windows客户端上使用驱动程序
	cups options = raw
	# 用于指定替代的printcap文件
	printcap name = /etc/printcap
	# 在 UNIX System V 系统上自动获取打印机列表
	printcap name = lpstat
	printing = cups
# ------------------------ 文件系统 ------------------------
	# 如果文件系统支持扩展属性并启用了这些属性(通常通过user_xattr挂载选项) 则可以取消注释本届中的选项 这些选项允许管理员指定DOS属性存储在扩展属性中并确保Samba不会更改权限位
	# 这些选项可以在每个分享上使用 在该全局属性[global]中使用他们将成为所有共享的默认值
	map archive = no
	map hidden = no
	map read only = no
	map system = no
	store dos attributes = yes

踩坑

客户端

1. 查看共享文件时ls报错NT_STATUS_ACCESS_DENIED listing \*

NT_STATUS_ACCESS_DENIED listing

原因是因为被SELinux阻挡了

Samba的example文件中也有SELinux相关说明

复制代码
# If you create a new directory, such as a new top-level directory, label it
# with samba_share_t so that SELinux allows Samba to read and write to it. Do
# not label system directories, such as /etc/ and /home/, with samba_share_t, as
# such directories should already have an SELinux label.

# Run the "ls -ldZ /path/to/directory" command to view the current SELinux
# label for a given directory.

# Set SELinux labels only on files and directories you have created. Use the
# chcon command to temporarily change a label:
# chcon -t samba_share_t /path/to/directory

# Changes made via chcon are lost when the file system is relabeled or commands
# such as restorecon are run.

# Use the samba_export_all_ro or samba_export_all_rw Boolean to share system
# directories. To share such directories and only allow read-only permissions:
# setsebool -P samba_export_all_ro on
# To share such directories and allow read and write permissions:
# setsebool -P samba_export_all_rw on

# To run scripts (preexec/root prexec/print command/...), copy them to the
# /var/lib/samba/scripts/ directory so that SELinux will allow smbd to run them.
# Note that if you move the scripts to /var/lib/samba/scripts/, they retain
# their existing SELinux labels, which may be labels that SELinux does not allow
# smbd to run. Copying the scripts will result in the correct SELinux labels.
# Run the "restorecon -R -v /var/lib/samba/scripts" command as the root user to
# apply the correct SELinux labels to these files.

有关于SELinux的介绍: https://blog.csdn.net/qq_43710889/article/details/108459729

解决办法

关闭SELinux(不推荐)

Shell 复制代码
$ setenforce 0

改变SELinux(推荐)

Shell 复制代码
$ chcon -t samba_share_t /file

2. 更改了默认端口以及设置了windows端口转发后依旧无法连接上Samba

解决办法1

请检查是否开启了Samba服务端 如果开启请关闭

windwos功能开启

解决办法2

转自 https://blog.csdn.net/rocson001/article/details/86717722/


还有一些内容没写完 文章将会继续更新

点赞
收藏
关注
转发
本文作者: Veddy
版权声明: 本博客所有文章除特别声明外,均采用 CC BY 4.0 CN协议进行许可。转载请署名作者且注明文章出处。
文章目录