前面講到過,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上計算機之間相互共享數據的一種標準,並將其重命名爲CIFS(Common 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主機上設置共享
②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
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的共享資源:
四、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 :::*
如果遠程訪問swat,不加密意味着登錄的用戶名和密碼會以明文的方式在網絡上傳輸,這無疑很危險。爲安全起見,應將SSL加密添加到swat配置。具體操作方法可參考http://www.ibm.com/developerworks/cn/linux/l-lpic3-312-5/