前面讲到过,nfs只能实现unix或类unix系统间的文件系统共享,而无法跨平台。而samba能够实现linux和windows之间的文件共享。


一、Samba介绍

  Samba是在Linux和UNIX系统上实现SMB协议的一个软件,由服务器及客户端程序构成。另外,它又是基于NetBIOS协议工作的。

  1、NetBIOS和SMB/CIFS的概念

     ①NetBIOS(Network Basic Input/Output System,网络基本输入/输出系统协议)是一种在局域网上的程序可以使用的应用程序编程接口(API),作用是为了给局域网提供网络以及其他特殊功能。系统可以利用WINS服务、广播及Lmhost文件等多种模式将NetBIOS Name(特指基于NetBIOS协议获得的计算机名称)解析为相应IP地址,实现信息通讯,所以在局域网内部使用NetBIOS协议可以方便地实现消息通信及资源的共享。NetBIOS 是一种会话层协议,因其占用系统资源少、传输效率高,所以几乎所有的局域网都是在NetBIOS协议的基础上工作的,它已被适配到各种其它协议上,如IPX/SPX和TCP/IP。

     ②SMB(Server Messages Block,信息服务块)是一种在局域网上共享文件和打印机等的通信协议,它为局域网内的不同计算机之间提供文件及打印机等资源的共享服务,是一种客户端/服务器型协议。

      SMB最初被设计为运行在NetBIOS协议之上(而NetBIOS本身运行于TCP/IP或NetBEUI、IPX/SPX上),后来可直接运行于TCP/IP上。

      CIFS是SMB协议的开源版本。随着Internet的流行,Microsoft将SMB协议扩展到Internet上去,成为Internet上计算机之间相互共享数据的一种标准,并将其重命名为CIFSCommon Internet File System)。

     windows系统默认支持这两种协议,如果在linux上也提供支持,则linux和windows系统之间就能实现资源共享了。


二、samba安装配置

  1、客户端

      安装包:samba-client

      ⑴查询指定服务器的共享资源信息:smbclient -L HOST -U USERNAME

            例如 smbclient -L 192.168.30.8 -U jack

      ⑵访问服务器端共享资源的方式:

         交互式数据访问:smbclient //SERVER/shared_name -U USERNAME

         基于挂载的方式访问:mount -t cifs //SERVER/shared_name /mount_point -o username=USERNAME[,password=PASSWORD]

            例如 mount -t cifs //192.168.30.8/paper /mnt -o username=jack

[root@node1 ~]# rpm -qa | grep 'samba'
samba-winbind-3.6.9-164.el6.x86_64
samba4-libs-4.0.0-58.el6.rc4.x86_64
samba-winbind-clients-3.6.9-164.el6.x86_64
samba-client-3.6.9-164.el6.x86_64   #客户端默认已安装
samba-common-3.6.9-164.el6.x86_64   #此软件提供是的服务器和客户端都会用到的资料,主配置文件 (smb.conf)、语法检查命令 (testparm)

      示例:以linux主机作为客户端访问windows主机的共享资源

        ①在windows主机上设置共享


Samba介绍及其配置_samba

        ②linux作为客户端访问

[root@node1 ~]# smbclient -L 192.168.30.8 -U wittgentein
Enter wittgentein's password: 
session request to 192.168.30.8 failed (Called name not present)
Domain=[MICROSOF-70941A] OS=[Windows 5.1] Server=[Windows 2000 LAN Manager]

	Sharename       Type      Comment
	---------       ----      -------
	E$              Disk      默认共享
	IPC$            IPC       远程 IPC
	paper           Disk      
	ADMIN$          Disk      远程管理
	C$              Disk      默认共享
session request to 192.168.30.8 failed (Called name not present)
session request to 192 failed (Called name not present)
Domain=[MICROSOF-70941A] OS=[Windows 5.1] Server=[Windows 2000 LAN Manager]

	Server               Comment
	---------            -------

	Workgroup            Master
	---------            -------
	
