前面讲到过,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_64samba4-libs-4.0.0-58.el6.rc4.x86_64samba-winbind-clients-3.6.9-164.el6.x86_64samba-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 wittgenteinEnter 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=wittgensteinPassword: [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 /mntsamba.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 gentooChanging password for user gentoo.New password: BAD PASSWORD: it is based on a dictionary wordBAD PASSWORD: is too simpleRetype 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 /datadrwxr-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.confrlimit_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_STANDALONEPress 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 DirectoriesDomain=[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 /mntfstab[root@node1 ~]# cd /mnt[root@node1 mnt]# tail -3 fstabsysfs /sys sysfs defaults 0 0proc /proc proc defaults 0 0LABEL=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 /mntfstab[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 /datafstab test.txt[root@node2 ~]# ll /data/test.txt-rw-r--r-- 1 gentoo gentoo 0 Jan 5 2016 /data/test.txt[root@node2 ~]# id gentoouid=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_4root@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.dchargen-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 restartStopping xinetd: [ OK ]Starting xinetd: [ OK ][root@node2 ~]# ss -tunl | grep '901'tcp LISTEN 0 64 :::901 :::*
如果远程访问swat,不加密意味着登录的用户名和密码会以明文的方式在网络上传输,这无疑很危险。为安全起见,应将SSL加密添加到swat配置。具体操作方法可参考