一、概念

   1.1)综述

         Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成。SMB(Server Messages Block,信息服务块)是一种在局域网上共享文件和打印机的一种通信协议, 它为局域网内的不同计算机之间提供文件及打印机等资源的共享服务。SMB协议是客户机/服务器型协议,客户机通过该协议可以访问服务器上的共享文件系统、 打印机及其他资源。通过设置“NetBIOS over TCP/IP”使得Samba不但能与局域网络主机分享资源,还能与全世界的电脑分享资源。

目标:让Windows与Unix-LIke 这两个不同的操作系统平台相互共享数据的文件系统!

小插曲:SMB注册商标没有意义,用了SAMBA(巴西的SAMBA舞名同音,拉丁舞蹈的名字)!

     小知识点:Windows和Sun公司开发,所以可以跨平台!

至少所需的软件及其软件架构

samba:这个套件主要提供了SAM服务器所需的各项服务程序 (smbd及nmbd )、SAMBA的文件档 ( document )、以及其它与SAMBA 相关的logrotate 设定文件及开机默认选项档案等,是服务器端的应用程序
samba-common:这个套件则主要提供了 SAMBA 的主要配置文件(smb.conf) 、 smb.conf 语法检验的测试程序 ( testparm )等等,samba的支持文件
samba-client:这个套件则提供了当Linux做为SAMBA Client端时,所需要的工具指令,例如挂载 SAMBA文件格式的mount.cifs、取得类似网上邻居相关树形图的smbtree等,是客户端的应用程序!

说明:如果Linux系统共享资源,没有Windows作为测试,可以用LInux自带的samb-client作为测试端!

   1.3)核心配置文件

/etc/samba/smb.conf                     #samba服务的主要配置文件

/etc/samba/lmhosts                      #samba服务的域名设定,主要设置IP地址对应的NetBIOS Name

特点:"类似"linux系统的/etc/hosts功能,但不是/etc/hosts,目前的SAMBA默认会使用本机名称(hostname)作为NetBIOS Name
 
/etc/samba/smbusers                     #samba服务设置samba虚拟用户的配置文件

/var/log/samba                          #samab服务存放日志文件

/var/lib/samba/private/{passdb.tdb,secrets.tdb}   #管理samba的用户账号和密码数据库文档

/usr/share/doc/smba-<版本>                         #技术手册

    1.4)端口的问题

说明:通常使用445/tcp进行所有的连接;也可以使用TCP端口139,UDP端口137、138向后兼容!

  服务的名称:nmb、smb;在防火墙添加中会用到!

  错误:Connection to 172.25.2.105 failed (Error NT_STATUS_HOST_UNREACHABLE)

   1.5)核心的命令

SAMBA Server 功能

   testparm         --->test parameters 的简写,语法校验(smb.conf)

   smbd             --->权限管理服务程序(主要的 daemons)

   nmbd             --->NetBIOS Name查询(nmbd)

   tdbdump          --->查看数据库的名称

   tdbtool          --->进入数据库操作接口,手动修改账户和密码(需要tdb-tools软件的支持)

   /var/lib/samba/private/{passdb.tdb,secrets.tdb}

   说明:3.0以后的版本,用户的账户和密码参数使用数据库(数据库名称-->TDB)

   smbstatus        --->列出SAMBA的连接状态

   smbpasswd        --->管理SAMBA账号与密码(早期)

   pdbedit          --->管理SAMBA账号与密码(推荐)

SAMBA Client 功能

 mount.cifs 

    1)Windows可以设置"网络驱动器"来连接到自己主机上面

    2)通过mount(mount.cifs)将远程主机共享的文件和目录挂载在自己的LInux主机上!

 smbclient(核心)

    当Linux 主机想要藉由『网络上的芳邻』的功能来查看别台计算机所分享出来的目录与装置时,就可以使用smbclient 来查看啦!这个指令也可以使用在 SAMBA 主机上面,用来查看是否设定成功。

 smbtree

 nmblookip 查出NetBIOS Name
 
 smbmount(不常用)

说明:参数的用法在使用中穿插!

补充:Windows最多只能10个用户同时连接到同一台网上邻居的服务器上,linux不受限制!

