SAMBA基础
时间:2005-12-05 来源:rickyweiwei
用途:实现windows 和 Linux以及其他操作系统之间的资源共享
Windows利用SMB协议来实现操作系统间文件和打印机共享,而Samba本身具备SMB协议,它实现局域网内和Windows系列计算机的资源共享。
1、SMB协议
SMB (Server Message Block,服务信息块) 协议,是局域网上的共享文件/打印机的一种协议,它可以为网络内部的其他windows和linux 机器提供文件系统、打印服务。SMB的工作原理是让NetBIOS和SMB运行在TCP/IP之上,且使用NetBIOS的nameserver让linux机器可以在windows 网络邻居里被浏览。
通过“NetBIOS over TCP/IP”使得Samba 不但能与局域网络主机分享资源,更能与全世界的电脑分享资源;因为互联网上千千万万的主 机所使用的通讯协议就是TCP/IP。SMB是在会话层(ession layer)和表示层(presentation layer) 以及小部分应用层(applicationlayer)的协议。SMB使用了NetBIOS的应用程序接口
(Application Program Interface,简称API)。另外,它是一个开放性的协议,允许了协议 扩展——使得它变得更大而且复杂;大约有65个最上层的作业,而每个作业都超过120个函数, 甚至Windows NT也没有全部支持到,最近微软又把 SMB 改名为 CIFS(Common Internet File System), 并且加入了许多新的特色,而Samba亦支持了 NT Lan Manager 0.12等 SMB 的延伸协议,这是得Samba具有管理NT网域的能力。
SMB客户或服务器总是希望使用NETBIOS接口,换而言之,无论底层使用什么协议,SMB总希望使用统一的接口和远程系统进行通信。我们可以把NETBIOS想象为乘客,而把它下层的协议想像成随便什么交通工具,这些交通工具载着乘客从A地到达B地,完成通信。那么在使用NetBEUI时会有什么问题呢?NetBEUI的问题我们还可以用上面的例子进行说明,在这种环境下,NetBEUI基本上就是一个NETBIOS,它被直接传上网络,这个乘客本来可以坐车的,现在要自己从A地走到B地。NETBEUI采用一种广播式的发送方式,它象一个在大街上到处大喊着找人的乘客,这样虽然也找到,而且有时候速度还挺快,可是网络(这里我们把网络比喻为大街)会变得十分乱。在默认情况下,Windows和OS/2 Warp使用NETBEUI作为默认协议,因此这种协议不同任何配置即可使用。
我们上面还提到了在TCP/IP的基础上使用NetBIOS,那么我们为什么要使用TCP/IP呢,我们在什么时候要使用这种协议呢?因为用TCP/IP协议在计算机间进行通信有它的优势,这种方法不采用广播式的发送方法,而采用直接发送的方法,这样可以让网络内的无用噪声减少。而基于TCP/IP使用NetBIOS是一个非常流行的使用方法(当然用户也可以使用别的通信协议传送NETBIOS信息),因为互联网的广泛使用,计算机上一般都安装了TCP/IP,这对使用提供了方便,事实上,Samba甚至要求使用基于TCP/IP的NetBIOS,而根本不支持基于NetBEUI的NetBIOS。
因为基于TCP/IP使用NetBIOS时要使用到TCP/IP,用户必须将安全性考虑在内,这一点十分重要,不然出了问题不好办。
一、 客户命令:
smbclient :访问所有共享资源
smbstatus: 列出当前所有的samba连接状态
smbpasswd:修改samba用户口令、增加samba用户。
Nmblookup:用于查询主机的NetBIOS名,并将其映射为IP地址
Testparam: 用于检查配置文件中的参数设置是否正确
Smbclient命令用来存取远程Samba服务器上的资源。其命令形式与ftp相似。
命令语法是:#smbclient [password] [option]
(1) 解释:servicename是要连接的资源名称,资源名称的形式如下:
//server/service server 是远程服务器的NetBIOS名字,对于windows服务器而言,就是出现在网上邻居中的名字。
Service是各server所提供的资源的名字。
pssword 是存取该资源所需的口令
option 各种命令选项,其中 -L 用于列出远程服务器提供的所有资源
-I 指定远程服务器的IP地址。此时,servicesname 中的NetBIOS名部分将被忽略。
(2)多种smbclient命令:
执行smbclient命令成功后,进入smbclient环境,出现提示符: smb:>
这里有许多命令和ftp命令相似,如cd 、lcd、get、megt、put、mput等。通过这些命令,我们可以访问远程主机的共享资源。
-N 选项禁止 smbclient 提示用户输入口令,当连接不需要口令的资源时可以使用该选项。即匿名访问资源。
使用 -L 选项将列出远程服务器提供的所有资源。如果不知道服务器的 netbios 名,可以使用 -I 选项来指定它的 IP 地址,如:
可用的 smbclient 开关:
sharename : 完整的共享名路径。如 servershare。
-U username : 登录的用户名。
password : 登录用口令。
-L : 列出所有已知的服务器和共享资源。
smbclient -L comet
开关 -L 查询服务器 comet 中的可用共享资源。
2. smbmount
要使用 smbclient 安装 samba 文件系统,linux 内核必须包含 smbfs 的支持模块。在 Turbolinux 里默认内核包含了该模块。除非你自己重新编译了新内核才需要加以注意。smbmount 命令的语法是:
smbmunt <servicename> <mount-point>
其中 servicename 是资源名,mount-point 是安装点。
3. smbumount
二、 后台进程 配置文件
1、 核心进程
Samba 有两个守护进程:smbd 和nmbd,它们是Samba的核心进程。nmbd进程使其他计算机浏览Linux服务器,Smbd进程在SMB服务请求到达时对它们进行处理,并且为使用或共享的资源进行协调。
2. smb.conf
smb.conf 在初始化期间被用于配置 nmbd 和 smbd.
NetBIOS name:设置主机名称
Workgroup:用来指定主机所在网络上所属的NT域名或者工作组名称。格式是
Workgroup= Nt Domain-Name or workgroup-name
Server string:用来设置本机描述,缺省是 Samba Server
Host Allow:它允许设置哪些领域的机器可以访问它的Samba服务器
Load printers:允许自动加载打印机列表,而不需要单独设置每一台打印机。
Interface:配置Samba使用多个网络界面。
Domain controller: 仅当网络中有一台在安装时设置为主域控制器时使用此选项。
Security: 设置安全参数,定义安全模式。Samba 的安全模式有四种
Share、 user、 server 、domain
encrypt passwords 、smb passwd file:用于适用加密口令。
[global]
Global Setting 与配置特定的共享相对,全局设置用于配置整体 SAMBA 环境。全局设置列出在段标题[global]下。该节中的参数适用于整个 Samba 服务器,或者是其他节的默认值。
Other Shares 你可以把文件系统的任何部分设置为共享。创建共享时,以附上了方括号的共享名作为共享部分的开始,例如 [public]。在共享名之后,每行用列出的一个命令,你指定任何你想应用于该共享部分的参数。
Share Setting 以下是一个可用于处理共享资源的某些命令的简短列表:
browseable=yes/no 它指出共享对于正在浏览的客户是否可见,或者共享通过使用UNC(通用命名约定)才能访问。例如要访问共享名 public ,而其浏览功能已经被关闭(no),则必须通过输入 UNCserverpubic 来访问它。它不会出现在浏览列表中(即在浏览器中不可见)。
only guest=yes 指定用户对该共享资源的访问只能是客户级的。如果文件许可被正确地设置,则其作用是用户只能看到目录下的文件,但不能进行读写操作。
path=share directory path 定义了一个目录,当用户要访问一个已发布了的共享名字时,就可以访问上述被定义的目录。例如,如果创建了一个名为 public 的共享资源,并且指定 path 等于 /usr/expense/template,则对共享的 public 的访问将直接进入 template 目录,系统将不允许进入该目录的上一级目录结构,而只能进入下一级。
public= yes/no 定义一个共享是否对公共访问开放。当设置为 yes 时,在系统上没有帐户的用户将基于所定义的客户帐户的属性来接收访问。
valid users=username 指定只有具有特定的登录名的用户才能访问共享。可以指定用空格分开的多个登录名。( all 表示所有)
writable=yes/no 定义了一个共享能否使用读/写许可来访问,或一个文件系统能否替代地被认为只读。定义用户接受到访问级的是这个设定和分配给用户 UNIX 帐户一些许可的组合,不管其中哪一个较低。例如,如果用户访问标记为可写的共享,但其 UNIX 帐户有只读许可,那么该用户只能得到该共享的只读访问权。
[home]
如果配置文件中包含该节,那么服务器就可以动态地为用户提供连接到其私人目录的共享.
如果用户要求连接一个配置文件中不存在的共享,服务器就假设用户提供的共享名是一个帐号,然后在本地的密码文件中查找该帐号.如果该帐号存在,并且用户提供了正确的口令,那么服务器就拷贝[在home]节来建立一个新的共享,同时作出如下修改:
1> 将共享名改为帐号名.
2> 如果在[home]节中没有指定要共享的目录,那么就使用该帐号的私人目录.
3> 如果要在[home]节中指定 path 参数,那么宏 %S 是非常有用的,它代表当前共享的名称.例如: path=/data/%S
这种方法允许为 PC 用户和 Linux 用户提供不同的私人目录.
由此可见,使用 [home] 节可以简单而快速地允许大量用户存取各自的私人目录.如果用户请求的共享名就是 homes ,服务器同样会为其动态地建立共享,唯一的不同是新共享的名称仍然是 homes.
[printers]
该节有点类似于 [homes] 节,只不过是针对打印机的.如果配置文件中包含 [homes] ,
用户就可以连接到本地 printcap 文件中定义的任何一台打印机.如果用户请求连接一个配置文件中不存在的共享,若 [homes] 节存在,那么服务器会像上节所述那样处理该请求;否则服务器将请求连接的共享名视为一个打印机名,并且在 printcap 文件中查找是否存在可以匹配的打印机,如果存在,就拷贝 [printers] 节以建立新的共享.
注意: [printers] 节必须是可打印的,否则服务器将拒绝装载配置文件,例如:
[printers]
path = /home/samba/print/public
writeable = no
guest ok = yes
printable = yes
宏替换:
配置文件中允许宏替换,"注意大小写".
-----------------------------------------------------------------------
宏 描 述
-----------------------------------------------------------------------
%S 当前服务或共享的名称
%P 当前服务或共享的目录
%u 当前服务或共享使用的用户名
%g %u 所在组的名称
%U 当前会话使用的用户名(登录名?!),即客户机所期望的用户名,可以和客户机真正得到的用户名不同.
%G %U 所在组的名称
%H %u 的私人目录(主目录)
%v Samba 的版本号
%h Samba 服务器的 NetBIOS 名
%m 客户机的 NetBIOS 主机名(Win9x的机器名)
%L 服务器的 NetBIOS 名
%N 服务器的(?????)名
%M 客户机的 Internet 主机名
%I 客户机的 IP 地址
%T 当前的日期和时间
%d 当前服务器进程 ID
%a 远程客户机的体系结构,目前只能识别WfWg,NT,和 Win 95、98,并且不是100%可靠,其他系统被标示为 UNKNOWN
-----------------------------------------------------------------------
三、 用户身份验证:
帐号对于 Samba 来说非常重要,用户必须拥有合法的帐号才能连接非 guest 性质的Samba 服务,并且该帐号决定了他享有的权限.即使一个共享是 guest 共享, Samba 也需要一个特定的帐号来提供服务.
用户有许多种连接 Sabma 服务的方法.服务器遵循下面的步骤决定是否允许一个连接,如果所有的步骤都失败了,就拒绝连接;如果其中有一步成功了,就不再执行其后的步骤.
1> 如果请求连接的共享包含 " guest only = yes " 参数,那么用户就以" guest account = " 参数制定的身份连接,而不考虑其提供的密码.
2> 如果客户机提供了一个帐号/密码对,并且该帐号/密码对通过了 Linux 系统的身份验证,那么用户就以该帐号连接.注意这里包括以 "serverservice\%username" 形式提供的帐号.
3> 检查客户机的 NetBIOS 名称(亦即 Windows 在网络中使用的计算机名)以及其他曾使用过的帐号,如果有一个可以和提供的密码匹配,那么就允许连接.
4> 如果客户机已经通过了帐号密码验证,并且向服务器发送了验证标志( validation token),那么用户就以该帐号连接.
5> 如果请求的共享包含 " user = " 参数,同时客户机提供了一个密码,并且该密码可以和帐号列表中的一个帐号匹配,那么用户就以该帐号连接.如果" user = " 参数中的某个帐号以 " @ " 开头,那么它会被视为一个用户组名,该组中所有的用户帐号都被包含在 " user = " 列表中.
四、 Samba 的安全级
Samba 有四种安全级,由参数 security 定义,该参数只能出现在 [global] 中,是一个全局参数.
这四种安全级是 share,user,server,domain ,其中后三种属于安全模式( Security Mode ),这里重点讨论 share 和 user 安全级.
1) security = share
当客户机连接到一个 share 安全级的服务器时,它在连接共享之前