16.2 SAMBA 服务器的基础设定

SAMBA 这个软件几乎在所有的 Linux distributions 上面都有提供,因为即使你的 Linux 仅做为个人桌面计算机使用时, 你依旧可能会需要联机到远程的 Windows 网芳,那个时候就得要 samba 提供的客户端软件功能啰! 因此你只要直接安装系统上面提供的默认 samba 版本即可。底下我们会先介绍 samba 服务器,然后再介绍客户端功能喔!


16.2.1 Samba 所需软件及其软件结构

目前常见的 samba 版本为 3.x 版,旧版的 2.x 版在设定上有点不一样,因此在进入设定前请先确认你的 samba 版本。 咱们的 CentOS 6.x 主要提供的是 Samba 3.x 的版本,不过也有释出 4.x 的版本 (samba4),我们这里主要介绍的是预设的 3.x 版本的。那么你需要什么软件呢?基本上有这些:

  • samba: 这个软件主要提供了 SMB 服务器所需的各项服务程序 (smbd 及 nmbd)、 的文件档、以及其他与 SAMBA 相关的 logrotate 配置文件及开机默认选项档案等;

  • samba-client: 这个软件则提供了当 Linux 做为 SAMBA Client 端时,所需要的工具指令,例如挂载 SAMBA 文件格式的 mount.cifs、 取得类似网芳相关树形图的 smbtree 等等;

  • samba-common: 这个软件提供的则是服务器与客户端都会使用到的数据,包括 SAMBA 的主要配置文件 (smb.conf)、语法检验指令 (testparm) 等等;

这三个软件你都得要安装才行喔!如果尚未安装的话,使用 yum 去装好它吧!安装完毕之后,你可以依序察看一下 Samba 的软件结构喔!与它相关的配置文件基本上有这些:

  • /etc/samba/smb.conf: 这是 Samba 的主要配置文件,基本上,咱们的 Samba 就仅有这个配置文件而已,且这个配置文件本身就是很详细的说明文件了,请用 vim 去查阅它吧!主要的设定项目分为服务器的相关设定 (global),如工作组、NetBIOS 名称与密码等级等, 以及分享的目录等相关设定,如实际目录、分享资源名称与权限等等两大部分。

  • /etc/samba/lmhosts: 早期的 NetBIOS name 需额外设定,因此需要这个 lmhosts 的 NetBIOS name 对应的 IP 檔。 事实上它有点像是 /etc/hosts 的功能!只不过这个 lmhosts 对应的主机名是 NetBIOS name 喔!不要跟 /etc/hosts 搞混了!目前 Samba 预设会去使用你的本机名称 (hostname) 作为你的 NetBIOS name,因此这个档案不设定也无所谓。

  • /etc/sysconfig/samba: 提供启动 smbd, nmbd 时,你还想要加入的相关服务参数。

  • /etc/samba/smbusers: 由于 Windows 与 Linux 在管理员与访客的账号名称不一致,例如: administrator (windows) 及 root(linux), 为了对应这两者之间的账号关系,可使用这个档案来设定

  • /var/lib/samba/private/{passdb.tdb,secrets.tdb}: 管理 Samba 的用户账号/密码时,会用到的数据库档案;

  • /usr/share/doc/samba-<版本>: 这个目录包含了 SAMBA 的所有相关的技术手册喔!也就是说,当你安装好了 SAMBA 之后,你的系统里面就已经含有相当丰富而完整的 SAMBA 使用手册了!值得高兴吧! ^_^,所以,赶紧自行参考喔!

至于常用的脚本文件案方面,若分为服务器与客户端功能,则主要有底下这几个数据:

  • /usr/sbin/{smbd,nmbd}:服务器功能,就是最重要的权限管理 (smbd) 以及 NetBIOS name 查询 (nmbd) 两个重要的服务程序;

  • /usr/bin/{tdbdump,tdbtool}:服务器功能,在 Samba 3.0 以后的版本中,用户的账号与密码参数已经转为使用数据库了!Samba 使用的数据库名称为 TDB (Trivial DataBase)。 既然是使用数据库,当然要使用数据库的控制指令来处理啰。tdbdump 可以察看数据库的内容,tdbtool 则可以进入数据库操作接口直接手动修改帐密参数。不过,你得要安装 tdb-tools 这个软件才行;

  • /usr/bin/smbstatus:服务器功能,可以列出目前 Samba 的联机状况, 包括每一条 Samba 联机的 PID, 分享的资源,使用的用户来源等等,让你轻松管理 Samba 啦;

  • /usr/bin/{smbpasswd,pdbedit}:服务器功能,在管理 Samba 的用户账号密码时, 早期是使用 smbpasswd 这个指令,不过因为后来使用 TDB 数据库了,因此建议使用新的 pdbedit 指令来管理用户数据;

  • /usr/bin/testparm:服务器功能,这个指令主要在检验配置文件 smb.conf 的语法正确与否,当你编辑过 smb.conf 时,请务必使用这个指令来检查一次,避免因为打字错误引起的困扰啊!

  • /sbin/mount.cifs:客户端功能,在 Windows 上面我们可以设定『网络驱动器机』来连接到自己的主机上面。在 Linux 上面,我们则是透过 mount (mount.cifs) 来将远程主机分享的档案与目录挂载到自己的 Linux 主机上面哪!

  • /usr/bin/smbclient:客户端功能,当你的 Linux 主机想要藉由『网络上的芳邻』的功能来查看别台计算机所分享出来的目录与装置时,就可以使用 smbclient 来查看啦!这个指令也可以使用在自己的 SAMBA 主机上面,用来查看是否设定成功哩!

  • /usr/bin/nmblookup:客户端功能,有点类似 nslookup 啦!重点在查出 NetBIOS name 就是了。

  • /usr/bin/smbtree:客户端功能,这玩意就有点像 Windows 系统的网络上的芳邻显示的结果,可以显示类似『靠近我的计算机』之类的数据, 能够查到工作组与计算机名称的树状目录分布图!

大致的软件结构就是这样,底下就准备来讲一个简单的案例吧!这样比较好介绍配置文件项目啦!


16.2.2 基础的网芳分享流程与 smb.conf 的常用设定项目

既然 Samba 是要加入 Windows 的网芳服务当中,所以它的设定方式应该是要与网芳差不多才是。所以我们先来聊一聊 Windows 的一些网芳设定方法再说。在早期 Windows 的网芳设定真是很简单,不过也因为太简单, 所以产生的安全问题可是相当的麻烦的。后来在 Windows XP 的 SP2 (服务包第二版) 之后加入了很多的预设防火墙机制, 因此使用网芳的预设限制常常会是这样的:

  • 服务器与客户端之间必须要在同一个网域当中 (否则需要修改 Windows 预设防火墙);
  • 最好设定为同一工作组;
  • 主机的名称不可相同 (NetBIOS name);
  • 专业版 Windows XP 最多仅能提供同时 10 个用户联机到同一台网芳服务器上。

工作组与主机名的设定,你可以在『我的计算机』右键单击,选择内容后去修订相关的设定值。当你的 Windows 主机群符合上述的条件后,就很容易处理网芳分享的工作啦!分享的步骤一般是这样的:

  1. 叫出档案总管,然后在要分享的目录、磁盘或装置 (如打印机) 上面按下右键,选择『共享』,然后就能够设定好分享的数据了;
  2. 最好建立一组给用户使用的账号与密码,让其他主机的用户可以透过该账号密码联机进入使用网芳分享的资源;

例题:假设你打开 Windows XP 的档案总管,在 D:\VBird\Data 这个目录下,你按下右键选『共享与安全性』,之后,在出现的窗口中, 你选择:『你了解这个安全风险,但仍不要执行精灵而共享档案,请按这里』,然后勾选:『在网络上共享这个文件夹』, 最后共享的名称你输入了:『VBGame』,请问,假设你的 IP 是 192.168.100.20 ,那么你的用户会看到什么网址列?答:网芳的资源名称通常的写法是:『 \IP\分享资源名称』,我们的分享资源名称为 VBGame,因此最终这个分享的资源名称应该是:『 \192.168.100.20\VBGame 』才对!很多朋友都会写成:『 \192.168.100.20\VBird\Game 』那错得很离谱喔!

真是有够简单的!那么 Samba 怎么设定啊?也是很简单,依据上述的限制以及流程你可以这样想象:

  1. 服务器整体设定方面:在 smb.conf 当中设定好工作组、NetBIOS 主机名、密码使用状态 (无密码分享或本机密码) 等等;
  2. 规划准备分享的目录参数:在 smb.conf 内设定好预计要分享的目录或装置以及可供使用的账号数据;
  3. 建立所需要的文件系统:根据步骤 2 的设定,在 Linux 文件系统当中建立好分享出去的档案或装置,以及相关的权限参数;
  4. 建立可用 Samba 的账号:根据步骤 2 的设定,建立所需的 Linux 实体账号,再以 pdbedit 建立使用 Samba 的密码;
  5. 启动服务:启动 Samba 的 smbd, nmbd 服务,开始运转哩!

