一、认识samba
来自官网首页翻译:
Samba是用于Linux和Unix的标准Windows互操作性程序套件。
Samba是根据GNU通用公共许可授权的免费软件,Samba项目是软件自由保护协会的成员。
自1992年以来,Samba为所有使用SMB/CIFS协议的客户端提供了安全、稳定和快速的文件和打印服务,如所有版本的DOS和Windows、OS/2、Linux和许多其他版本。
Samba是一个重要的组件,将Linux/Unix服务器和桌面无缝集成到Active Directory环境中的。它既可以作为域控制器,也可以作为常规域成员。
1. Samba协议基础
在NetBIOS 出现之后,Microsoft就使用NetBIOS实现了一个网络文件/打印服务系统,这个系统基于NetBIOS设定了一套文件共享协议, Microsoft称之为SMB(Server Message Block)协议。这个协议被Microsoft用于它们Lan Manager和Windows NT服务器系统中,实现不同计算机之间共享打印机、串行口和通讯抽象(如命名管道、邮件插槽等)。
随着 Internet的流行,Microsoft希望将这个协议扩展到Internet上去,成为Inter net上计算机之间相互共享数据的一种标准。因此它将原有的几乎没有多少技术文档的SMB协议进行整理,重新命名为 CIFS(Common Internet File System),并打算将它与NetBIOS相脱离,试图使它成为Internet上的一个标准协议。
CIFS是公共的或开放的SMB协议版本,并由Microsoft使用。SMB协议(见最后的名词解释)现在是局域网上用于服务器文件访问和打印的协议。象SMB协议一样,CIFS在高层运行,而不象TCP/IP协议那样运行在底层。CIFS可以看做是应用程序协议如文件传输协议和超文本传输协议的一个实现。
二、samba安装
1. samba rpm安装
CentOS7安装配置Samba服务
参考URL: https://blog.51cto.com/hld1992/2296358
1, CentOS7上直接使用yum安装samba, samba-client即可。
# yum install samba samba-client
2,安装完成后,检查下结果
# rpm -qa samba-client samba
samba-client-4.7.1-9.el7_5.x86_64
samba-4.7.1-9.el7_5.x86_64
2. samba编译安装
官方参考: https://wiki.samba.org/index.php/Build_Samba_from_Source
2.1 samba编译步骤
- 在编译安装samba之前我们需要,安装sambe相关依赖的软件
https://wiki.samba.org/index.php/Package_Dependencies_Required_to_Build_Samba
以下是构建和安装Samba所需的独立于操作系统的库和程序列表
强制的依赖如上图所示:
python:有一些工具是python写的,并且 构建系统Waf也是python写的(即你要编译samba必须转python)
使用源码自带脚本 install_with_python.sh 安装pyhon,该脚本会自动配置所需要的相关环境变量。
samba.org::ftp/tridge/python/Python-2.6.5.tar
如果服务环境没有外网,直接访问如下网址,在samba官网下载脚本下载的对应python
https://www.samba.org/ftp/tridge/
注意,经过测试发现可以不用单独安装这里的python,这里的python安装目的是 一些samba作为 ad dc时才会用到,我们在./configure 时可以加参数 --disable-python --without-ad-dc
因此这里的强制依赖不用非常关注- -!
- 获取源代码包并进行解压
我们将源代码包放在目录/home/samba下
tar -zxvf samba-4.10.6.tar.gz
- 配置configure
进入目录
cd /home/samba/samba-4.10.6/
然后执行下面的命令进行配置。
./configure
总结: samba有很多依赖,有一些依赖对应的功能我们用不上,在./configure 排除掉即可。
如下,测试通过的命令,我排除了好多功能如: ad-dc、LDAP、ads活动目录、PAM等
./configure --disable-python --without-ad-dc --without-json --without-libarchive --without-acl-support --without-ldap --without-ads --without-pam
samba常用./configure参数整理
在配置命令之前,我们可以通过命令,来查看配置命令的一些选项。
# ./configure –-help
安装路径目录相关配置
Installation prefix:
By default, "waf install" will put the files in "/usr/local/bin", "/usr/local/lib" etc. An
other than "/usr/local" can be given using "--prefix", for example "--prefix=$HOME"
--prefix=PREFIX
installation prefix [default: '/usr/local/samba']
--destdir=DESTDIR
installation root [default: '']
--exec-prefix=EXEC_PREFIX
installation prefix for binaries [PREFIX]
Installation directories:
--bindir=BINDIR
user commands [EXEC_PREFIX/bin]
--sbindir=SBINDIR
system binaries [EXEC_PREFIX/sbin]
--libexecdir=LIBEXECDIR
program-specific binaries [EXEC_PREFIX/libexec]
--sysconfdir=SYSCONFDIR
host-specific configuration [PREFIX/etc]
--sharedstatedir=SHAREDSTATEDIR
architecture-independent variable data [PREFIX/com]
--localstatedir=LOCALSTATEDIR
variable data [PREFIX/var]
--libdir=LIBDIR
object code libraries [EXEC_PREFIX/lib64]
--includedir=INCLUDEDIR
header files [PREFIX/include]
--oldincludedir=OLDINCLUDEDIR
header files for non-GCC compilers [/usr/include]
--datarootdir=DATAROOTDIR
architecture-independent data root [PREFIX/share]
--datadir=DATADIR
architecture-independent data [DATAROOTDIR]
--infodir=INFODIR
GNU "info" documentation [DATAROOTDIR/info]
--localedir=LOCALEDIR
locale-dependent data [DATAROOTDIR/locale]
--mandir=MANDIR
manual pages [DATAROOTDIR/man]
--docdir=DOCDIR
documentation root [DATAROOTDIR/doc/PACKAGE]
--htmldir=HTMLDIR
HTML documentation [DOCDIR]
--dvidir=DVIDIR
DVI documentation [DOCDIR]
--pdfdir=PDFDIR
PDF documentation [DOCDIR]
--psdir=PSDIR
PostScript documentation [DOCDIR]
库处理相关选项:
library handling options:
--bundled-libraries=BUNDLED_LIBS
comma separated list of bundled libraries. May include !LIBNAME to disable bundling
'ALL' [auto]
--private-libraries=PRIVATE_LIBS
comma separated list of normally public libraries to build instead as private libra
to disable making a library private. Can be 'NONE' or 'ALL' [auto]
--private-library-extension=PRIVATE_EXTENSION
name extension for private libraries [samba4]
--private-extension-exception=PRIVATE_EXTENSION_EXCEPTION
comma separated list of libraries to not apply extension to []
--builtin-libraries=BUILTIN_LIBRARIES
command separated list of libraries to build directly into binaries [NONE]
--minimum-library-version=MINIMUM_LIBRARY_VERSION
list of minimum system library versions (LIBNAME1:version,LIBNAME2:version)
--disable-rpath
Disable use of rpath for build binaries
--disable-rpath-install
Disable use of rpath for library path in installed files
--disable-rpath-private-install
Disable use of rpath for private library path in installed files
--nonshared-binary=NONSHARED_BINARIES
Disable use of shared libs for the listed binaries
--disable-symbol-versions
Disable use of the --version-script linker option
问题?:能否将某个程序 如smbclient依赖的so打包到 smbclient二进制文件里面,这样就不用,copy这个命令的时候,还考虑copy对应的so文件了?
–builtin-libraries选项是否是该功能??todo
2.2 编译过程问题总结
官网:
https://wiki.samba.org/index.php/Build_Samba_from_Source
官网对编译samba参考比较详细,可以完全参考
- 执行./configure --help报错Fatal Python error: init_fs_encoding: failed to get the Python codec of the filesystem encoding
ModuleNotFoundError: No module named ‘encodings’
./configure --help
Could not find platform independent libraries <prefix>
Could not find platform dependent libraries <exec_prefix>
Consider setting $PYTHONHOME to <prefix>[:<exec_prefix>]
Fatal Python error: init_fs_encoding: failed to get the Python codec of the filesystem encoding
ModuleNotFoundError: No module named 'encodings'
Current thread 0x00007ffff7fe2740 (most recent call first):
问题分析:
查看configure 脚本文件,发现它通过调python的waf构建,其中python使用环境变量
P
Y
T
H
O
N
。我这里没有配置环境变量
PYTHON。 我这里没有配置环境变量
PYTHON。我这里没有配置环境变量PYTHON,因此 我写死python路径 为如下图标红:
测试通过,不再报刚才的错。
但是在执行./configure 到最后还是报这个错,后来发现是执行自己电脑上还有一个python3成新,执行python3报错,因此判断程序还有其他地方使用了 python环境变量,因此注意不要在configure中写死python位置,修改系统环境变量 $PYTHON 为你正确的python路径即可。
注意: 测试发现有一个脚本:install_with_python.sh 查看这个脚本内容,发现它可以帮你自动安装samba需要的python,并设置环境变量$PYTHON、LD_LIBRARY_PATH等。
因此强烈通过此脚本,或参考此脚本安装python,因为有些环境变量需要配置。
- Checking for header Python.h : Distutils not installed? Broken python installation? Get python-config now!
官方对这个报错有说明:
如果不用Samba as an AD DC. 可以
./configure --disable-python --without-ad-dc
官方原文如下:
If full python development headers are not installed you may see
Checking for header Python.h : Distutils not installed? Broken python installation? Get python-config now!
The configuration failed
Here you have three choices:
• Add the following build settings to ‘./configure’:
–disable-python --without-ad-dc
This does mean that you will not be able to provision Samba as an AD DC.
• (for Samba 4.10) build with python2 with
PYTHON=python2 ./configure
PYTHON=python2 make -j
• install the Python 3.x development package for your system (eg python3-devel, python36-devel or python3-dev)
三、samba服务端配置
1. smb.conf配置
进入samba配置目录
cd /etc/samba/
备份smb.conf
mv smb.conf smb.conf.origin
新建smb.conf
vim smb.conf
[global]
workgroup = WORKGROUP
server string = she Samba Server %v
netbios name = sheSamba
security = user
map to guest = Bad User
passdb backend = tdbsam
[FileShare]
comment = share some files
path = /smb/fileshare
public = yes
writeable = yes
create mask = 0644
directory mask = 0755
[WebDev]
comment = project development directory
path = /smb/webdev
valid users = root
write list = root
printable = no
create mask = 0644
directory mask = 0755
注释:
workgroup 项应与 Windows 主机保持一致,这里是WORKGROUP
security、map to guest项设置为允许匿名用户访问
再下面有两个section,实际为两个目录,section名就是目录名(映射到Windows上可以看见)。
第一个目录名是FileShare,匿名、公开、可写
第二个目录吗是WebDev,限定root用户访问
默认文件属性644/755(不然的话,Windows上在这个目录下新建的文件会有“可执行”属性)
2. 创建系统用户(smb使用系统用户)
上面案例,我们配置了root用户,root用户默认就存在,所以这里不需要淡出创建root用户了。
如果我们配置了其他不存在的系统用户,我们就需要利用命令添加相应用户。
这里:
1、为root设置smb密码:smbpasswd -a root
3. 启动Samba服务,设置开机启动
systemctl start smb
systemctl enable smb
4. 测试配置是否正确
- 可以使用testparm测试samba配置是否正确
如下显示,加载 service file OK 即可。
[root@xxx samba]# testparm
Load smb config files from /etc/samba/smb.conf
Processing section "[EtcDir]"
Processing section "[LogDir]"
Loaded services file OK.
Server role: ROLE_STANDALONE
Press enter to see a dump of your service definitions
- 使用 smbclient命令查看samba服务情况
root用户的话,不用密码可直接查看samba服务器情况
[root@xxx samba]# smbclient -L localhost
Enter WORKGROUP\root's password:
Anonymous login successful
Sharename Type Comment
--------- ---- -------
EtcDir Disk project etc directory
LogDir Disk project log directory
IPC$ IPC IPC Service (She Samba Server 4.8.3)
Reconnecting with SMB1 for workgroup listing.
Anonymous login successful
Server Comment
--------- -------
Workgroup Master
--------- -------
[root@xxx samba]#
- 查看samba服务端口
# netstat -tnlp | grep smbd
四、samba服务常用配置
Samba配置文件常用参数详解
参考URL: https://blog.51cto.com/yuanbin/115761
1. 配置账号密码访问samba
出于安全问题,需要为samba配置密码:
$ smbpasswd -a
按提示输入想使用的密码即可
另外 /etc/samba/smb.conf 的 [global] 段必须有:
security = user
如此这般,局域网的人访问你的电脑都需要以上命令设置的用户名和密码。
如果想不要密码,可设为:
security = share
遇到问题:
1)在linux下配置smb服务,windows映射过程中,始终都被要求输入用户名和密码,即使是[public]定义的共享目录也一样!而[public]配置无误,guest ok = yes, public = yes,
解决办法:
解决这个问题需要修改smb.conf文件,在[global]节中加入map to guest = bad user,这个配置的意思是将所有samba系统主机所不能正确识别的用户都映射成guest用户,这样其他主机访问linux服务器smb共享的public目录时就不再需要用户名和密码了。
总结: security = share 安全等级,share没有用户名和密码保护,Windows用户直接打开路径就可以访问Samba服务器。
security=share在新版中已经被废弃了
把security = share
改为
security = user
map to guest = Bad User
demo:测试通过,通过root/root登录 可以创建文件
[global]
workgroup = WORKGROUP
server string = She Samba Server %v
netbios name = SheSamba
security = user
map to guest = Bad User
passdb backend = tdbsam
[Share]
comment = project log directory
path = /home/share
valid users = root
write list = root
create mask = 0644
directory mask = 0755
2. 修改samba服务监听的端口号
组成Samba运行的有两个服务,一个是SMB,另一个是NMB;SMB是Samba 的核心启动服务,主要负责建立 Linux Samba服务器与Samba客户机之间的对话, 验证用户身份并提供对文件和打印系统的访问,只有SMB服务启动,才能实现文件的共享,监听139 TCP端口。而NMB服务是负责解析用的,类似与DNS实现的功能,NMB可以把Linux系统共享的工作组名称与其IP对应起来,如果NMB服务没有启动,就只能通过IP来访问共享文件,监听137和138 UDP端口。
smbd运行在TCP的139、445端口,nmbd则运行在UDP的137、138端口(运行samba服务后可以用如:netstat -anp | grep smbd、netstat -anp |grep nmbd来查看它开放的端口号),如果不运行nmbd进程则客户端只能通过IP地址来访问samba服务器了!
1、停掉服务器上面的smbd服务
2、启动的时候后面加上接口
./sbin/smbd -p 4450
Samba服务所使用的端口和协议
Samba 服务使用的端口和协议(是一组TCP UDP协议的组合,主要使用CIFS协议)
https://www.cnblogs.com/findumars/p/6009345.html
关于端口一些网上信息:
教材上面说还要采用137、138、139等端口,这种说法也是成立的,这是由于将samba作了WINS服务 器的原因,即UDP138、UDP139是进行NETBIOS解析的;如果不进行NETBIOS解析的话,445端口够用了。
samba 服务可以改端口,但是 windows 不认其他端口,Windows 不让指定端口。所以window访问其他samba不能指定端口。
3. Samba编码设置
在[global]下添加
如果locale是zh_CN.UTF-8,做如下设置:
display charset = UTF-8
unix charset = UTF-8
dos charset = UTF-8
如果locale是zh_CN.GBK或zh_CN.gb2312,做如下设置:
display charset = cp936
unix charset = cp936
dos charset = cp936
- display charset = UTF-8
输出信息到 stdout,stderr (也就是在samba服务器上)時所用的编码。這邊應該是指輸出訊息,通常設定成與底下的unix charset選項相同。 - dos charset = UTF-8
DOS客户端连接到samba服务器,所使用的编码。测试结果不管是Unix或windows都使用這個编码設定,在设定该samba服务給中文Windows使用时,应该使用该参数。不过,经过测试最新版本(Version 4.10.6)测试,samba linux服务器没有配置任何编码
Linux系統所使用的編碼方式。Samba必須要知道本地的編碼方式,才能正確的轉換要送給客戶端的訊息,這個選項在一般情況下,samba服务应该与其所在的Linux 系統编码相同,也就是 locale設定的編碼方式。
4. Samba以 root 权限共享目录
在 Samba 中以 root 权限共享目录需要进行一些特殊的配置。请注意,以 root 权限共享目录可能存在安全风险,请谨慎操作。
[ShareName]
path = /path/to/share
read only = no
force user = root
force group = root
主要添加配置:
read only = no
force user = root
force group = root
亲测通过!
五、samba文件共享访问
1. Windows访问linux samba服务
1)在Windwos资源管理器访问(我的电脑)
访问路径里填上: \${Samba服务器的IP} ,然后回车,可以看见共享的目录。
2)映射网络驱动器
共享目录上右键映射即可。
1.1 同样的配置在一个linux上可以正常创建目录文件以及在另一个linux上却看不到文件,并且无创建目录文件权限?
问题分析:
相同的smb配置以及smb应用程序,说明是linux环境问题,优先排查防火墙问题。
解决方法:
1)临时关闭selinux
关闭selinux 编辑/etc/selinux/config
setenforce 0 #临时关闭selinux
2) 永久关闭selinux
编辑/etc/sysconfig/selinux文档
将SELINUX=enforcing改为SELINUX=disabled
或者直接执行命令:
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux
然后,重启服务器即可
2. Windows断开与Samba服务器的连接方法
开始 -> 运行 -> cmd,执行net use * /del,然后根据提示按Y是取消远程连接,N是放弃。执行net use 可以查看所有的远程连接。
C:\Users\intha>net use
会记录新的网络连接。
状态 本地 远程 网络
-------------------------------------------------------------------------------
OK Z: \\11.11.111.100\LogDir Microsoft Windows Network
OK \\11.11.111.100\IPC$ Microsoft Windows Network
命令成功完成。
当然,除了命令,你可以图形化操作,取消映射即可。
3. Linux访问Samba服务(linux 访问windows共享文件夹的方法)
3.1 方式1:使用mount命令挂载远端目录到本地目录
#mount -t cifs //IP地址/共享名称 挂载点 -o username=用户名,password=密码,其他选项
mkdir /mnt/soft
mount -t cifs -o username=Administrator,password=xxxxxx //11.11.111.111/share /mnt/soft
3.2 方式2:使用samba的smbclient 访问windows的共享文件夹
$ sudo apt-get install smbclient
安装好后,就可以访问共享的文件了。
$ smbclient --user=share //192.168.66.198/share
Enter share’s password: (输入密码回车)
smb: >
此时进入了smb的命令操作空间,可以使用help来查看命令的使用。
smb: > help
…省略若干命令…
exit get getfacl geteas hardlink
help history iosize lcd link
…省略若干命令…
也可以使用help查看单个命令的使用方式
smb: > help get
HELP get:
[local name] get a file
3.3 使用过程遇到问题
1) Linux下mount命令出现Host is down的解决方法
当使用Linux中的mount命令挂载一个Windows的共享目录的时候有时会出现:
failed: Host is down
出现Host is down的错误在挂载Windows 8,8.1,10的时候会经常出现,这时候其实不是命令本身的原因,
这个问题主要在于版本上面,所以在mount cifs的时候显式指定一下挂载的cifs是最新的版本即可
如下命令 添加 ,vers=2.0后不再报错
mount -t cifs -o username=xxxxx,password=xxx,vers=2.0 //11.12.112.100/share /mnt/soft
2)清除Windows访问局域网Samba共享密码缓存
在windows 中访问Samba共享时,如果输入了密码,其后一段时间均不用输入用户名及密码即可访问,这是windows密码缓存造成的,使用net use * /del 删除远程连接
使用如下命令清除
net use * /del
六、smbclient命令使用详解
smbclient命令属于samba套件,它提供一种命令行使用交互式方式访问samba服务器的共享资源。
1. 列出某个IP地址所提供的共享文件夹
smbclient -L 198.168.0.1 -U username%password
2. 像FTP客户端一样使用smbclient
smbclient //192.168.0.1/tmp -U username%password
执行smbclient命令成功后,进入smbclient环境,出现提示符: smb:\》
这里有许多命令和ftp命令相似,如cd 、lcd、get、megt、put、mput等。
3. 直接一次性使用smbclient命令
使用-c选项可以一次性使用smbclient命令
smbclient -c “ls” //192.168.0.1/tmp -U username%password
创建一个共享文件夹
smbclient -c “mkdir share1” //192.168.0.1/tmp -U username%password
4. 指定访问samba服务的端口
加参数-p 即可
smbclient //11.12.111.111/dir/ -p 445 -U administrator
关于139、445端口测试如下:
- linux上 启动samba服务它会同时监听 139和445
使用smbclient测试 -p 139可以连通正常使用,-p 445 可以连通正常使用 - win7、win10 启动文件夹共享,它也会监听 139和445
使用smbclient测试 -p 139连接报错,-p 445 可以连通正常使用
连接139报错如下:
Connection to 11.12.111.111 failed (Error NT_STATUS_RESOURCE_NAME_NOT_FOUND)
总结:smbclient 默认使用445端口,建议使用445端口。
139端口和445端口的区别
139端口和445端口的区别
参考URL: https://www.cnblogs.com/xunbu7/p/3509621.html
windows的139端口和445端口的区别
參考URL: https://blog.youkuaiyun.com/alone_map/article/details/51849460
- 139和445端口的使用背景
SMB(Server Message Block)协议在NT/2000中用来作文件共享,在Win-NT中,SMB运行于NBT(NetBIOS over TCP/IP)上,使用137,139(UDP),139(TCP)端口。
在win2000级以上版本中,SMB可以直接运行在tcp/ip上,而没有额外的NBT层,使用TCP 445端口。
- 两个端口的使用情况
可以在“网络连接/属性/TCPIP协议/属性/高级/WINS中设置启用或者禁用NBT(NetBIOS over TCP/IP)。
当计算机同时支持NTB和TCP/IP两种协议的时候,就面临着选择139或者445端口了。下面的情况确定会话使用的端口:
1、如果客户端启用了NBT,那么连接的时候将同时访问139和445端口,如果从445端口得到回应,那么客户端将发送RST到139端口,终止这个端口的连接,接着就从445端口进行SMB的会话了;如果没有从445端口而是从139得到回应,那么就从139端口进行会话;如果没有得到任何回应,那么SMB会话失败。
2、如果客户端禁用了NBT,他就将只从445端口进行连接。
3、如果服务器端启用NBT,那么就同时监听UDP 137、138端口和TCP139,445端口。如果禁用NBT,那么就只监听445端口了。
总结一下:**139端口是在NBT协议基础上的,关闭NBT协议139就废了。而445端口是在TCP/IP协议基础上,现在网络中应该很少有不使用TCP/IP协议的了。**最后如果主机两种协议同时支持的话(比如windowsxp以后的操作系统)那么共享访问时候的端口使用优先级为:445>139,所以现在UNC路径访问ip地址都是使用445端口,而访问主机名形式是使用139端口(现在基本不用了)。
关闭139端口的方法:“网络连接/属性/TCPIP协议/属性/高级/WINS中设置启用或者禁用NBT(NetBIOS over TCP/IP)
关闭445端口的方法:防火墙阻塞445端口或者禁用server服务都可以。
七、参考
Samba使用大全(绝对经典)
参考URL: https://blog.youkuaiyun.com/future_ai/article/details/81631116
利用SMB jcifs实现对windows中的共享文件夹的操作
参考URL: https://www.cnblogs.com/aigeileshei/p/9101695.html
[推荐-翻译-全面]Samba
参考URL: https://blog.youkuaiyun.com/QTM_Gitee/article/details/84060845#951_smbclient_2186
SMB2 Protocol – 简介(应用层协议主要用于在计算机间共享文件、打印机、串口等)
参考URL: https://www.cnblogs.com/findumars/p/6009350.html
Samba配置文件常用参数详解
参考URL: https://blog.51cto.com/yuanbin/115761