第5章 Samba服务器的配置与应用
Windows用户通过“网上邻居”可以很方便地共享文件和打印机,那么Windows环境下的Linux服务器如何为Windows用户提供这种服务呢?当然,最简单的实现方式就是提供同样的“网上邻居”服务,这就是Samba要做的事情。
5.1 Samba Server概述
Samba是一个开放源代码的项目,是由位于澳大利亚堪培拉的澳大利亚国立大学的Andrew Tridgell在1991年开发的,目的就是为了在UNIX上实现与DOS文件的共享。
为什么这个项目叫做Samba呢?原来Andrew的原始文件中称这个软件为SMBServer。由于法律上的原因,这个名字必须加以修改,于是Andrew开始在/usr/dict/words中查找s、m和b之后的单词只有Samba,这就是Samba名字的由来。
5.1.1 Samba Server简介
Samba是一个工具套件,在UNIX上实现SMB(Session Message Block)协议,或者称为NetBIOS/LAN Manager协议。SMB协议通常是被Windows系列用来实现文件和打印机共享的。
小知识
UNIX/Linux计算机上可以通过NFS来实现文件共享,而对于Windows,外在的表现是“网上邻居”,它们使用的文件系统却是CIFS(Common Internet File System)。
我们知道,服务器信息块(SMB)协议运行在NetBIOS的顶端,如图5-1所示。虽然NetBIOS可以运行在NetBEUI、IPX/SPX和TCP/IP的顶端,但对于Samba来说,它目前只在TCP/IP上实现了SMB。
图5-1 NetBIOS上的SMB协议
NetBEUI
5.1.2 SambaServer的安装
Samba服务器目前主要依靠两个服务来提供Windows“网上邻居”,实现Windows式的文件和打印机共享。第一个服务是smbd——处理文件和打印机共享请求,第二个服务是nmbd——处理NetBIOS名称服务请求和网络浏览功能,如图5-2所示。
图5-2 Samba服务包括了两个服务
1.从光盘安装Samba
Red Hat Enterprise Linux 5中内置了Samba,在安装系统时就可以安装它。当然,如果没有在安装系统时安装,就需要在GNOME的桌面执行“应用程序”→“添加/删除软件”,找到Samba软件包并安装(Windows文件服务器),如图5-3所示。
图5-3 通过图形界面来安装Samba服务器
小提示
由于在默认设置下,Red Hat Enterprise Linux 5安装之后,并不能通过“添加/删除软件”直接从光盘上安装Samba组件,还需要经过特别的设置才行。具体设置在本书第3章“进入Linux桌面”中的安装KDE部分有详细介绍,这里不再赘述。
2.下载并安装Samba
当你没有Red Hat Enterprise Linux 5安装光盘,或者想试用一下Samba的最新版本时,那就要通过其他途径来安装了,比如从网上下载并安装。
1 获取Samba。
可以从Samba的官方网站来获取Samba,网站上既有源代码,也有不同Linux发行套件版本供下载,如图5-4所示。比如,Red Hat Enterprise Linux 5的下载地址为:http://us3.samba.org/samba/ftp/Binary_Packages/。
图5-4 Samba网站提供了源代码及针对不同Linux发行套件的二进制安装版供下载
小提示
需要注意的是,Red Hat Enterprise Linux 5的简称是RHEL,所以下载Red Hat Enterprise Linux 3/4/5适用的Samba二进制安装包时,请尽量在包括有字符RHEL字样的目录中寻找。
{L-End} 2 查询是否已安装Samba。
在开始安装Samba之前,我们最好查询一下,看自己系统中是否已经安装了Samba老版本,并由此决定是全新安装还是升级到最新的版本,如图5-5所示。执行以下命令:
图5-5 查看系统中是否已经安装了Samba
[root@localhost ~]#rpm -qa —grep samba
{L-End} 3 卸载旧版本Samba。
执行以下命令将原来版本的Samba卸载:
[root@localhost ~]#rpm -e samba-client-3.0.23c-2 [root@localhost ~]#rpm -e samba-comon-3.0.23c-2 [root@localhost ~]#rpm -e samba-3.0.23c-2
小提示
我们不建议通过命令行方式来卸载Samba,因为它不能很好地解决文件依赖问题。我们推荐使用“应用程序”→“添加/删除软件”来卸载已经安装的Samba,如图5-6所示。
图5-6 去掉Samba前面的对勾再单击“应用”按钮就可以卸载Samba了
{L-End} 4 开始安装Samba。
再执行以下命令安装新版本的Samba,如图5-7所示。
图5-7 Samba安装中
[root@localhost ~]#rpm -ivh libsmbclient-3.0.30-35.i386.rpm [root@localhost ~]#rpm -ivh libsmbclient-devel-3.0.30-35.i386.rpm [root@localhost ~]#rpm -ivh samba3-client-3.0.30-35.i386.rpm [root@localhost ~]#rpm -ivh samba3-3.0.30-35.i386.rpm [root@localhost ~]#rpm -ivh samba3-cifsmount-3.0.30-35.i386.rpm [root@localhost ~]#rpm -ivh samba3-utils-3.0.30-35.i386.rpm [root@localhost ~]#rpm -ivh samba3-winbind-3.0.30-35.i386.rpm
5.1.3 Samba服务的图形化配置方法
Red Hat Enterprise Linux 5中提供了一个十分好用的图形界面配置工具,我们这里就用这个工具来配置Samba服务。
1 在Red Hat Enterprise Linux 5的GNOME桌面上单击右键,选择“打开终端”选项,如图5-8所示。
图5-8 选择“打开终端”选项
小提示
要想使用Samba进行网络文件和打印机共享,就必须首先设置让Red Hat Enterprise Linux 5的防火墙放行,请执行“系统”→“管理”→“安全级别和防火墙”,然后勾选Samba,如图5-9所示。
图5-9 在防火墙上开放Samba端口
{L-End} 2 运行以下命令打开“Samba服务器配置”小工具,如图5-10所示。
图5-10 Red Hat Enterprise Linux 5内置了图形界面的Samba配置工具
[root@localhost ~]#system-config-samba
小提示
Red Hat Enterprise Linux 5下可以通过这种方式打开很多系统配置工具,比如system-config-rootpassword(设置root密码)、system-config-services(系统服务配置)、system-config-network(网络配置)等,总数达24个左右,如图5-11所示。
图5-11 Red Hat Enterprise Linux 5下的系统配置工具
{L-End} 3 请不要着急“添加共享”,为了方便其他人识别这台计算机,先为这台计算机设置合适的描述和工作组是很重要的。单击“首选项”→“服务器设置”,设置工作组为“Linux-China”,至于“描述就保持默认的设置好了,如图5-12所示。
图5-12 设置计算机相关信息
{L-End} 4 切换到“安全性”选项卡下,我们发现Samba默认采用的是“用户”级别的安全性,也就是“security=user”模式,此时由Samba服务器完全控制用户身份的验证,如图5-13所示。
图5-13 Samba在默认情况下采用的是“用户”级别的身份验证方法
(1)用户身份验证模式
Samba支持包括ADS、域、服务器、共享和用户级别的用户身份验证模式,如图5-14所示。
图5-14 Samba支持5种用户身份验证模式
➢ ADS(Active Directory System):活动目录级别,只在Windows 2000及以后的操作系统中支持。
➢ 域(Domain Level):Samba成为域的一部分,并且使用主域控制器(PDC)来进行用户身份验证。一旦通过了身份验证,这个用户将会获得一个特殊的标志,允许其访问有访问权的各种共享资源。
➢ 服务器(Server Level):Samba服务器在允许用户访问共享资源之前,使用一个单独的SMB服务器进行用户身份验证。
➢ 共享(Share Level):在工作组中的每个共享资源都有一个或者多个与它相联系的密码,任何一个知道该密码的用户都可以访问(这种级别是Windows 95/98/Me中采用的)。
➢ 用户(User Level):Samba服务器自身对用户身份进行验证,通过验证的用户才能访问相应的共享资源。
(2)加密口令
需要注意的是,对于某些比较老的系统,比如Windows 95、NT,必须修改注册表才能访问Samba服务器,因为Samba采用的是加密口令传输,而Windows 95、NT默认并不支持。
(3)来宾账号
Samba支持匿名用户访问(就是不必输入用户名和密码就可以访问),但在默认配置下这个选项并没有被启用。如果想要创建一个所有人都可以访问的共享,并且没有安全方面的顾虑,就可以直接打开来宾账号。
{L-End} 5 要想设置一个Samba共享,还必须创建一个新的Samba用户。在“Samba服务器配置”窗口中,单击“首选项”→“Samba用户”,创建和Red Hat Enterprise Linux 5账号对应的Samba用户,如图5-15所示。
图5-15 创建访问共享资源的Samba用户
{L-End} 6 设置完毕后,单击“确定”按钮返回到“Samba服务器配置”窗口,单击左上角的“添加共享”按钮,打开“创建Samba共享”对话框,如图5-16所示。
图5-16 “创建Samba共享“对话框
➢ 目录:用来设置要共享的文件夹。
➢ 共享名:在网上邻居中可以看到的共享名字。
需要注意的是,Samba在默认情况下创建的共享,不能改写,不能显示,所以如果需要对方有写的权限,最好选中“可擦写”和“显示”两个选项。
{L-End} 7 仅仅设置了“共享目录”,在安全方面还没有做到位。我们最好在“创建Samba共享”对话框的“访问”选项卡下,针对用户设置相应的访问权限,如图5-17所示。
图5-17 设置允许访问的用户
小提示
我们虽然已经开启了共享,但在Windows下单击任意一个目录或者Samba计算机时,总是显示“您可能没有权限使用网络资源。请与这台服务器的管理员联系以查明您是否有访问权限。找不到网络路径”提示,如图5-18所示。
图5-18 拒绝访问目录提示
回到Samba服务器上,看到SELinux有拒绝访问提示,如图5-19所示。
图5-19 SELinux提示有问题
原来是它阻止了共享,要让客户端访问Linux服务器上的共享资源,还需要经过特殊的设置。该怎么设置呢?单击SELinux的提示星号,这里面有详细的介绍和设置方法,如图5-20所示。
图5-20 这里有设置开放家目录访问权限的命令
开放家目录访问:
setsebool -P samba_enable_home_dirs=1
开放其他目录访问:
chcon -R -t samba_share_t ' /export'
5.1.4 启动、关闭和重启Samba服务
Red Hat Enterprise Linux 5中内置的Samba程序是被安装为服务方式运行的,所以遵循一般的服务启动、关闭和重启规范。
1.启动Samba服务
如果Samba已经被安装成功,要启动它是很简单的。Samba服务名字为SMB,但已经包含了smbd和nmbd两个服务,如图5-21所示。
图5-21 启动Samba服务
[root@localhost ~]#service smb start
小提示
对于实际应用中的Linux系统,每次开机后都手工启动Samba服务是不现实的,应该设置系统在指定的运行级别(通常为3和5)自动启动该服务:
chkconfig --level 35 smbd on chkconfig --level 35 nmbd on
2.停止Samba服务
要关闭Samba服务,可以采用类似于启动Samba服务做法,如图5-22所示。
图5-22 关闭Samba服务
[root@localhost ~]#service smb stop
3.重启Samba服务
我们还可以通过简单的命令实现Samba服务器的关闭、启动这个重启过程,如图5-23所示。
图5-23 重启Samba 服务
[root@localhost ~]#service smb restart
5.2 Samba服务的配置文件
图形化配置Samba服务虽然操作简单,但是可定制性不强。要想完全掌控Samba的文件共享服务,就必须对它的配置文件有深入的了解。
5.2.1 Samba服务的主要配置文件
Samba服务配置文件为smb.conf,主要通过这个文件来设置如何为其他计算机提供文件和打印机共享服务。
下面所示的就是经过简单设置后的Samba服务配置文件smb.conf内容(删减了一些注释信息)。
#------------------------Global Settings-------------------------------------- [global] workgroup = linux-china server string = Samba Server Version %v netbios name = Samba Server # ----------------------- Standalone Server Options ------------------------ ; security = user passdb backend = tdbsam # --------------------------- Printing Options ----------------------------- cups options = raw username map = /etc/samba/smbusers # ----------------------------Share Definitions------------------------------ [homes] comment = Home Directories browseable = no writeable = yes [printers] comment = All Printers path = /var/spool/samba browseable = no printable = yes [Public] comment = clinuxer的共享资源 path = /export/samba writeable = yes guest ok = yes
5.2.2 Samba服务的密码文件
Red Hat Enterprise Linux 5中Samba服务随着采用加密方法的不同,其密码文件也有所不同。比如,它默认采用的是tdbsam加密,所以密码文件名为passdb.tdb(位于/etc/samba下),如图5-24所示。另外,Linux用户和Windows用户的对应关系则保存在smbusers文件中。
图5-24 Red Hat Enterprise Linux 5中的密码文件
而在Fedora Linux中采用的是一般加密,其密码文件为/var/lib/samba/private/smbpasswd。
5.2.3 Samba服务的日志文件
辛辛苦苦编写了一个smb.conf,想检测一下看它是否有问题。最简单的办法就是使用Red Hat Enterprise Linux 5内置的smbclient命令来完成,如图5-25所示。
图5-25 配置正确无误
[root@localhost ~]#smbclient -U% -L localhost
如果有问题,也不要着急,可以检查系统的输出或者查看/var/log/samba/%m.log文件中的记录信息,来确定问题所在。其中的%m指客户端的NetBIOS名字,所以,当有devil主机登入我们的Samba主机时,登录信息就会被记录在/var/log/samba/devil.log中;而如果来源IP没有NetBIOS名字,那么可能是一些错误信息,这些错误信息会被记录到log.smbd里。所以,如果要查看某台计算机连接Samba主机时发生了什么问题,请查看这个文件。
5.3 smb.conf文件
smb.conf是Samba服务的核心,这个配置文件既可以很简单,也可以很复杂。不过,看完本章相信你应该对它十分了解了。
5.3.1 smb.conf文件结构
smb.conf的文件结构与Windows下的某些配置文件很类似,比如Win.ini。对Windows很熟悉的用户,应该对它感觉不陌生。
1.整体结构
首先,我们从这个配置文件的整体来看:
[global] …… [homes] …… [printers] …… [Public] ……
方括号中的名字表示配置文件的段,其中[homes]和[Public]定义了两个共享,[printers]则定义了服务器上连接的打印机选项。
(1)[global]部分
[global]部分定义了服务器本身使用的配置参数,以及其他共享资源部分使用的默认配置参数,因此相当重要。它出现在每一个Samba的配置文件中。
这里有一个规定:其他部分可以列出和[global]相同的选项并予以赋值,此时应以其他部分设置的为准。
(2)[homes]部分
[homes]部分指定Windows共享的主目录,如果在Windows工作站登录的名字与Linux用户名相同,提供的口令也一致,那么打开网络邻居,双击共享目录图标,就可获得访问该目录的权利。从Windows访问Linux主目录时,用户名作为主目录共享名。
(3)[printers]部分
[printers]部分用于指定如何共享Linux网络打印机,从Windwos系统访问Linux网络打印机时,共享名是printcap中指定的Linux打印机名。
2.注释
需要注意的是,为了帮助阅读,smb.conf中被插入了很多注释信息,注释号为“#”或者“; ”,二者没有任何区别。比如,下面文字的前面3行都是注释信息。
# A publicly accessible directory, but read only, except for people in # the "staff" group ; 公共访问目录定义 [public] comment = Public Stuff path = /home/samba public = yes writable = yes printable = no write list = +staff
3.连续行
Samba配置文件中支持的最大行是255个字符,为了显示方便,过长的行可以分行输入,行之间以“\”分割。比如:
comment = 这是clinuxer的共享资源,欢迎大家访问 \ 也欢迎大家踊跃上传
4.运行时改变
在Samba工作期间,它会每隔60秒检查一次配置文件看其是否变化。如果发生了变化,就立刻使改变生效。如果你不希望等待那么久,而是希望配置马上生效,则可以向smbd和nmbd进程发送SIGHUP信号。
比如,smbd的进程号是9353,那么可以执行如下命令让smbd马上去读取配置文件。
[root@localhost ~]#kill SIGHUP 9353
5.3.2 smb.conf文件语法和变量
Samba配置文件中除了段信息外,就是一些参数赋值。
optins = value
绝大多数的参数都是浅显易懂的,如果你的英文好些,上面这个配置文件读明白应该没有任何问题。
Samba还支持不少变量,用来动态描述服务器和连接客户端的信息。每一个变量以%开始,后面是一个单独的大写或者小写字母。比如:
[pub] path = /home/%u
这个%u就代表当前的Linux用户名,更多的变量请参考如表5-1所示的Samba变量表。
表5-1 Samba变量表
5.3.3 smb.conf文件详解
smb.conf文件中的语法非常简单,下面我们就以前面设置的smb.conf文件为例,详细介绍其中的相关设置。
1.[global]部分
# ----------------------- Network Related Options ------------------------- workgroup = linux-china server string = Samba Server Version %v
设置了Samba计算机所处的工作组,以及计算机的描述信息。这些信息对于Windows客户端浏览非常重要。
netbios name = Samba Server
设置Samba服务器在网上邻居中显示的名字,默认是Samba Server Version 3.0.28-0.e15.8之类的字样。最后进行明确指定,以便Windows客户端识别。
; interfaces = lo eth0192.168.12.2/24192.168.13.2/24 ; hosts allow = 127. 192.168.12. 192.168.13.
hosts allow参数用于限制可以访问这台Samba服务器的客户机的IP地址范围。通过指定一系列网络地址,使得只有这些网络中的计算机才能访问这台服务器提供的资源,以提供安全限制。在默认情况下,这行配置被注释了,所有的客户都可以访问Samba服务器。
# logs split per machine ; log file = /var/log/samba/%m.log # max 50KB per log file, then rotate ; max log size = 50
指定Samba服务器的记录文件位置和具体文件名(默认值是/var/log/samba/%m.log,其中的%m是指客户端计算机名),并且设置每个记录文件的最大大小(单位是KB)。
; security = user
passdb backend = tdbsam
设置Samba服务器的用户验证模式,包括ADS、域、服务器、用户和共享5种级别。本部分设置的Samba密码验证采用的是tdbsam机制。
# ----------------------- Domain Members Options ------------------------ # password server = My_PDC_Name [My_BDC_Name] [My_Next_BDC_Name] # or to auto-locate the domain controller/s # password server = * ; security = domain ; passdb backend = tdbsam ; realm = MY_REALM ; password server = <NT-Server-Name>
设置密码验证服务器的名字,在服务器、域和ADS验证模式下都需要设置。
# ----------------------- Domain Controller Options ------------------------ ; security = user ; passdb backend = tdbsam ; domain master = yes ; domain logons = yes # the login script name depends on the machine name ; logon script = %m.bat ;每一台计算机运行一个指定的登录批处理文件 # the login script name depends on the unix user used ; logon script = %u.bat ;每一个用户名运行一个指定的登录批处理文件 ; logon path = \\%L\Profiles\%u ;指定登录路径 # disables profiles support by specifing an empty path ; logon path = ; add user script = /usr/sbin/useradd "%u" -n -g users ; add group script = /usr/sbin/groupadd "%g" ; add machine script = /usr/sbin/useradd -n -c "Workstation (%u)" -M -d /nohome -s /bin/false "%u" ; delete user script = /usr/sbin/userdel "%u" ; delete user from group script = /usr/sbin/userdel "%u" "%g" ; delete group script = /usr/sbin/groupdel "%g"
在域模式下的设置,包括主域控制器、密码验证模式,以及登录前和登录后需要进行的操作。
# ----------------------- Browser Control Options ---------------------------- ; local master = no ; os level = 33 ; preferred master = yes
浏览器控制选项,设置OS级别,以及是否竞争参加主浏览服务器竞选。
小知识
Windows的“网上邻居”列表是这样工作的:当计算机启动时,首先会寻找网络中的一台机器——主浏览器,然后报告自己存在于这个网络中,主浏览器通过维护一个“浏览表”来实现NetBIOS名称到IP地址的映射。
如果计算机启动时,没有找到“主浏览器”,则会通过“选举”来推选出一个,选举规则主要通过操作系统的类型、级别等信息来确定。
#----------------------------- Name Resolution ------------------------------- ; wins support = yes ; wins server = w.x.y.z ; wins proxy = yes ; dns proxy = yes
设置Samba服务器是否支持WINS和DNS代理。
# --------------------------- Printing Options ----------------------------- ; load printers = yes cups options = raw username map = /etc/samba/smbusers ; security = user ; encrypt passwords = yes ; guest ok = no ; guest account = nobody ; encrypt passwords = yes ;采用密码加密 ; guest ok = no ;不允许匿名用户使用 ; guest account = nobody ;匿名用户映射为Linux下的nobody账号 ; printcap name = /etc/printcap ;指定打印机名 #obtain list of printers automatically on SystemV ; printcap name = lpstat ; printing = cups ;指定打印机类型
设置打印机控制选项。
2.[homes]部分
comment = Home Directories browseable = no writeable = yes ; valid users = %S ; valid users = MYDOMAIN\%S
为每个用户设置一个随用户名而变化的动态目录,映射到相应的Linux用户的家目录中。
3.[printers]部分
本部分用于设置共享的打印机。
comment = All Printers path = /var/spool/samba browseable = no ; guest ok = no ;不允许匿名访问 ; writeable = no printable = yes ;允许打印
4.其他共享
由于我们在前文设置了一个Public共享,所以它还会在smb.conf文件中单独列出来。
[Public]
comment = clinuxer的共享资源
path = /export/samba
writeable = yes ;允许写入
; browseable = yes
guest ok = yes ;允许匿名访问
5.4 Samba服务的安全级别
Samba支持5种安全级别的用户身份验证,分别是share、user、server、domain和ads。相关的设置在/etc/samba/smb.conf中,位置如图5-26所示。
图5-26 Samba支持5种安全级别
security = [share —user — server —domain —ads]
5.4.1 共享安全级别
security=share
共享级的权限,客户端在连接请求期间发送一个口令,不需要任何相关的用户信息。共享级的权限是Windows 95文件和打印服务器的默认设置,因为安全性不高,加之目前Windows 95之前的操作系统用户已经很少,所以不推荐使用。
5.4.2 用户安全级别
security=user
这是现在Samba默认的安全级别。在该模式下,Samba在接收到用户的访问请求时,会包办密码检查工作(用户名和密码必须在/etc/samba/smbpasswd中有定义)。需要注意的是,Samba使用的密码,是微软的编码方法。为了保证安全,还要设置:
encrypt passwords = yes
采用encrypt password的好处是,密码不会在网络上传送,故不存在明文密码在网上传送被嗅探的安全问题。
5.4.3 服务器安全级别
security=server
在这个模式下,Samba会把密码验证工作交给指定的Server。只有在无法通过验证的情况下,才自动切换到security=user模式。
5.4.4 域安全级别
security=domain
在该模式下,Samba会模拟一台加入Windows域的服务器,类似于Windows服务器安装时加入域的动作。当然,此时你需要有Windows域的管理员账号。
小提示
不管是security=server还是security=domain模式,都需要指定“password server =ServerName”选项。
5.4.5 活动目录安全级别
security=ads
从Samba 3.0开始,可以完美支持Windows 2000/2003服务器ADS。不过,要采用该模式,客户端系统必须都是Windows 2000、XP甚至Vista等更高版本才行。
5.5 访问Samba共享资源
设置好Samba服务器和共享资源后,客户端的访问方式随系统是Linux还是Windows而异。
1.Windows客户端访问共享资源
Windows用户访问Samba服务器共享资源很简单,通过“网上邻居”就可以了。
在Windows客户端打开“网上邻居”,输入正确的账户名和密码访问Samba服务器,就可以看到目录了,如图5-27所示。
图5-27 Samba共享文件夹
2.Linux客户端访问共享资源
Linux客户端访问共享资源,如果是在图形桌面环境下,那么与Windows下并没有太大的区别。不过,与Windows下不同的是,Linux提供了强大的命令行工具,这个工具某些时候用起来更方便。
1 Red Hat Enterprise Linux 5中有一个smbclient工具,可以用来从命令行访问服务器端提供的共享资源。输入以下命令连接到服务器上的movies共享上,如图5-28所示。
图5-28 从命令行访问“网上邻居”共享资源
[root@localhost ~]#smbclient //192.168.0.3/movies -U Administrator Password: Domain=[Devil] OS=[Windows 5.1 ] Server=[Windows 2000 LAN Manager] smb:\>
{L-End} 2 在“smb:\>”提示符下,我们可以输入各种命令,比如ls——列表,mget——多文件下载,mput——多文件上传。此时的命令行,就如同ftp工具,如图5-29所示。
图5-29 看看共享了哪些资源
如果不熟悉具体的使用方法,可以输入“help”命令查看帮助信息。