根据上面的流程,其实我们最需要知道的就是 smb.conf 这个配置文件的信息就是了。 所以首先我们就要来介绍一下这个档案的设定方式啰!这个档案其实可以分为两部份来看, 一个是主机信息部分,在 smb.conf 当中以 [global] (全领域) 作为设定的依据;另一个则是分享的信息, 以个别的目录名称为依据。另外,由于 Samba 主要是想加入网芳功能,因此在 smb.conf 内的很多设定都与 Windows 类似喔:

  • 在 smb.conf 当中,井字号与分号 (# 跟 ;) 都是批注符号;
  • 在这个配置文件中,大小写是没关系的!因为 Windows 没分大小写!

  • smb.conf 的服务器整体参数: [global] 项目

在 smb.conf 这个配置文件当中的设定项目有点像底下这样:

# 会有很多加上 # 或 ; 的批注说明,你也可以自行加上来提醒自己相关设定
[global]
   参数项目 = 设定内容
   ....

[分享资源名称]
   参数项目 = 设定内容
   ....

在 [global] 当中的就是一些服务器的整体参数了,包括工作组、主机的 NetBIOS 名称、字符编码的显示、登录文件的设定、 是否使用密码以及使用密码验证的机制等等,都是在这个 [global] 项目中设定的。至于 [分享资源名称] 则是针对你开放的目录来进权限方面的设定,包括谁可以浏览该目录、是否可以读写等等参数。 在 [global] 部分关于主机名信息方面的参数主要有:

  • workgroup = 工作组的名称:注意,主机群要相同;
  • netbios name = 主机的 NetBIOS 名称啊,每部主机均不同;
  • server string = 主机的简易说明,这个随便写即可。

另外,过去常常让使用者心生不满的语系显示问题方面,你务必要清楚的知道的是,SAMBA 服务器上面的数据 (例如 mount 磁盘分区槽的参数以及原本的数据编码), SAMBA 服务器显示的语系, Windows 客户端显示的语系, Windows 客户端连上 SAMBA 的软件 都需要符合设定值才行!在新版的 3.x 上面有数个提供这些语系转换的设定喔,如下所示:

  • display charset = 自己服务器上面的显示编码, 例如你在终端机时所查阅的编码信息。一般来说,与底下的 unix charset 会相同。
  • unix charset = 在 Linux 服务器上面所使用的编码,一般来说就是 i18n 的编码啰! 所以你必须要参考 /etc/sysconfig/i18n 内的『默认』编码。
  • dos charset = 就是 Windows 客户端的编码了! 一般来说我们的繁体中文 Windows 使用的是 big5 编码,这个编码在 Samba 内的格式被称为『 cp950 』喔!

关于语系编码,建议你参考一下讨论区的这一篇:

我们的网友 eyesblue 写得太好了!所以建议大家直接前往查阅即可!在这里鸟哥将该文章内容作个例题来玩玩。

例题:假设你的 Samba 使用的语系 /etc/sysconfig/i18n 显示的是『 LANG="zh_TW.big5" 』, 而预计要分享的目标 Windows 系统是 XP,那么你的语系数据应该如何设定?答:由于 Linux, Windows XP 都使用 big5 编码,因此设定值应该是:

        unix charset    = cp950
        display charset = cp950
        dos charset     = cp950

除此之外,还有登录文件方面的信息,包括这些参数:

  • log file = 登录档放置的档案,文件名可能会使用变量处理;
  • max log size = 登录档最大仅能到多少 Kbytes ,若大于该数字,则会被 rotate 掉。

还有网芳开放分享时,安全性程度有关的密码参数,包括这几个:

  • security = share, user, domain:三选一,这三个设定值分别代表:

    • share:分享的数据不需要密码,大家均可使用 (没有安全性);
    • user :使用 SAMBA 服务器本身的密码数据库,密码数据库与底下的 passdb backend 有关;
    • domain:使用外部服务器的密码,亦即 SAMBA 是客户端之意,如果设定这个项目, 你还得要提供『password server = IP』的设定值才行;
  • encrypt passwords = Yes 代表密码要加密,注意那个 passwords 要有 s 才对!

  • passdb backend = 数据库格式,如前所述,为了加快速度, 目前密码文件已经转为使用数据库了!默认的数据库格式微 tdbsam ,而预设的档案则放置到 /var/lib/samba/private/passwd.tdb。

事实上 Samba 的密码方面设定值很多喔,包括你还可以利用 samba 来修改 /etc/passwd 里头的人物的密码呢! 不过这个时候就得需要『 unix password sync 』以及『 passwd program 』这两个参数值的帮忙了。 我们这里先谈比较简单的,其他进阶的部分可以 man smb.conf 去进行搜寻查阅喔! ^_^

  • 分享资源的相关参数设定 [分享的名称]

这部分就是我们在前面的小范例当中说明的,要将 (1)哪个实际的目录 (2)分享成什么名称?中刮号里面放的是『分享名称』! 那在这个分享名称内常见的参数有:

  • [分享名称] :这个分享名称很重要,它是一个『代号』而已。记得回去看看 16.2.2 里面提到的那个范例;

  • comment :只是这个目录的说明而已!

  • path :这个分享名称实际会进入的 Linux 文件系统 (目录)。 也就是说,在网芳当中看到的是 [分享] 的名称,而实际操作的文件系统则是在 path 里头所设定的。

  • browseable :是否让所有的用户看到这个项目?

  • writable :是否可以写入?这里需要注意一下喔!那个 read only 与 writable 不是两个蛮相似的设定值吗?如果 writable 在这里设定为 yes ,亦即可以写入,如果 read only 同时设定为 yes , 那不就互相抵触了!那个才是正确的设定?答案是:最后出现的那个设定值为主要的设定!

  • create mode 与 directory mode 都与权限有关的咯!

  • writelist = 使用者, @群组,这个项目可以指定能够进入到此资源的特定使用者。 如果是 @group 的格式,则加入该群组的使用者均可取得使用的权限,设定上会比较简单!

因为分享的资源主要与 Linux 系统的档案权限有关,因此里头的设定参数多与权限有关。

  • smb.conf 内的可用变量功能

为了简化设定值,Samba 提供很多不同的变量给我们来使用,主要有底下这几个变量喔:

  • %S:取代目前的设定项目值,所谓的『设定项目值』就是在 [分享] 里面的内容!举例来说,例如底下的设定范例:

    [homes]
       valid users = %S
       ....
    

    因为 valid users 是允许的登入者,设定为 %S 表示任何可登入的使用者都能够登入的意思~今天如果 dmtsai 这个使用者登入之后,那个 [homes] 就会自动的变成了 [dmtsai] 了!这样可以明白了吗? %S 的用意就是在替换掉目前 [ ] 里面的内容啦!

  • %m:代表 Client 端的 NetBIOS 主机名喔!
  • %M:代表 Client 端的 Internet 主机名喔!就是 HOSTNAME。
  • %L:代表 SAMBA 主机的 NetBIOS 主机名。
  • %H:代表用户的家目录。
  • %U:代表目前登入的使用者的使用者名称
  • %g:代表登入的使用者的组名。
  • %h:代表目前这部 SAMBA 主机的 HOSTNAME 喔!注意是 hostname 不是 NetBIOS name 喔!
  • %I:代表 Client 的 IP 咯。
  • %T:代表目前的日期与时间

以上就是在 smb.conf 上头常看到的几种设定项目,相信初次接触 Samba 的朋友,看到上头写的资料肯定是一头雾水的! 我们底下用几个小范例来实际的介绍 smb.conf 的设定后,你就会知道这些参数如何应用了! 记得,看完底下的下范例后,要回来再将这些参数的意义瞧一瞧, 而且若有其他额外的参数须知,务必自行 man smb.conf 喔!重要的很!

Tips: 时代变动太快,版本变动太多~要讲完所有的参数实在是很难的一件事~所以在这里鸟哥只讲一些常用的设定项目, 很多细项就得要靠各位看官自己努力了~文末也有列出很多 Samba 的在线资源,记得要查察看!


16.2.3 不需密码的分享 (security = share, 纯测试)

瞎密?不需要密码就能够使用 SAMBA 主机所提供的目录资源?真假?没错啦,可以达到的。不过,因为不需要密码就能够登入, 虽然你可以设定权限成为只读,让使用者可以『瞧瞧而已』,但是毕竟比较危险。 因为如果你不小心将重要数据放置到该分享的目录当中,岂不危险?所以尽量不要这样设定,所以标题才会讲:『纯测试』嘛!

  • 0. 假设条件

在底下的案例中,服务器 (192.168.100.254) 预计设定的参数状况为:

  • 在 LAN 内所有的网芳主机工作组 (workgroup) 为: vbirdhouse
  • 这部 Samba 服务器的 NetBIOS 名称 (netbios name) 为: vbirdserver
  • 使用者认证层级设定 (security) 为: share
  • 取消原本有放行的 [homes] 目录;
  • 仅分享 /tmp 这个目录而已,且取名为: temp
  • Linux 服务器的编码格式假设为万国码 (Unicode, 亦即 utf8)
  • 客户端为中文 Windows ,在客户端的软件也使用 big5 的编码

老实说, netbios name 几乎可以不用设定了,因为现在我们都用 IP 进行网芳联机,不一定会使用主机名嘛! 所以这一版当中,鸟哥取消了 lmhosts 的设定值喔!好了,底下就开始依序来进行 samba 的设定吧!

  • 1. 设定 smb.conf 配置文件

由于我们有设定语系相关的数据,因此得要先查查看,到底我们 Linux 服务器的语系是否为 utf8 呢?检查方法如下:

[root@www ~]# cat /etc/sysconfig/i18n
LANG="zh_TW.UTF-8"  &lt;==确实是出现了 utf8 喔!

如上所示,确实是 utf8 啊!而在这个例子当中我们仅分享 /tmp 这个目录而已,而且假设这个分享出来的目录是可擦写的, 另外,我们并没有分享打印机喔!而在 smb.conf 当中的批注符号可以是『 # 』也可以是『 ; 』喔!要注意!

[root@www ~]# cd /etc/samba
[root@www samba]# cp smb.conf smb.conf.raw  &lt;==先备份再说!
[root@www samba]# vim smb.conf
# 1\. 先设定好服务器整体环境方面的参数
[global]
        # 与主机名有关的设定信息
        workgroup     = vbirdhouse
        netbios name  = vbirdserver
        server string = This is vbird's samba server

        # 与语系方面有关的设定项目喔,为何如此设定请参考前面的说明
        unix charset    = utf8
        display charset = utf8
        dos charset     = cp950

        # 与登录文件有关的设定项目,注意变量 (%m)
        log file = /var/log/samba/log.%m
        max log size = 50

        # 这里才是与密码有关的设定项目哩!
        **security = share**

        # 修改一下打印机的加载方式,不要加载啦!
        load printers    = no

# 2\. 分享的资源设定方面:主要得将旧的批注,新的加入!
#    先取消 [homes], [printers] 的项目,然后针对 /tmp 的设定,可浏览且可写入喔
[temp]                                     &lt;==分享资源名称
        comment    = Temporary file space  &lt;==简单的解释此资源
        path       = /tmp                  &lt;==实际 Linux 分享的目录
        writable   = yes                   &lt;==是否可写入?在此例为是的
        browseable = yes                   &lt;==能不能被浏览到资源名称
        &lt;u&gt;guest ok   = yes&lt;/u&gt;                   &lt;==单纯分享时,让用户随意登入的设定值

请你特别留意,在原本的 smb.conf 上面就已经有很多默认值了,这些默认值如果你不知道他的用途, 尽量保留默认值,也可以使用 man smb.conf 去查询该默认值的意义。上述的设定是完全控制使用者的认证层级的呦!

  • 2. 用 testparm 查阅 smb.conf 的语法设定正确性

在启动 samba 之前,我们务必要了解到 smb.conf 里面语法是否正确,检验的方式使用 testparm 这个指令即可。 测试方式如下:

[root@www ~]# testparm
选项与参数:
-v :查阅完整的参数设定,连同默认值也会显示出来喔!

[root@www ~]# testparm
Load smb config files from /etc/samba/smb.conf
Processing section "[temp]"   &lt;==看有几个中括号,若中刮号前出现讯息,则有错误
Loaded services file OK.
Server role: ROLE_STANDALONE
Press enter to see a dump of your service definitions &lt;==按 Enter 继续

[global]   &lt;==底下就是刚刚在 smb.conf 里头设定的数据!
        dos charset = cp950
        unix charset = utf8
        display charset = utf8
        workgroup = VBIRDHOUSE
        netbios name = VBIRDSERVER
        server string = This is vbird's samba server
        security = SHARE
        log file = /var/log/samba/log.%m
        max log size = 50
        load printers = No

[temp]
        comment = Temporary file space
        path = /tmp
        read only = No
        guest ok = Yes

上头是语法验证与各个项目的列出,如果你下达 testparm 却出现如下画面那就是有问题:

[root@www ~]# testparm
Load smb config files from /etc/samba/smb.conf
Unknown parameter encountered: "linux charset" &lt;==中括号前为错误讯息!
Ignoring unknown parameter "linux charset"
Processing section "[temp]"
Loaded services file OK.
Server role: ROLE_STANDALONE
Press enter to see a dump of your service definitions

如果发现上述的错误,这表示你的 smb.conf 有个『 linux charset 』的设定参数,不过 smb.conf 其实是不支持这个参数的。 可能的问题是 samba 2.x 与 samba 3.x 有一些项目的支持已经不存在了,所以你使用旧版的 2.x 配置文件来 3.x 上头执行时,就会出现问题。此外,『打字错误』也是很常见的一个问题吶!赶紧测试一下语法先, 然后根据 smb.conf 存在的项目去进行修改吧。

如果你想要了解 samba 的所有设定 (包括没有在 smb.conf 里头设定的默认值),可以使用 testparm -v 来作详细的输出, 资料相当的丰富,透过这个你也可以知道你的主机环境设定为何呢! ^_^

  • 3. 服务器端的服务启动与埠口观察

启动实在太简单了,利用预设的 CentOS 启动方式来处理即可。

[root@www ~]# /etc/init.d/smb start  &lt;==这一版开始要启动两个daemon
[root@www ~]# /etc/init.d/nmb start
[root@www ~]# chkconfig smb on
[root@www ~]# chkconfig nmb on
[root@www ~]# netstat -tlunp &#124; grep mbd
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address        Foreign Address State   PID/Program name
tcp        0      0 :::139               :::*            LISTEN  1772/smbd
tcp        0      0 :::445               :::*            LISTEN  1772/smbd
udp        0      0 192.168.1.100:137    0.0.0.0:*               1780/nmbd
udp        0      0 192.168.100.254:137  0.0.0.0:*               1780/nmbd
udp        0      0 0.0.0.0:137          0.0.0.0:*               1780/nmbd
udp        0      0 192.168.1.100:138    0.0.0.0:*               1780/nmbd
udp        0      0 192.168.100.254:138  0.0.0.0:*               1780/nmbd
udp        0      0 0.0.0.0:138          0.0.0.0:*               1780/nmbd

特别注意,在 Samba 当中预设会启动多个端口,这包括数据传输的 TCP 端口 (139, 445),以及进行 NetBIOS 名称解析之类工作的 UDP 埠口 (137, 138),所以你才会看到很多数据的。那么能否仅支持 139 这个必要的埠口,关闭 445 呢?可以啊~透过 testparm -v 的观察,可以发现『 smb ports = 445 139 』这个设定值指定两个埠口的,因此你可以在 smb.conf 增加这个设定值,并改为 smb ports = 139 即可。不过,建议先保留默认值啦!

  • 4. 假设自我为客户端的检验 (默认用 lo 接口)

关于客户端的观察我们会在后续进行介绍。在这里仅是说明如何确定我们的 Samba 设定与服务有顺利的在运作。 我们可以在本机上透过 smbclient 这支程序来处理,它的基本查询语法是这样的:

[root@www ~]# smbclient -L [//主机或IP] [-U 使用者账号]
选项与参数:
-L :仅查阅后面接的主机所提供分享的目录资源;
-U :以后面接的这个账号来尝试取得该主机的可使用资源

由于在这个范例当中我们并没有规范用户的安全等级 (share),所以不必使用 -U 这个选项,因此你可以这样看看:

[root@www ~]# smbclient -L //127.0.0.1 
Enter root's password: &lt;==因为不需要密码,因此这里单击 [Enter] 吧!
Domain=[VBIRDHOUSE] OS=[Unix] Server=[Samba 3.5.4-68.el6_0.2]

        Sharename       Type      Comment
        ---------       ----      -------
        temp            Disk      Temporary file space
        IPC$            IPC       IPC Service (This is vbird's samba server)
Domain=[VBIRDHOUSE] OS=[Unix] Server=[Samba 3.5.4-68.el6_0.2]

        Server               Comment
        ---------            -------
        VBIRDSERVER          This is vbird's samba server

        Workgroup            Master
        ---------            -------
        VBIRDHOUSE           VBIRDSERVER

上表输出的信息当中,分享的目录资源 (Sharename) 就是在 smb.conf 当中设定的 [temp] 名称啰! 因此在这里的意思是:任何人都可以进入 //127.0.0.1/temp 这个目录当中, 而这个目录在 Linux 系统其实是 /tmp 目录。至于那个 IPC$ 则是为了要应付 Windows 环境所必须要存在的项目就是了。那么该如何使用这个资源呢?接下来我们可以利用 mount 这个指令来测试看看啰:

[root@www ~]# mount -t cifs //127.0.0.1/temp /mnt
Password: &lt;==因为没有密码,所以这里还是按 Enter 即可
[root@www ~]# df
Filesystem           1K-blocks      Used Available Use% Mounted on
....(前面省略)....
//127.0.0.1/temp/      1007896     53688    903008   6% /mnt

[root@www ~]# cd /mnt
[root@www mnt]# ll  &lt;==以上这两个动作要进行!才会知道有没有权限的问题!
[root@www mnt]# touch zzz
[root@www mnt]# ll zzz /tmp/zzz
-rw-r--r--. 1 nobody nobody 0 Jul 29 13:08 /tmp/zzz
-rw-r--r--. 1 nobody nobody 0 Jul 29 13:08 zzz
# 注意喔!你进入 /mnt 身份会被压缩成为 nobody 呢!不再是 root 啊!

[root@www mnt]# cd ; umount /mnt

确实可以挂载的起来,所以,测试完毕后,就将这个挂载的资料卸除吧。关于 mount 的用法,我们会在后面的小节继续介绍。


基本上,到此为止咱们就设定好一个简单的不需要密码即可登入的 Samba 服务器了! 你可以先行到客户端软件功能的部分进行更细部的挂载测试。 接下来,让我们以简易的需要密码才能够登入 Samba 的方式来设计一个范例吧!


16.2.4 需账号密码才可登入的分享 (security = user)

设定一部不需密码即可登入的 Samba server 是非常简单的,不过, 你总不希望某些有机密性质的资料放在不设防的网芳中让大家查阅吧? 举例来说,你总不希望你的家目录被人家随意浏览吧?家目录内可能有你自己的情书呢!^_^

那怎么办?没关系,我们可以透过 Samba 服务器提供的认证方式来进行用户权力的给予, 也就是说,你在客户端联机到服务器时,必须要输入正确的账号与密码后,才能够登入 Samba 查阅到你自己的数据! 那会不会很难啊?不会啦! Samba 本身就提供一个小程序来帮助我们处理密码的建立了,整个流程还不太难。

比较重要的是 Samba 使用者账号必须要存在于 Linux 系统当中 (/etc/passwd), 但是 Samba 的密码与 Unix 的密码档案并不相同 (这是因为 Linux 与网芳的密码验证方式及编码格式不同所致)。 这就比较有点小麻烦~没关系,就让我们依样画葫芦来处理一下这个部分的设定吧!

  • 0. 假设条件

由于使用者层级会改变成 user 的阶段,因此 [temp] 已经没有必要存在!请将该设定删除或批注。 而服务器方面的整体数据则请保留,包括工作组等等的数据,并新增底下的资料:

  • 使用者认证层级设定 (security) 为: user
  • 用户密码档案使用 TDB 数据库格式,默认档案在 /var/lib/samba/private/ 内;
  • 密码必须要加密;
  • 每个可使用 samba 的使用者均拥有自己的家目录;
  • 设定三个用户,名称为 smb1, smb2, smb3 ,且均加入 users 为次要群组。此三个用户 Linux 密码为 1234, Samba 密码则为 4321;
  • 分享 /home/project 这个目录,且资源名称取名为: project;
  • 加入 users 这个群组的使用者可以使用 //IP/project 资源,且在该目录下 users 这个群组的使用者具有写入的权限。

好了,开始一步步的处理吧!

  • 1. 设定 smb.conf 配置文件与目录权限相关之设定

在这个范例的配置文件当中,我们会新增几个参数,新增的参数部分会用特殊字体圈起来, 引用之前参数的部分则为一般字体。请交互参考看看啰:

# 1\. 开始设定重要的 smb.conf 档案呦!
[root@www ~]# vim /etc/samba/smb.conf
[global]
        workgroup       = vbirdhouse
        netbios name    = vbirdserver
        server string   = This is vbird's samba server
        unix charset    = utf8
        display charset = utf8
        dos charset     = cp950
        log file        = /var/log/samba/log.%m
        max log size    = 50
        load printers    = no

 # 与密码有关的设定项目,包括密码档案所在格式喔!
 security = user          &lt;==这行就是重点啦!改成 user 层级
        passdb backend = tdbsam  &lt;==使用的是 TDB 数据库格式!

# 2\. 分享的资源设定方面:删除 temp  加入 homes 与 project
[homes]                                   &lt;==分享的资源名称
        comment        = Home Directories
        browseable     = no               &lt;==除了使用者自己外,不可被其他人浏览
        writable       = yes              &lt;==挂载后可擦写此分享
        create mode    = 0664             &lt;==建立档案的权限为 664
        directory mode = 0775             &lt;==建立目录的权限为 775

[project]                                 &lt;==就是那三位使用者的共享资源
        comment    = smbuser's project
        path       = /home/project        &lt;==实际的 Linux 上面的目录位置
        browseable = yes                  &lt;==可被其他人所浏览到资源名称(非内容)
        writable   = yes                  &lt;==可以被写入
        write list = @users               &lt;==写入者有哪些人的意思

# 2\. 每次改完 smb.conf 你都需要重新检查一下语法正确否!
[root@www ~]# testparm  &lt;==详细的 debug 请自行处理啰!

在上表当中比较有趣的设定项目主要有:

  • [global] 修改与新增的部分:security 设定为 user 层级,且使用『passdb backend = tdbsam』这个数据库格式,因此密码文件会放置于 /var/lib/samba/private/ 内。 此外,默认密码就是加密的,因此不需要额外使用其他的设定参数来规范;

  • [homes] 这个使用者资源共享部分: homes 是最特殊的资源共享名称,因为 Linux 上面的每位用户均有家目录,例如 smb1 的家目录位于 /home/smb1/ ,那当 smb1 用户使用 samba 时,她就会发现多了个 //127.0.0.1/smb1/ 的资源可用,而 smb2 就在 //127.0.0.1/smb2/ 这个资源。由于不可浏览 (browseable),所以除了使用者可以看到自己的家目录资源外,其他人是无法浏览的。此外,为了规范权限,而多了 create mode 与 directory mode 两个设定值 (此值可设定也可不理会);

  • [project] 这个使用者资源共享部分:当我们新增一个共享资源时, 最重要的就是规范资源名称。在此例中我们使用 project 这个资源名称来指向 /home/project ,也就是说, //127.0.0.1/project 代表的是 /home/project 的意思。此外,能够使用这个资源的账号,为加入 users 这个群组的用户喔! 透过 write list 这个项目比较单纯,如果是早期的设定,可能会使用 valid users ,但近来鸟哥比较偏好 write list 设定项目。 不过能否顺利的存取档案还与 Linux 最底层的档案权限有关。

千万不要忘记了,除了配置文件之外,详细的目录权限与账号设定等规范也要设定好!底下我们用范例来进行此项工作!

例题:我们预计要分享 /home/project 目录,这个目录的权限该如何设定?答:因为是要开放给 users 群组,而共享群组的权限通常是『 2770 』这个含有 SGID 的特殊旗标功能。因此这个目录应该如此设定才好:

[root@www ~]# mkdir /home/project
[root@www ~]# chgrp users /home/project
[root@www ~]# chmod 2770 /home/project
[root@www ~]# ll -d /home/project
drwxrws---. 2 root users 4096 Jul 29 13:17 /home/project
  • 2. 设定可使用 Samba 的用户账号与密码

设定使用者账号是很重要的一环,因为设定错误的话,当然也就任何人都没有办法登入的!在这里我们必须先要说明一下 Linux 的文件系统与 SAMBA 设定的使用者登入权限的相关性!

  • 在 Linux 这个系统下,任何程序都需要取得 UID 与 GID (User ID 与 Group ID) 的身份之后,才能够拥有该身份的权限,也才能够适当的进行存取档案等动作!

  • 关于 Linux 这个系统的 UID 与 GID 与账号的相对关系,一般记录在 /etc/passwd 当中,当然也能透过 NIS, ldap 等方式来取对应;

  • SAMBA 仅只是 Linux 底下的一套软件,使用 SAMBA 来进行 Linux 文件系统时,还是需要以 Linux 系统下的 UID 与 GID 为准则!

如果上面这几点说明你没有问题了,现在就来看一下当我们在 Windows 计算机上面以网络上的芳邻来连接 Linux 并且进行数据的存取时,会是怎样的一个情况呢?

我们需要透过 SAMBA 所提供的功能来进行 Linux 的存取,而 Linux 的存取是需要取得 Linux 系统上面的 UID 与 GID 的,因此,我们登入 SAMBA 服务器时,所利用 SAMBA 取得的其实是 Linux 系统里面的相关账号!这也就是说,在 SAMBA 上面的使用者账号,必须要是 Linux 账号中的一个!

所以说,在不考虑 NIS 或 LDAP 等其他账号的验证方式,单纯以 Linux 本机账号 (/etc/passwd) 作为身份验证时, 在 Samba 服务器所提供可登入的账号名称,必须要存在于 /etc/passwd 当中! 这是一个很重要的概念!例如你要先有 dmtsai 在 /etc/passwd 当中后,才能将 dmtsai 加入 Samba 的使用者当中。这都是很基本的账号权限概念,如果你觉得这里阅读方面有问题, 若不考虑鸟哥的解释不良,表示你必须要回去读读基础篇了~ ^_^

现在我们知道需要新增 smb1, smb2, smb3 三个用户,且这三个用户需要加入 users 群组。此外,我们之前还建立过 student 这个用户,假设这四个人都需要能用 Samba 服务,那么除了新增用户之外,我们还需要利用 pdbedit 这个指令来处理 Samba 用户功能喔!

# 1\. 先来建立所需要的各个账号,但假设 student 已经存在了喔!
[root@www ~]# useradd -G users smb1
[root@www ~]# useradd -G users smb2
[root@www ~]# useradd -G users smb3
[root@www ~]# echo 1234 &#124; passwd --stdin smb1
[root@www ~]# echo 1234 &#124; passwd --stdin smb2
[root@www ~]# echo 1234 &#124; passwd --stdin smb3

# 2\. 使用 pdbedit 指令功能
[root@www ~]# pdbedit -L [-vw]            &lt;==单纯的察看帐户信息
[root@www ~]# pdbedit -a&#124;-r&#124;-x -u 账号    &lt;==新增/修改/删除账号
[root@www ~]# pdbedit -a -m -u 机器账号   &lt;==与 PDC 有关的机器码
选项与参数:
-L :列出目前在数据库当中的账号与 UID 等相关信息;
-v :需要搭配 -L 来执行,可列出更多的讯息,包括家目录等数据;
-w :需要搭配 -L 来执行,使用旧版的 smbpasswd 格式来显示数据;
-a :新增一个可使用 Samba 的账号,后面的账号需要在 /etc/passwd 内存在者;
-r :修改一个账号的相关信息,需搭配很多特殊参数,请 man pdbedit;
-x :删除一个可使用 Samba 的账号,可先用 -L 找到账号后再删除;
-m :后面接的是机器的代码 (machine account),与 domain model 有关!

# 2.1 开始新增使用者吧!
[root@www ~]# pdbedit -a -u smb1
new password: &lt;==输入 4321 这个密码瞧瞧
retype new password: &lt;==再输入一次吧!
Unix username:        smb1   &lt;==底下为输入正确后的显示结果!
NT username:
Account Flags:        [U          ]
User SID:             S-1-5-21-4073076488-3046109240-798551845-1000
Primary Group SID:    S-1-5-21-4073076488-3046109240-798551845-513
Full Name:
Home Directory:       \\vbirdserver\smb1
HomeDir Drive:
Logon Script:
Profile Path:         \\vbirdserver\smb1\profile
Domain:               VBIRDSERVER
Account desc:
Workstations:
Munged dial:
Logon time:           0
Logoff time:          9223372036854775807 seconds since the Epoch
Kickoff time:         9223372036854775807 seconds since the Epoch
Password last set:    Fri, 29 Jul 2011 13:19:56 CST
Password can change:  Fri, 29 Jul 2011 13:19:56 CST
Password must change: never
Last bad password   : 0
Bad password count  : 0
Logon hours         : FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
# 你可以发现其实讯息非常的多!若需修改细部设定,请 man pdbedit 吧!
[root@www ~]# pdbedit -a -u smb2
[root@www ~]# pdbedit -a -u smb3
[root@www ~]# pdbedit -a -u student

# 2.2 查询目前已经存在的 Samba 账号
[root@www ~]# pdbedit -L
smb1:2004:
smb3:2006:
smb2:2005:
student:505:
# 仅会列出账号与 UID 而已呦!

# 2.3 尝试修改与删除 smb3 这个账号看看
[root@www ~]# smbpasswd smb3
New SMB password: 
Retype new SMB password:
# 修改密码比较特殊,管理密码参数是使用 pdbedit,修改密码得要用 smbpasswd 呦!

[root@www ~]# pdbedit -x -u smb3
[root@www ~]# pdbedit -Lw
# 此时你就看不到 smb3 这个用户啰!所以测试完请立即将它加回来!

以后如果有需要新增额外的使用者账号,若该账号原本不存在,则使用 useradd 再以 pdbedit -a 去新增。 若已经存在于 Linux 的实体账号,直接用 pdbedit -a 新增即可。同时要注意,管理 TDB 数据库格式建议使用 pdbedit 这个新的玩意儿来处理,smbpasswd 仅剩下修改密码的功能需记忆即可!

  • 3. 重新启动 Samba 并进行自我测试

在经过重新启动后,我们所进行的修订才会生效。然后使用 smbclient 来检查看看,是否不同身份会有不一样的浏览结果呢? 赶紧看看:

[root@www ~]# /etc/init.d/smb restart
[root@www ~]# /etc/init.d/nmb restart

# 1\. 先用匿名登录试看看!
[root@www ~]# smbclient -L //127.0.0.1
Enter root's password:      &lt;==直接按下 [Enter] 即可。
Anonymous login successful  &lt;==有看到匿名的字样了!
Domain=[VBIRDHOUSE] OS=[Unix] Server=[Samba 3.5.4-68.el6_0.2]

        Sharename       Type      Comment
        ---------       ----      -------
        project         Disk      smbuser's project
        IPC$            IPC       IPC Service (This is vbird's samba server)
....(底下省略)....

# 2\. 再使用 smb1 这个账号登入试看看!
[root@www ~]# smbclient -L //127.0.0.1 -U smb1
Enter smb1's password:  &lt;==输入 smb1 在 pdbedit 所建立的密码!
Domain=[VBIRDHOUSE] OS=[Unix] Server=[Samba 3.5.4-68.el6_0.2]

        Sharename       Type      Comment
        ---------       ----      -------
        project         Disk      smbuser's project
        IPC$            IPC       IPC Service (This is vbird's samba server)
        smb1            Disk      Home Directories &lt;==多了这玩意儿!
....(底下省略)....

由上表我们可以发现,经由不同的身份登入可以取得不一样的浏览数据, 所以在使用上面需要特别留意喔!接下来,让我们开始来自我挂载测试看看!

[root@www ~]# mount -t cifs //127.0.0.1/smb1 /mnt -o username=smb1
Password: &lt;==确定是输入正确的密码喔!
# 此时 /home/smb1/ 与 /mnt 应该拥有相同的档名才对!因为挂载嘛!

[root@www ~]# ll /home/smb1/.bashrc
-rw-r--r--. 1 smb1 smb1 124 May 30 23:46 /home/smb1/.bashrc &lt;==确定有档案
[root@www ~]# ls -a /mnt
# 却看不到任何东西!应该是 SELinux 的问题吧!根据 /var/log/messages 的讯息,
# 进行如下的动作就能够处理好这个程序!

[root@www ~]# setsebool -P samba_enable_home_dirs=1
[root@www ~]# ls -a /mnt
.  ..  .bash_logout  .bash_profile  .bashrc  .gnome2  .mozilla
# 档名出现啦!OKOK!这个使用者挂载处理完毕!

[root@www ~]# umount /mnt

自我测试是非常重要的!因为 Samba 是会对外提供服务的,因此 SELinux 会特别『关照』一下这个服务!包括默认用户家目录不会有开放的权限、预设的 SELinux type 不对就无法使用 (你可以自己尝试挂载 //127.0.0.1/project 就知道啥原因啰!),所以,自行测试完毕就能够理解哪个地方的 SELinux 没有设定妥当!详细的设定请到 16.2.6 安全性设定去查阅。

Tips: 根据网友回报,因为之前我们设定的 security 是 share,而且已经使用 Windows 系统测试过,在同一部 Windows 系统上面重复测试时,会发生无法登入的情况。建议直接将 windows 系统重新启动清除前一次登入的信息即可! ^_^

  • 4. 关于权限的再说明与累加其他分享资源的方式:

有的时候你会发现,明明在 smb.conf 当中已经设定了 writable 可写入,使用者登入的身份也没有问题, 为啥就是无法挂载或写入呢?是否是服务器设定哪里还有问题啊?非也非也!主要的问题常常是来自于 Linux 文件系统的权限啦!

举上面的例子来说,当你无法挂载却发现 Linux 传统权限是对的,那么肯定是 SELinux 出问题~这部份得要用 setsebool 与 chcon 或 restorecon 等指令来克服。另外就是,我们在 smb.conf 当中设定 [project] 为可写入,亦即 /home/project 是可写入的。假设 smb1 属于 users 这个群组,因此以 smb1 登入 SAMBA 服务器后,对于 /home/project 应该是具有可以读写的能力的!但是,如果你以 root 的身份建立 /home/project 却又忘记修改权限的话, 此时 /home/project 是无法让 users 这个群组写入的,因此 smb1 这个使用者当然不具有写入的能力。 这样说,了解鸟哥想要说啥了吗?注意注意喔! ^_^

那如果你还要扩充分享的目录与能够登入的使用者时,可以这样做:

  • 利用编辑 smb.conf 来开放其他的目录资源,并且特别注意 Linux 在该目录下的权限喔!请使用 chown 与 chmod 吧!
  • 利用 pdbedit 来新增其他可用 Samba 的账号,如果该账号并没有出现在 /etc/passwd 里面,请先以 useradd 新增该账号;
  • 不论进行完任何的设定,请先以 testparm 进行确认,之后以 /etc/init.d/{smb,nmb} restart 来重新启动!

事实上,SAMBA 的一般用途就是在这个联机的模式中!多使用 SAMBA 来分享你的资源吧!鸟哥都是使用 SAMBA 来做为远程服务器与我的工作机互通有无的重要媒介说~


16.2.5 设定成为打印机服务器 (CUPS 系统)

时至今日,打印机的网络功能已经很强悍了!甚至也有支持无线网络的打印机,因此每台打印机都可以独立作为各个 PC 的独自的打印机,老实说也没有必要进行 Samba 的网络打印机服务器啦!但毕竟还是有些比较旧型的机种, 或者买不起有内建网络的打印机时,那么 Samba 的打印机服务器还是有存在的价值啰。

在 Linux 底下进行打印的服务很多,不过我们这里要介绍的仅有目前较广为流行的 CUPS (Common Unix Printing System) 这一个。 详细的 CUPS 安装设定方法我们已经在基础篇第三版第二十一章 CUPS 当中提过,所以这里我们不再详细说明,仅介绍大致的处理流程就是了。如果你需要较早期的 LPRng 打印系统的话, 建议可以参考底下的数据喔:

Tips: 在这个小节中,鸟哥假设你的打印机并不是网络打印机,而是使用 USB 接口连接的打印机格式。如果你的打印机真的有支持网络, 那建议直接参考打印机手册来设定即可,不需要安装 Samba 打印机。因为某些厂牌的打印机网络卡有特殊的功能, 例如 HP 的网卡通常还支持某些特殊的打印功能 (双面、多页打印等),这些功能透过伺服器重新分享时,可能会遗失!

  • 0. 假设条件

既然要分享打印机,就得要有打印机啊!鸟哥使用对 Linux 支持度较高的 HP LaserJet P2015dn 这部打印机为例, 不使用网络功能,单纯使用 USB 连接到 Samba 服务器上。

  • CUPS 连接到 USB 打印机,并且开放非本机的 IP 来源使用此打印机;
  • 使用 CUPS 内建的打印机驱动程序;
  • 前往 HP 打印机官网取得 Windows 操作系统的驱动程序;

  • 1. 安装打印机与确定打印机的联机正常

再次说明,并不是所有的打印机都被 Linux 所支持的,所以当你想要链接一部打印机到 Linux 系统上头时, 请务必到 http://www.openprinting.org/printers 上头去看看是否有被支持喔! 如果没有被支持,那就换一部打印机吧!不要进行垂死的挣扎了...

如果你的打印机端口为使用 USB 或者是平行串行端口的话,那么当你连接上打印机后, 可以利用底下的方式测试看看是否成功的连接上了:

[root@www ~]# lsusb
Bus 001 Device 002: ID 03f0:3817 Hewlett-Packard LaserJet P2015 series
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
[root@www ~]# ll /dev/usb/lp0
crw-rw----. 1 root lp 180, 0 Jul 29 13:55 /dev/usb/lp0
# 看得出来,已经有个 lp0 的打印机啰!测试打印一下吧!

[root@www ~]# echo "Hello printer" &gt; /dev/usb/lp0

如果打印机有响应,这表示 OK 的啦!你可以进行底下的工作了。

  • 2. 设定 CUPS 与打印机的联机

预设 CUPS 都会开启,不过,因为我们安装的是『 basic server 』的模式,所以 CUPS 默认并没有被安装起来。 所以这里要安装且重新设定与启动才行。本章节 CUPS 的设定原则是这样的:

  • 我需要让 192.168.100.0/24 这个网域可以使用打印机
  • 我需要让 192.168.100.0/24 及 127.0.0.0/8 可以管理 CUPS 系统

然后开始这样做:

[root@www ~]# yum groupinstall "Print Server"
[root@www ~]# vim /etc/cups/cupsd.conf
# 1\. 让监听的接口开放在所有接口!
# Listen localhost:631  &lt;==约在第 18 行左右,改成如下:
Listen 0.0.0.0:631

# 2\. 让内部网域能够进行 CUPS 的浏览与管控
&lt;Location /&gt;        &lt;==约在 32 行左右,新增能够让内网其他 IP 浏览者
  Order allow,deny
 Allow From 127.0.0.0/8
  Allow From 192.168.100.0/24
&lt;/Location&gt;

&lt;Location /admin&gt;       &lt;==约在 39 行左右,新增能够管理 CUPS 者
  Encryption Required   &lt;==因为这里的关系,所以可能会用 https://IP 喔!
  Order allow,deny
 Allow From 127.0.0.0/8
  Allow From 192.168.100.0/24
&lt;/Location&gt;

设定完毕后就可以开始来启动 cups 系统,可以这样做:

[root@www ~]# /etc/init.d/cups start
[root@www ~]# chkconfig cups on
[root@www ~]# netstat -tunlp &#124; grep 'cups'
tcp     0  0  0.0.0.0:631         0.0.0.0:*      LISTEN      1851/cupsd
udp     0  0  0.0.0.0:631         0.0.0.0:*                  1851/cupsd

那个 631 的埠口就是 CUPS 所启动的啦!要注意的是,开放界面得要给 0.0.0.0 才对呦!然后我们可以开始设定打印机了! 由于 CUPS 支持很多不同的打印机端口,每种端口都不一样,常见的有:

  • USB 端口: usb:/dev/usb/lp0
  • 网络打印机: ipp://ip/打印机型号
  • 网络芳邻打印机: smb://user:password@host/printer

之所以要加上 192.168.100.0/24 可以控制服务器 CUPS 的原因在于...鸟哥的服务器没有 X 窗口啦! 所以需要透过平时的工作机连上服务器才行啊!此时,将 CUPS 开放在区网内可以控制的功能就很重要啦! 此外,因为鸟哥的主机所在环境问题,这部 192.168.100.254 还有一个界面为 192.168.1.100,鸟哥在 cupsd.conf 里面也加入这个网段了 (上面的范例中并没有特别强调),所以底下的图示你会看到很多 192.168.1.100 的 IP ,不要害怕!那是正常的! ^_^!好了,请打开浏览器,在网址列输入: https://192.168.100.254:631 (底下则是 192.168.1.100)

图 16.2-1、用 CUPS 设定 USB 打印机

如上图所示,由于我们使用的是 https 这个需要凭证的联机模式,因此就会出现这个不受信任的网站讯息。 没关系,你直接按下『我了解安全风险』后,再选择『新增例外网站』即可出现如下图示:

图 16.2-2、用 CUPS 设定 USB 打印机

如果这部主机真的是你的,那么就选择箭头 2 所指的那个『永久储存』吧!最后按下箭头 3 所指的『确认安全例外』即可!如果一切顺利,就会出现如下的 CUPS 设定图示:

图 16.2-3、用 CUPS 设定 USB 打印机

在上头的欢迎图示当中,由于我们是想要建立打印机,因此点选箭头(1)所指的那个按钮进入打印机功能,然后点选 (2)来建立打印机吧!

图 16.2-4、用 CUPS 设定 USB 打印机

这一版比较有趣的地方,是会先让你输入账号与密码才进行后续的动作哩!所以这里请输入 root 的帐密吧!

图 16.2-5、用 CUPS 设定 USB 打印机

在上面的图示中,你应该要选择的是我们这部本机的 USB 打印机装置才对。该装置是由 HAL 服务所自动侦测到的, 如果你没有看到任何 USB 的打印机,那可能就得要查询一下打印机电源是否正确的开启了! 点选他吧!

图 16.2-6、用 CUPS 设定 USB 打印机

建立打印机时,最重要的是那个打印队列 (上面方框中的第一个,名称的那个玩意儿),在这里鸟哥使用 CUPS 预设帮我捉到的档名。 这个名称很重要,是未来分享出的打印机名字啰!至于位置与描述就随便你填啰。由于我们是想要做成打印服务器,所以『share this printer 』当然要勾选!当你按下『继续』后,就会出现如下图示:

图 16.2-7、用 CUPS 设定 USB 打印机

接下来 CUPS 会帮你选择一个相对较佳的驱动程序,基本上,使用 CUPS 帮你捉到的预设驱动程序应该就 OK 了! 选完后请按下『加入打印机』按钮吧!

图 16.2-8、用 CUPS 设定 USB 打印机

看你还有没有要修改其他的预设参数,如果没有的话,就按下图 16.2-8 的『Set Default Options』按钮吧! 如果一切没有问题,你的打印机就设定妥当了。如果想要查阅打印机的详细信息,那可以点选 Printer 的项目!如下图所示:

图 16.2-9、用 CUPS 设定 USB 打印机

如果都正常没问题,那么你的系统已经有一部打印机被 CUPS 所管理,且这部打印机在网络的网址为:

接下来看看如何将它连结到咱们的 Samba 服务器中吧!

  • 3. 在 smb.conf 当中加入打印机的支持 (Optional)

开始告诉 Samba 将这部打印机给他分享出去吧!你需要这样处理:

[root@www ~]# vim /etc/samba/smb.conf
[global]
        # 得要修改 load printers 的设定,然后新增几个数据
        load printers = yes
        cups options  = raw       &lt;==可支持来自 Windows 用户的打印作业
        printcap name = cups
        printing      = cups      &lt;==与上面这两个在告知使用 CUPS 打印系统

[printers]                        &lt;==打印机一定要写 printers 喔!
        comment = All Printers
        path    = /var/spool/samba&lt;==预设把来自 samba 的打印作业暂时放置的队列
        browseable = no           &lt;==不被外人所浏览啦!有权限才可浏览
        guest ok   = no           &lt;==与底下两个都不许访客来源与写入(非文件系统)
        writable   = no
        printable  = yes          &lt;==允许打印很重要的一项工作!

[root@www ~]# testparm  &lt;==若有错误,请自行处理一下
[root@www ~]# /etc/init.d/smb restart
[root@www ~]# /etc/init.d/nmb restart

基本上透过这样的设定你的 Samba 就能够顺利的提供打印机的服务了!不过可惜的是,Windows 客户端依旧得要安装打印机的驱动程序才能够使用 Samba 所提供的打印机,此时真是麻烦兼讨厌啊~有没有可能让 Samba 主动的提供驱动程序给使用者,这样一来客户端就不需要额外去找驱动程序啰!是可以的,透过 Samba 3.x 即可处理!就这么巧, CentOS 的 Samba 就是 3.x 呢!所以我们可以透过底下的方式来处理。

  • 4. 让 Samba 主动提供驱动程序给 Windows 用户使用

另外,或许你会想,打印机的型号这么多,那么 Linux 该如何提供这些打印机的驱动程序啊?岂不麻烦? 还好啦, CUPS 主要是透过利用 Postscript 的打印语言与打印机沟通的,因此客户端只要取得 postscript 的驱动程序他们就能够使用咱们的 Samba 服务器所提供的打印机了!如此一来, 不论打印机的型号为何,只要他们能够支持 Postscript 的打印格式,OK 搞定!而且 CUPS 官网本身就有提供 CUPS 的 Postscript 驱动程序啰!可以到底下的连结去下载:

很棒的是,因为我们是 CentOS 6.x 有支持 rpm 软件封装的系统,因此可以直接下载 cups-windows-6.0-1.i386.rpm 这个档案即可,直接安装这个 rpm 档案就能够取得 cups 对 Windows 的打印机驱动程序了。 这个档案安装完毕之后,会将驱动程序放置于 /usr/share/cups/drivers/ 里头呦! 不过你得要注意的是,除了这个驱动程序外,要支持 Windows 2000 以后出产的 Windows 版本, 你还得到 Windows XP 底下的目录去下载几个 32 位支持的档案:

  • Win XP 32 位:C:\WINDOWS\system32\spool\drivers\w32x86\3

将该目录下里面的 PS 开头的档案通通下载下来,应该有四个档案的,请将他复制成为档名小写的档案,并且放置到你 Samba 服务器上的 /usr/share/cups/drivers/ 目录下,该目录内放置的这就是基本的驱动程序说! 在鸟哥的这个目录底下至少含有这几个档案就是了:

[root@www ~]# ll /usr/share/cups/drivers
-rw-r--r-- 1 root root    803  4月 20  2006 cups6.inf
-rw-r--r-- 1 root root     72  4月 20  2006 cups6.ini
-rw-r--r-- 1 root root  12568  4月 20  2006 cupsps6.dll
-rw-r--r-- 1 root root  13672  4月 20  2006 cupsui6.dll  &lt;==上面为 cups 提供
-rw-r--r-- 1 root root 129024  3月 24 13:29 ps5ui.dll    &lt;==底下为 Win XP 提供
-rw-r--r-- 1 root root 455168  3月 24 13:29 pscript5.dll
-rw-r--r-- 1 root root  27568  3月 24 13:29 pscript.hlp
-rw-r--r-- 1 root root 792644  3月 24 13:29 pscript.ntf

上述的档案鸟哥将他打包成为一个档案了,你可以在底下的连结下载:

不过你得注意,这个档案内的 Windows 数据是由 32 位的 Windows XP 上面捉来的,所以对于 Windows 98/ME 是没有作用的。同时,对于 64 位的其他较晚期的 Windows 7 等系统可能就得要重新处理了! 你得自行上网查阅相关的数据下载方式喔。接下来我们必须要在 smb.conf 里面增加一笔新的分享数据,这个分享数据必须是 [print$] 名称才行!有点类似这样啦:

[root@www ~]# vim /etc/samba/smb.conf
[global]
....(设定保留原本数据)....
[homes]
....(设定保留原本数据)....
[printers]
....(设定保留原本数据)....
[print$]
        comment    = Printer drivers
        path       = /etc/samba/drivers  &lt;==存放打印机驱动程序的目录
        browseable = yes
        guest ok   = no
        read only  = yes
        write list = root                &lt;==这个驱动程序的管理员
[project]
....(设定保留原本数据)....

[root@www ~]# mkdir /etc/samba/drivers
[root@www ~]# chcon -t samba_share_t /etc/samba/drivers
# 由于预设的 CUPS 仅有 root 能管理,因此我们以 root 作为打印机管理员;
# 同时 SELinux 的类型也要修订如上的方式!那 root 就得要加入 samba 的支持才行:
[root@www ~]# pdbedit -a -u root

[root@www ~]# testparm                 &lt;==测试语法
[root@www ~]# /etc/init.d/smb restart  &lt;==重新启动

[root@www ~]# smbclient -L //127.0.0.1 -U root
Enter root's password:  &lt;==输入 root 在 samba 的密码先
Domain=[VBIRDHOUSE] OS=[Unix] Server=[Samba 3.5.4-68.el6_0.2]

        Sharename       Type      Comment
        ---------       ----      -------
        print$          Disk      Printer drivers
        project         Disk      smbuser's project
        HP_LaserJet_P2015_Series Printer   HP LaserJet P2015 Series
        IPC$            IPC       IPC Service (This is vbird's samba server)
        root            Disk      Home Directories
# 瞧!有看到一部打印机以及驱动程序所在的分享数据啰!

现在我们要告知 Samba 说,我们的 CUPS 可提供 Windows 客户端的驱动程序,所以用户不需要自行设定他们的驱动程序哩! 要由 cups 告知 Samba 是由 cupsaddsmb 这个指令来搞定的,整个指令的执行很简单的:

[root@www ~]# cupsaddsmb [-H SAMBA 服务器名] [-h CUPS 服务器名] \
&gt;   -a -v [-U 使用者账号]
选项与参数:
-H :后续接的是 Samba 服务器名,本机的话可以直接用 localhost 即可;
-h :后续接的为 CUPS 的服务器名,同样的可使用 localhost 即可;
-a :自动搜寻出所有可用的 CUPS 打印机;
-v :列出更多的信息;
-U :打印机管理员

# 利用前面的说明将打印机驱动程序挂上 SAMBA (注意 CUPS 管理员预设是 root)
[root@www ~]# cupsaddsmb -H localhost -U root -a -v
Password for root required to access localhost via SAMBA: &lt;==root 在 SAMBA 密码
# 这里会闪过很多的讯息,说明已经安装了某些信息,底下鸟哥仅列出简单的讯息而已。
Running command: smbclient //localhost/print$ -N -A /tmp/cupsbrdBaE -c 'mkdir 
W32X86;put /tmp/cupsu13OSU W32X86/HP_LaserJet_P2015_Series.ppd;...

[root@www ~]# ll /etc/samba/drivers
drwxr-xr-x. 3 root root 4096 Jul 29 15:15 W32X86  &lt;==这就是驱动程序目录

最后在驱动程序的存放目录会多出一个 W32X86 的目录,你可以查询一下该目录的内容, 那就是预计要给客户端使用的驱动程序啦!这样就搞定了!不过,为了将所有的数据通通驱动, 建议你将 CUPS 及 SAMBA 通通重新启动吧!

[root@www ~]# /etc/init.d/cups restart
[root@www ~]# /etc/init.d/smb restart
[root@www ~]# /etc/init.d/nmb restart
  • 5. 一些问题的克服:

如果一切顺利的话,你在 Windows 客户端应该可以顺利的连接到打印机啰! 开心吧!不过,如果你曾经印错数据,那么该如何进入 Linux 的 Samba 主机将该数据移除呢? 你最好知道底下的几个指令,关于这些指令的进阶用法则请自行给他 man 看看了:

# 1\. 列出所有可用的打印机状态
[root@www ~]# lpstat -a
HP_LaserJet_P2015_Series accepting requests since Fri 29 Jul 2011 02:55:28 PM CST

# 2\. 查询目前默认打印机的的工作情况
[root@www ~]# lpq
hpljp2015dn 已就绪
没有项目
# 列出打印机的工作,若有打印作业存在时 (例如关掉打印机再印测试页),会如下所示:
hpljp2015dn 已就绪并正在打印
等级    拥有人  工作    档案                            总计  大小
active  root    2       Test Page                       17408 byte

# 3\. 删除所有的工作项目喔!
[root@www ~]# lprm -
# 加上那个减号 (-) 代表移除所有等待中的打印作业!

打印作业就是这样进行的啦!赶紧试看看吧!接下来探讨一下相关的防火墙与安全性的讨论!


16.2.6 安全性的议题与管理

使用 SAMBA 其实是有一定程度的危险性的,这是因为很多网络攻击的蠕虫、病毒、木马就是透过网芳来攻击的! 为了抵挡不必要的联机,所以 CentOS 5.x 预设的 SELinux 已经关闭了很多 Samba 联机的功能, 因此预设情况下,很多客户端的挂载可能会有问题。此外,仅开放有权限的网域来源,以及透过 smb.conf 来管理特定的权限,也是很重要的!同时,Linux 文件系统的 r, w, x 权限也是需要注意的喔! 我们底下就简单的介绍一下一些基本的安全性管理吧!

  • SELinux 的相关议题:

其实就如同第七章 (7.4.5) 里面提到的,我们透过登录档的内容就能够知道如何解决 SELinux 对各个服务所造成的问题了。不过,既然我们知道服务是 Samba 了,能不能找出与 Samba 有关的 SELinux 规则呢?当然可以!基本的 Samba 规则主要有:

[root@www ~]# getsebool -a &#124; grep samba
samba_domain_controller --&gt; off  &lt;==PDC 时可能会用到
samba_enable_home_dirs --&gt; off   &lt;==开放用户使用家目录
samba_export_all_ro --&gt; off      &lt;==允许只读文件系统的功能
samba_export_all_rw --&gt; off      &lt;==允许读写文件系统的功能
samba_share_fusefs --&gt; off
samba_share_nfs --&gt; off
use_samba_home_dirs --&gt; off      &lt;==类似用户家目录的开放!
virt_use_samba --&gt; off

看吧!几乎所有的规则默认都是关闭的!所以我们需要慢慢的打开啊!目前我们仅会用到用户的家目录以及分享成为可擦写, 不过似乎仅要 samba_enable_home_dirs 那个项目设定妥当即可喔!因此我们可以这样做:

[root@www ~]# setsebool -P samba_enable_home_dirs=1
[root@www ~]# getsebool -a &#124; grep samba_enable_home
samba_enable_home_dirs --&gt; on

这样用户挂载他们的家目录时 (例如 smb1 使用 //127.0.0.1/smb1/) 就不会出现无法挂载的怪问题了!此外, 由于分享成为 Samba 的目录还需要有 samba_share_t 的类型。那我们还有分享 /home/project 还记得吗?那个目录也需要修订喔! 这样做看看:

[root@www ~]# ll -Zd /home/project
drwxrws---. root users unconfined_u:object_r:home_root_t:s0 /home/project

[root@www ~]# chcon -t samba_share_t /home/project
[root@www ~]# ll -Zd /home/project
drwxrws---. root users unconfined_u:object_r:samba_share_t:s0 /home/project

如果你分享的目录不只是 Samba ,还包括 FTP 或者是其他的服务时,那可能就得要使用 public_content_t 这个大家都能够读取的类型才行!若你还有发现任何 SELinux 的问题,请依照 /var/log/messages 里面的信息去修订吧!

  • 防火墙议题:利用 iptables 来管理

最简单的管理登入 SAMBA 的方法就是透过 iptables 啦!详细的说明我们已经在第九章防火墙中提过了,所以这里不再详加说明。 要知道的是,如果你仅要针对底下的范围开放 Samba 时,可以这样想:

  • 仅针对 192.168.100.0/24, 192.168.1.0/24 这两个网域开放 SAMBA 使用权
  • SAMBA 启用的 port UDP: 137, 138 及 TCP: 139, 445;

所以 iptables.allow 规则当中应该要加入这几项:

[root@www ~]# vim /usr/local/virus/iptables/iptables.allow
# 加入底下这几行!
iptables -A INPUT -i $EXTIF -p tcp -s 192.168.100.0/24 -m multiport \
         --dport 139,445 -j ACCEPT
iptables -A INPUT -i $EXTIF -p tcp -s 192.168.1.0/24 -m multiport \
         --dport 139,445 -j ACCEPT
iptables -A INPUT -i $EXTIF -p udp -s 192.168.100.0/24 -m multiport \
         --dport 137,138 -j ACCEPT
iptables -A INPUT -i $EXTIF -p udp -s 192.168.1.0/24 -m multiport \
         --dport 137,138 -j ACCEPT
[root@www ~]# /usr/local/virus/iptables/iptables.rule

这是很简单很简单的防火墙规则,你必须要依据你的环境自行修改 (通常修改那个 192.168.1.0/24 网段即可!)。 由于 smbd 及 nmbd 并不支持 TCP Wrappers ,所以你也只能透过 iptables 来控制了~

  • 防火墙议题: 透过内建的 Samba 设定 (smb.conf)

事实上 Samba 已经有许多防火墙机制啦!那就是在 smb.conf 内的 hosts allow 及 hosts deny 这两个参数。 通常我们只要使用 hosts allow 即可,那么没有写入这个设定项目的其他来源就会被拒绝联机的!这是比较严格的设定。 举例来说,如果你只想要让本机、192.168.100.254, 192.168.100.10, 192.168.1.0/24 使用 SAMBA 而已,那么可以这样写:

[root@www ~]# vim /etc/samba/smb.conf
[global]
        # 跟防火墙的议题有关的设定
        hosts allow = 127\. 192.168.100.254 192.168.100.10 192.168.1.
[homes]
....保留原始设定....
[root@www ~]# testparm
[root@www ~]# /etc/init.d/smb restart

这个设定值的内容支持部分比对,因此 192.168.1.0/24 只要写出前面三个 IP 段即可 (192.168.1.)。 如此一来不但只有数部主机可以登入我们的 SAMBA 服务器,而且设定值又简单!不像 iptables 写的落落长~ 鸟哥建议在防火墙议题方面,只要使用 iptables 或 hosts allow 其中一项即可,当中又以 hosts allow 较为建议唷! 当然啦,如果你是针对区网开放的,那么设定 iptables 防火墙反而是比较好的呦!因为不需要更动到 smb.conf 配置文件嘛!让服务的设定变的比较单纯些~

  • 文件系统议题:利用 Quota 限制用户磁盘使用

既然网芳是要分享文件系统给用户的,那么想当然尔,各个 Samba 用户们确实会将数据放置到你的 Samba 服务器上嘛! 那万一单个用户随便上传个数百 GB 的容量到你的 Samba 服务器,而且常常给你随意存取一番, 会不会造成文件系统分配不公或者是带宽方面的问题呢?想想就觉得是『会嘛!』那怎办?就透过 Quota 磁盘配额啊! 磁盘配额我们在基础篇第三版第十五章已经谈过,在本书第一章 (1.2.2-3) 里面也已经有实作过, 在底下请你依据第一章的后续动作来处理吧!

例题:我们预计分配 smb1, smb2, smb3 在他们自己的家目录下,各拥有 300MB/400MB (soft/hard) 的磁盘配额限量,那该如何做?答:请先依据第一章的 Quota (1.2.2-3) 相关数据处理完:

  • /etc/fstab 加入 /home 挂载点的 usrquota,grpquota 等设定值;
  • 重新挂载 /home ,让 Quota 实际被支持;
  • 以 quotacheck -avug 建立 Quota 的数据库档案;
  • 启动 Quota ;

假若你已经于第一章就处理完毕了,那么这一题就非常简单喔!透过 edquota -u smb1 来处理即可!

[root@www ~]# edquota -u smb1
Disk quotas for user smb1 (uid 2004):
  Filesystem                blocks    soft    hard inodes  soft  hard
  /dev/mapper/server-myhome       0 300000  400000      0     0     0

[root@www ~]# edquota -p smb1 smb2
[root@www ~]# edquota -p smb1 smb3
[root@www ~]# repquota -ua
*** Report for user quotas on device /dev/mapper/server-myhome
Block grace time: 7days; Inode grace time: 7days
                        Block limits                File limits
User            used    soft    hard  grace    used  soft  hard  grace
----------------------------------------------------------------------
smb1      --      32  300000  400000              9     0     0
smb2      --      32  300000  400000              8     0     0
smb3      --      32  300000  400000              8     0     0

16.2.7 主机安装时的规划与中文扇区挂载

现在你知道 Samba 服务器的功能是用来作为文件服务器的,每个使用者都可以拥有家目录,并透过网芳的功能来链接到 Samba 服务器中。这就有个问题啦,那就是你的使用者如果太多,并且将他们的重要数据都放到这部 Samba 服务器上头的话,那肯定 /home 未来会有点不足啊!所以 /home 所在的磁盘或许可以使用大一点的硬盘, 或者使用磁盘阵列,使用 LVM (基础学习篇第三版十五章) 也是个不错的方案。 底下为简单的思考方向:

  • 在安装 Linux 的时候,建议不需要安装 X Window ;
  • 在规划 Linux 时,/home 最好独立出一个 partition ,而且硬盘空间最好能够大一些;
  • /home 独立出来的 partition 可以单独进行 quota 的作业,以规范用户的最大硬盘用量;
  • 无网卡的打印机 (USB) 可直接链接到 Linux 主机再透过 Samba 分享;
  • 由于 SAMBA 一般来说都仅针对内部 (LAN) 主机进行开放,所以,可能的话 SAMBA 主机直接使用 private IP 来设定即可,当然啦, SAMBA 是否使用 private IP 还得视你的整个网域的 IP 网段的特性来规划。 以鸟哥研究室来说,因为实验室所有计算机的 IP 都是 Public IP,那么 SAMBA 如果使用 Private IP 反而会让大家都无法连接上啊! ^_^
  • 如果你的 SAMBA 主机使用 Public IP 时,请特别留意规范好防火墙的设定,尽量仅让 LAN 内的计算机可以联机进来即可,不要对 Internet 开放喔!

另外,如果你的 Samba 服务器需要挂载含有中文的 partition 时,譬如说你将原本 Windows XP 的 FAT32 文件系统挪到 Linux 系统下,此时如果用一般模式来挂载该分割槽时,一些中文档名可能会无法被顺利的显示出来。 这个时候你就得需要这样做了:

mount -t vfat -o iocharset=big5,codepage=950 /dev/sd[a-p][1-15] /mount/point

其中 iocharset 指的是本机的语系编码方式, codepage 则与远程软件有关。因为我们是在本机进行挂载, 所以实际上使用 iocharset 这个参数即可啦!更多说明则请看下节的客户端设定部分啰!