说明:文件共享、多用户挂载、客户端的使用!

测试1:安装软件后,启动服务,匿名测试

登录samba服务器 samba服务器的由来_samba

-L 和-I的参数的用法

测试2:非匿名登陆

登录samba服务器 samba服务器的由来_登录samba服务器_02

说明:SAMBA的账户必须是系统已经存在的(/etc/passwd可以查询的),系统密码设置不设置无所谓!

需求3:开放用户使用smb服务器用户主目录

登录samba服务器 samba服务器的由来_登录samba服务器_03

解释:使用远程主机的某个帐号来直接远程登陆某台主机的某个共享资源!

说明:Selinux默认是禁止自定义的目录成为共享目录!

说明: smbclient //172.25.2.105/smbuser1 -U smbuser1 -->进入该用户的家目录[home配置]!

明确:如果此选项没有开启,那么用户在挂载他们的用户主目录的时候就会出现无法挂载的情况!

mount //172.25.2.105/smb1/ -o username=smb1,passwd=hello

说明2:Selinux有关!

smbclient -L //172.25.2.105 -U smbuser1  -->smbuser1身份查询

smbclient -L //172.25.2.105              -->匿名用户身份查询(看到的内容不一样)!

说明:登陆并不代表能操作资源!

pdbedit -x user   -->删除(delete)SMBA中的用户(pdbedit -x -u user)

pdbedit -L user   -->列出(list)指定用户的信息(不加参数列出所有的)

smbpasswd -a user -->增加(add)用户

需求3:共享成为SAMBA目录

mkdir /home/linux
cd /home/linux/
touch file{1..10}
semanage fcontext -a -t samba_share_t '/home/linux(/.*)?' #重点!!!!!!
restorecon -RvvF /home/linux/

说明:如果共享的目录不只是SAMBA,还包括FTP或者其它服务,使用public_content_t大家都能读取的类型!

配置文件的修改

[wzj]
	comment = Linux Resources
	path    = /home/linux
	write list = smbuser1

过五关六将

登录samba服务器 samba服务器的由来_客户端_04

权限首先底层必须允许,然后是smb配置文件是否允许,其次还得看Selinux是否允许!

结果:此时smbuser1就可以对wzj资源相对应的该目录下进行写操作!

仿真:类似FTP的方式上传和下载网上邻居,通过?可以看到没有touch命令!

实际:smnclient是SAMBA提供给Linux网上邻居的客户端功能!

需求4:挂载的方式

特点:将远程服务器(Windows)共享出来的目录整个挂载到本机(Linux)的挂载点,远程服务器的目录就像是我们本机的一个分区,可以直接复制和编辑等动作!

mount //172.25.2.105/wzj /mnt -o username=smbuser1,password=redhat

用法:常常是通过smbclient来观察,然后mount来挂载文件系统!

su - kiosk 可以查看,但是不能进行相关操作!

#############################

需求5:匿名用户登陆查看资源

(1)全局设置,默认不允许

第123行左右-->

  security = user          ##RHEL6之前可以通过(user改成shell来匿名登录),现在增强了!

  map to guest = bad user  #新增加(匿名用户)!!!

  passdb backend = tdbsam

说明:上述只是表示可以用匿名用户,具体能用不能用要看共享资源声明了没有

(2)局部设置

guest ok = yes

(3)重启服务

方式1:reload或者restart服务!

方式2:testparm(检查语法错误,并reload配置文件)

登录samba服务器 samba服务器的由来_客户端_05

或者

登录samba服务器 samba服务器的由来_客户端_06

需求6:访问控制

基于IP

#####允许的######

hosts allow = 172.25.2.103            ##指定的IP,即改即生效!

hosts allow = 172.25.2.               ##网段(注意写法-->不是172.25.2.0/24)!

hosts allow = 172.25.2 172.25.254.100 ##不允许指定的IP,网段!

######禁止#######

hosts deny  = 172.25.2.100

hosts deny  = 172.25.2.

说明:参数测试的时候,最好去掉allow的!

出现问题排错思路:服务器端口hostname设置(/etc/res)!客户端防火墙的设置(关闭)!

无法卸载处理思路:fuser -kvm /mnt   --->umount /mnt

