Samba介紹及其配置

   前面講到過,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主機上設置共享

wKiom1aqCgOAi1z7AADprhBzkqk939.png

        ②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

wKioL1aq-cGgqdP9AAAr8ycFzpU000.png

       

  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,如 .magedu.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,工作組爲magedu;

     ②添加組develop,添加用戶gentoo,centos和ubuntu,其中gentoo和centos以develop爲附加組,ubuntu不屬於develop組;密碼均爲用戶名;

     ③添加samba用戶gentoo,centos和ubuntu,密碼均爲“magedu”;

     ④此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 = magedu   #設置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 = MAGEDU
	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=[MAGEDU] 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=[MAGEDU] OS=[Unix] Server=[Samba 3.6.23-24.el6_7]

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

	Workgroup            Master
	---------            -------
	MAGEDU               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的共享資源:

wKiom1arAWLhaKU6AACnoycTapY120.png

wKioL1arAavTb77vAAAsLYrtK4w845.png


四、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                  :::*

wKioL1arYvijf9XJAAB4hejrlio317.png

wKioL1arYvnDPSHUAAJyODRd1Go643.png

    如果遠程訪問swat,不加密意味着登錄的用戶名和密碼會以明文的方式在網絡上傳輸,這無疑很危險。爲安全起見,應將SSL加密添加到swat配置。具體操作方法可參考http://www.ibm.com/developerworks/cn/linux/l-lpic3-312-5/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章