配置Linux服务端
1. 安装服务端
1.1 CentOS安装
# 安装服务端
$ yum install -y samba samba-client
1.2 Debian安装
# 安装服务端
$ apt-get install -y samba
2. 创建共享目录
# 创建文件夹
$ mkdir -p /file
# 给予文件夹权限
$ chmod 755 -R /file/
3. 编辑Samba配置文件
Samba完整注释内容在 /etc/samba/smb.conf.example
这个模板文件中,而 /etc/samba/smb.conf
只保留生效的配置参数
$ 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用户
# 创建一个系统用户
$ 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服务,并设置开机自启动
$ systemctl restart smb
$ systemctl enable smb
6. 开启Samba端口
# 开启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客户端工具
$ yum install -y samba-client
2. 登录用户并扫描资源
# 查看共享目录
$ smbclient -U guest -L //192.168.20.4
# 查看共享文件
$ smbclient -U guest //192.168.20.4/file
3. 挂载Samba
# [文件格式] [/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相关功能
2. 挂载Samba
在我的电脑中选择添加映射网络驱动器
输入之前配置过的Samba地址和配置的账户
完事~
docker-compose配置Samba服务端
1. 安装并启动docker
1.1 安装docker
1.1.1 CentOS安装docker
更新软件源
$ yum update -y
卸载旧的docker(按需)
$ yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
安装yum工具
$ yum install -y yum-utils
添加docker源
$ yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
安装docker及相关插件
$ yum install -y docker-ce docker-ce-cli containerd.io
启动docker并设为开机自启
$ systemctl start docker && systemctl enable docker
创建个人网络
$ docker network create veddy-base-net
配置docker国内镜像源
$ cat <<EOF>> /etc/docker/daemon.json
{
"registry-mirrors": ["https://t0gam4iy.mirror.aliyuncs.com"]
}
EOF
重启docker
$ systemctl restart docker
下载docker-compose
$ wget -O /usr/local/bin/docker-compose https://github.com/docker/compose/releases/download/v2.6.1/docker-compose-linux-x86_64
给与docker-compose权限
$ chmod 777 /usr/local/bin/docker-compose
查看docker以及docker-compose版本
$ docker --version
Docker version 20.10.17, build 100c701
$ docker-compose version
Docker Compose version v2.6.1
2. docker-compose配置
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. 服务端配置
# 修改Samba配置文件
$ vim /etc/samba/smb.conf
# 在[global]选项下加入以下内容
smb ports = 1314
# 保存配置后重启Samba
$ systemctl restart smb
2. windows客户端使用端口转发
客户端通过访问本地445然后将端口转发成访问远程端的8445端口
netsh interface portproxy add v4tov4 listenport=445 listenaddress=127.0.0.1 connectport=8445 connectaddress=192.168.20.4
后续连接至本地445就可以了 我的后缀是/file你们改成自己的即可
Samba Example示例文件翻译
部分参数注释为机翻 我也不太清楚具体作用 还请各位大佬加以指正
# ======================= 全 局 参 数 =======================
[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 \*
原因是因为被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(不推荐)
$ setenforce 0
改变SELinux(推荐)
$ chcon -t samba_share_t /file
2. 更改了默认端口以及设置了windows端口转发后依旧无法连接上Samba
解决办法1
请检查是否开启了Samba服务端 如果开启请关闭