需求7:配置文件的其它参数的含义

writeable = yes #表示可以对文件(目录)进行更改(挂载后可以读写此共享)

注意:能不能更改,还要看文件系统对于该用户的权限设置,登陆身份对于该目录或者文件权限!

一般:777、setfacl、添加用户组三种方式!

########################

browseable = yes ##表示除了用户自己外,不能被其它人浏览(看到文件资源),可以ls

注意:并不代表能看到文件的内容!

说明:如果是no的话,关闭此共享资源,smbclient -L //IP 就无法看到此共享目录!

########################

write list = [user|@user|+user] -->写入者包含哪些人(只有writeable,没有 write list的话默认是所有人)!

说明:针对用户、用户组的!

强调:用户必须在SMBA用户列表中,即pdbedit -L中

测试:

  1)匿名用户可以登陆,查看资源,但是无法创建! -->  mount //IP/wzj /mnt 

  2)pdbedit -L 中的用户,但是不在 write list 中,也无法创建!(-o username=user,password=passwd)

  3)pdbedit -L 中的用户,并且在 write list 中,且底层文件系统权限也允许!

  4)将2)中的用户加入到相应的用户组中,再测试!

注意:挂载测试的时候,最好先卸载再测试!

##################

valid users = user,user1   //默认所有用户;有效的用户列表(同上),早期的设置!

说明:更直接(即使在pdedit -L的用户列表中,也没有权力挂载)

##################

;       public = yes|no         //默认no;公用的        
;       browseable = yes|no     //默认yes;是否可以浏览
;       read only = yes|no      //默认yes;只读
;       writable = yes|no       //默认yes;可写
        write list = user       //默认无;可写入的用户列表
        valid users = user,user1//默认所有用户;有效的用户列表
;       hosts allow = 客户地址   //允许的客户机地址
;       hosts deny =  客户地址   //禁止的客户机地址
;       comment = 注释          //说明

##################

冲突的问题

需求8:smb的多用户身份

现象

登录samba服务器 samba服务器的由来_客户端_07

说明:root挂载,但是su - kiosk kiosk也可以访问,不安全!

生活案例:自己买饭(-->资源)(用的是自己的钱-->用户名和密码)总不希望别人也能看饭(资源)!

需求:自己挂载的,只能自己看,别人要看需要通过验证!

明确:既然是客户端的其它用户可以访问,就在客户端限制其访问,如果要访问必须通过验证的方式

核心步骤

yum install cifs-utils   -->客户端安装验证工具!

   touch /root/smbpass      -->自己创建的用户名和密码的文件

   chmod 600 /root/smbpass  -->安全(只有自己可以看和修改)!

   /root/smbpass文件格式-->

        username=lee
        password=lee

  测试:mount //172.25.254.100/HAHA /mnt -o credentials=/root/smbpass,sec=ntlmssp,multiuser

说明:文件代替用户名和密码,sec跟系统版本(rpm -q kernel ,3.8之后的用上述的)有关,multiuser才起作用

帮助文档:man mount.cifs

    ntlm、NTLM认证协议及SSPI的NTLM实现

测试:root登录,然后切换到kiosk,cd /mnt ,ls告诉你没有权限!

登录samba服务器 samba服务器的由来_samba_08

进一步需求:kiosk也能访问

   说明:smbuser2必须在pdbedit -L的列表中!

登录samba服务器 samba服务器的由来_配置文件_09

   帮助文档: cifscreds --help

   理解:客户端操作的身份,和登陆的身份

   说明:登录之后,创建文件身份在客户端如果不能识别,则是以UID、PID的形式表示!

   注意:对文件的操作实际是对服务器的操作!

小细节:服务器端重启服务,客户端原来mount可能会umount(卸载)!

smb.conf配置文件分为两大类,一个全局设置参数,一个是文件共享设置参数:

共享文件系统,文件服务器!

二、Linux操作

感觉:在客户端机器上操作就像直接使用Server上的文件资料,该数据就像在客户端上的partition一样!

WLAN(局域网)的连接方式--->Peer/Peer(对等)、Domain model(主控模式)

细节的把握!

三、Windows(简写)