[root@node1 ~]# mount -t cifs //192.168.30.8/paper /mnt -o username=wittgenstein
Password: 
[root@node1 ~]# mount
/dev/sda2 on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw)
/dev/sda1 on /boot type ext4 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
/dev/mapper/myvg-mydata on /mydata type ext4 (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
nfsd on /proc/fs/nfsd type nfsd (rw)
//192.168.30.8/paper on /mnt type cifs (rw)   #显示已挂载
[root@node1 ~]# ls /mnt
samba.txt
[root@node1 ~]# cd /mnt
[root@node1 mnt]# cat samba.txt 
hello
[root@node1 mnt]# echo "hi,long time no see" >> samba.txt
[root@node1 mnt]# touch fromcentos.txt


Samba介绍及其配置_samba_02

       

  2、服务器:

      yum -y install samba

      ⑴服务脚本:

          /etc/rc.d/init.d/nmb(实现netbios协议)

             nmbd监听137、138/UDP

          /etc/rc.d/init.d/smb(实现cifs协议)

             smbd监听139、445/TCP

主配置文件:/etc/samba/smb.conf(由samba-common包提供)

         ■global段:

             workgroup = MYGROUP  #设置samba server要加入的工作组,默认为MYGROUP;windows系统的默认工作组为WORKGROUP


server string = Samba Server Version %v  #samba server的注释信息


             netbios name = smbserver  #显示给网络邻居的名称。默认为主机名的第一段

             hosts allow = 127. 192.168.12. 192.168.13.  #允许哪些主机访问

                可以是:

                    ip,如 192.168.30.10

                    网段,如 192.168.30. 或192.168.30.0/255.255.255.0

                    domain,如 .hello.com

             log file = /var/log/samba/log.%m

                指定Samba Server日志文件的存储位置以及日志文件名称。在文件名后加个宏变量%m(客户端的netbios name),表示对每台访问Samba Server的客户端都单独记录一个日志文件

             security = user

                设置用户访问Samba Server的验证方式,一共有四种:

                   share:使用者不需帐号和密码即可登陆samba server,安全性低

                   user:登录samba server需要提供帐号和密码,此为默认值

                   server

                   domain

              passdb backend = tdbsam   #此项一般不做修改

                samba用户后端,即samba用户和密码库的格式,有三种:

                   tdbsam:使用一个数据库文件存储,默认值。文件的默认路径为/var/lib/samba/private/passdb.tdb

                   smbpasswd

                   ldapsam


         ■共享资源的设定:

             ①私有家目录:   

                 [homes]  

                     comment = Home Directories

                     browseable = no   #除了使用者可以看到自己的家目录以外,是否允许其它人浏览

                     writable = yes   #是否可写

                     valid users = %S  # %S表示替换[]中的内容,例如用户jack登录,[homes]就被替换为[jack],用户rose登录,就被替换为[rose],由些实现每个使用者都能看到自己的家目录

              ②打印机共享

              ③自定义共享

                 [shared_name]

                   path = /path/to/share_directory

                   comment = Comment String

                   guest ok = {yes|no}   #是否允许来宾账户访问

                   public = {yes|no}   #是否公开,其参数作用同guest ok

                   writable = {yes|no}

                   read only = {yes|no}

                   write list = USER_NAME,+GROUP_NAME(也可写作@GROUP_NAME)

       经过测试,修改samba的配置文件后要restart后才能生效

      用户认证:

          帐号:都是本地用户,也即必须是/etc/passwd文件中存在的用户

          密码:samba服务自有密码文件

添加本地用户为samba用户

             smbpasswd -a local_user

             其它选项:

               -d:禁用

               -e:启用

               -x:删除

      ⑷testparm:测试配置文件是否有语法错误,以及显示最终生效的配置

      ⑸客户端使用者的访问权限取决于如下二者的交集:

           共享配置中授予的权限

           用户对目录或文件本身所具有的权限


三、samba服务配置示例  

建立samba共享,共享目录为/data,要求:

①共享名为shared,工作组为hello;

②添加组develop,添加用户gentoo,centos和ubuntu,其中gentoo和centos以develop为附加组,ubuntu不属于develop组;密码均为用户名;

③添加samba用户gentoo,centos和ubuntu,密码均为“hello”;

④此samba共享shared仅允许develop组具有写权限,其他用户只能以只读方式访问;

⑤此samba共享服务仅允许来自于192.168.30.0/24网络的主机访问;

以下node2为服务器端,node1和windows xp为客户端

[root@node2 ~]# yum -y install samba
...
[root@node2 ~]# rpm -ql samba
/etc/logrotate.d/samba
/etc/openldap/schema
/etc/openldap/schema/samba.schema
/etc/pam.d/samba
/etc/rc.d/init.d/nmb
/etc/rc.d/init.d/smb
/etc/samba/smbusers
/usr/bin/eventlogadm
/usr/bin/mksmbpasswd.sh
/usr/bin/smbstatus
/usr/lib64/samba/auth
...

[root@node2 ~]# groupadd develop
[root@node2 ~]# useradd -G develop gentoo
[root@node2 ~]# useradd -G develop centos
[root@node2 ~]# useradd ubuntu
[root@node2 ~]# passwd gentoo
Changing password for user gentoo.
New password: 
BAD PASSWORD: it is based on a dictionary word
BAD PASSWORD: is too simple
Retype new password: 
passwd: all authentication tokens updated successfully.
[root@node2 ~]# passwd centos
...
[root@node2 ~]# passwd ubuntu
...
[root@node2 ~]# smbpasswd -a gentoo   #添加为samba用户
New SMB password:
Retype new SMB password:
[root@node2 ~]# smbpasswd -a centos
...
[root@node2 ~]# smbpasswd -a ubuntu
...
[root@node2 ~]# mkdir /data   #创建一个用户共享的目录
[root@node2 ~]# ls -ld /data
drwxr-xr-x 2 root root 4096 Nov 24 21:11 /data
[root@node2 ~]# cp /etc/fstab /data
[root@node2 ~]# setfacl -m g:develop:rwx /data   #对欲共享的目录给组develop和用户ubuntu开放rwx的权限
[root@node2 ~]# setfacl -m u:ubuntu:rwx /data
[root@node2 ~]# vim /etc/samba/smb.conf
...
        workgroup = hello   #设置samba服务器加入的工作组
        server string = Samba Server Version %v

;       netbios name = MYSERVER

;       interfaces = lo eth0 192.168.12.2/24 192.168.13.2/24 
        hosts allow = 192.168.30.    #仅允许指定网段内的客户端访问
...
[shared]    #自定义共享
       path = /data   #共享出去的目录
       public = yes
       write list = +develop   #仅对develop组开放写权限

[root@node2 ~]# testparm   #检查配置文件语法是否有误
Load smb config files from /etc/samba/smb.conf
rlimit_max: increasing rlimit_max (1024) to minimum Windows limit (16384)
Processing section "[homes]"
Processing section "[printers]"
Processing section "[shared]"
Loaded services file OK.
Server role: ROLE_STANDALONE
Press enter to see a dump of your service definitions

[global]
	workgroup = HELLO
	server string = Samba Server Version %v
	log file = /var/log/samba/log.%m
	max log size = 50
	idmap config * : backend = tdb
	hosts allow = 192.168.30.
	cups options = raw

[homes]
	comment = Home Directories
	read only = No
	browseable = No

[printers]
	comment = All Printers
	path = /var/spool/samba
	printable = Yes
	print ok = Yes
	browseable = No

[shared]
	path = /data
	write list = +develop
	guest ok = Yes

[root@node2 ~]# service nmb start;service smb start   #要启动两个服务
Starting NMB services:                                     [  OK  ]
Starting SMB services:                                     [  OK  ]
[root@node2 ~]# netstat -tuanp | grep '[n|s]mb'
tcp        0      0 0.0.0.0:139                 0.0.0.0:*                   LISTEN      59776/smbd          
tcp        0      0 0.0.0.0:445                 0.0.0.0:*                   LISTEN      59776/smbd          
tcp        0      0 :::139                      :::*                        LISTEN      59776/smbd          
tcp        0      0 :::445                      :::*                        LISTEN      59776/smbd          
udp        0      0 192.168.30.255:137          0.0.0.0:*                               59763/nmbd          
udp        0      0 192.168.30.20:137           0.0.0.0:*                               59763/nmbd          
udp        0      0 0.0.0.0:137                 0.0.0.0:*                               59763/nmbd          
udp        0      0 192.168.30.255:138          0.0.0.0:*                               59763/nmbd          
udp        0      0 192.168.30.20:138           0.0.0.0:*                               59763/nmbd          
udp        0      0 0.0.0.0:138                 0.0.0.0:*                               59763/nmbd
[root@node1 ~]# smbclient -L 192.168.30.20 -U ubuntu   #查看指定服务器上的共享信息
Enter ubuntu's password: 
Domain=[HELLO] OS=[Unix] Server=[Samba 3.6.23-24.el6_7]

	Sharename       Type      Comment
	---------       ----      -------
	shared          Disk      
	IPC$            IPC       IPC Service (Samba Server Version 3.6.23-24.el6_7)
	ubuntu          Disk      Home Directories
Domain=[HELLO] OS=[Unix] Server=[Samba 3.6.23-24.el6_7]

	Server               Comment
	---------            -------
	NODE2                Samba Server Version 3.6.23-24.el6_7

	Workgroup            Master
	---------            -------
	HELLO               NODE2

[root@node1 ~]# mount -t cifs //192.168.30.20/shared /mnt -o username=ubuntu   #以指定的samba用户挂载
Password: 
[root@node1 ~]# mount
/dev/sda2 on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw)
/dev/sda1 on /boot type ext4 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
/dev/mapper/myvg-mydata on /mydata type ext4 (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
nfsd on /proc/fs/nfsd type nfsd (rw)
//192.168.30.20/shared on /mnt type cifs (rw)
[root@node1 ~]# ls /mnt
fstab
[root@node1 ~]# cd /mnt
[root@node1 mnt]# tail -3 fstab
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
LABEL=MYDATA            /mydata                 ext4    defaults        0 0
[root@node1 mnt]# touch test.txt
#虽然前面针对共享目录给用户ubuntu开放了写权限,但共享配置中限制其为只读,二者取交集,故ubuntu仍无法写入文件
touch: cannot touch `test.txt': Permission denied
[root@node1 mnt]# cd
[root@node1 ~]# mount -t cifs //192.168.30.20/shared /mnt -o username=gentoo   #以gentoo用户身份挂载
Password: 
[root@node1 ~]# mount
/dev/sda2 on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw)
/dev/sda1 on /boot type ext4 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
/dev/mapper/myvg-mydata on /mydata type ext4 (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
nfsd on /proc/fs/nfsd type nfsd (rw)
//192.168.30.20/shared on /mnt type cifs (rw)
//192.168.30.20/shared on /mnt type cifs (rw)
[root@node1 ~]# ls /mnt
fstab
[root@node1 ~]# cd /mnt
[root@node1 mnt]# touch test.txt   #gentoo用户属于组develop,拥有写权限
[root@node1 mnt]# ll test.txt   #服务器上的gentoo用户的UID为503,它对应客户端上的davinci
-rw-r--r-- 1 davinci 504 0 Jan  5 21:10 test.txt
[root@node2 ~]# ls /data
fstab  test.txt
[root@node2 ~]# ll /data/test.txt
-rw-r--r-- 1 gentoo gentoo 0 Jan  5  2016 /data/test.txt
[root@node2 ~]# id gentoo
uid=503(gentoo) gid=504(gentoo) groups=504(gentoo),503(develop)

  以windows为客户端访问linux的共享资源:


Samba介绍及其配置_samba_03


Samba介绍及其配置_samba_04


四、samba-swat

   samba-swat是一个基于web的samba管理工具,支持从任何具有 Web 浏览器的计算机进行 GUI 配置。swat本身就是一个服务器,独立于samba服务器。其服务进程又被设计为由超级守护进程xinetd管理,由xinetd代为监听在901/tcp

     安装:yum -y install samba-swat

     服务脚本:/etc/xinetd.d/swat     

     配置启动:

        ①方式1:vim /etc/xinet.d/swat

             disable = no

         方式2:chkconfig swat on

        ②启动或重启xinetd,让xinetd代为监听起来

           service xinetd restart

[root@node2 ~]# yum -y install samba-swat
...
Installed:
  samba-swat.x86_64 0:3.6.23-24.el6_7                                                                                                                                      

Dependency Installed:
  xinetd.x86_64 2:2.3.14-39.el6_4
root@node2 ~]# rpm -ql samba-swat
/etc/xinetd.d/swat
/usr/lib64/samba/de.msg
/usr/lib64/samba/en.msg
...
/usr/sbin/swat
/usr/share/man/man8/swat.8.gz
...
[root@node2 ~]# ls /etc/xinetd.d
chargen-dgram  chargen-stream  daytime-dgram  daytime-stream  discard-dgram  discard-stream  echo-dgram  echo-stream  rsync  swat  tcpmux-server  time-dgram  time-stream
[root@node2 ~]# vim /etc/xinetd.d/swat

# default: off
# description: SWAT is the Samba Web Admin Tool. Use swat \
#              to configure your Samba server. To use SWAT, \
#              connect to port 901 with your favorite web browser.
service swat
{
        port            = 901   #监听在901号端口
        socket_type     = stream
        wait            = no
        only_from       = 192.168.30.0/24   #默认为127.0.0.1。
        #swat对samba拥有绝对的控制权,为安全起见,默认仅允许通过127.0.0.1连接
        user            = root   #默认以root用户登录
        server          = /usr/sbin/swat
        log_on_failure  += USERID
        disable         = no
        
[root@node2 ~]# service xinetd restart
Stopping xinetd:                                           [  OK  ]
Starting xinetd:                                           [  OK  ]
[root@node2 ~]# ss -tunl | grep '901'
tcp    LISTEN     0      64                    :::901                  :::*


Samba介绍及其配置_samba_05


Samba介绍及其配置_samba_06

    如果远程访问swat,不加密意味着登录的用户名和密码会以明文的方式在网络上传输,这无疑很危险。为安全起见,应将SSL加密添加到swat配置。具体操作方法可参考http://www.ibm.com/developerworks/cn/linux/l-lpic3-312-5/