第18章、 认识系统服务 (daemons)

18.1. 什么是 daemon 与服务 (service)
我们在第十七章就曾经谈过『服务』这东西! 当时的说明是『常驻在记体体中的程序,且可以提供一些系统或网络功能,那就是服务』。而服务一般的英文说法是『 service 』。
但如果你常常上网去查看一些数据的话,尤其是 Unix-Like 的相关操作系统,应该常常看到『请启动某某 daemon 来提供某某功能』,那么 daemon 与 service 有关啰?否则为什么都能够提供某些系统或网络功能?
简单的说,系统为了某些功能必须要提供一些服务 (不论是系统本身还是网络方面),这个服务就称为 service 。 但是 service 的提供总是需要程序的运作!否则如何执行呢?所以达成这个 service 的程序我们就称呼他为 daemon ! 举例来说,达成循环型例行性工作排程服务 (service) 的程序为 crond 这个 daemon !
一般来说,当我们以文本模式或图形模式 (非单人维护模式) 完整开机进入 Linux 主机后, 系统已经提供我们很多的服务了!包括打印服务、工作排程服务、邮件管理服务等等; 那么这些服务是如何被启动的?他们的工作型态如何?

18.1.1. daemon 的主要分类: stand alone, super daemon, 工作形态, 命名规则
如果依据 daemon 的启动与管理方式来区分,基本上,可以将 daemon 分为可独立启动的 stand alone , 与透过一支 ,super daemon 来统一管理的服务这两大类,这两类 daemon 的说明如下:

一、stand_alone:此 daemon 可以自行单独启动服务
stand alone 就是『独立的启动』的意思。这种类型的 daemon 可以自行启动而不必透过其他机制的管理; daemon 启动并加载到内存后就一直占用内存与系统资源。最大的优点就是:因为是一直存在内存内持续的提供服务, 因此对于发生客户端的要求时,stand alone 的 daemon 响应速度较快。常见的 stand alone daemon 有 WWW 的 daemon (httpd)、FTP 的 daemon (vsftpd) 等等。

二、super daemon: 一支特殊的 daemon 来统一管理
这一种服务的启动方式则是藉由一个统一的 daemon 来负责唤起服务!这个特殊的 daemon 就被称为 super daemon 。 早期的 super daemon 是 inetd 这一个,后来则被 xinetd 所取代了。这种机制比较有趣的地方在于, 当没有客户端的要求时,各项服务都是未启动的情况,等到有来自客户端的要求时, super daemon 才唤醒相对应的服务。当客户端的要求结束后,被唤醒的这个服务也会关闭并释放系统资源。
这种机制的好处是: (1)由于 super daemon 负责唤醒各项服务,因此 super daemon 可以具有安全控管的机制,就是类似网络防火墙的功能! (2)由于服务在客户端的联机结束后就关闭,因此不会一直占用系统资源。但是缺点是什么呢? 因为有客户端的联机才会唤醒该服务,而该服务加载到内存的时间需要考虑进去,因此服务的反应时间会比较慢一些! 常见的 super daemon 所管理的服务例如 telnet 这个玩意儿!
这里写图片描述
如上所示,Super daemon 是常驻在内存中的, Program 1, 2, 3 则是启动某些服务的程序 (未被启动状态)。当有客户端的要求时, Super daemon 才会去触发相关的程序加载成为 daemon 而存在于内存中,此时,客户端的要求才会被 Super daemon 导向 Daemon 1 去达成联机!当客户端的要求结束时,Daemon 1 将会被移除,图中实线的联机就会中断!

三、窗口类型的解说
那么这两种启动的方式哪一个比较好呢?见仁见智啦!而且还要看该主机的工作负荷与实际的用途说! 例如当你的主机是用来作为 WWW 服务器的,那么 httpd 自然就以 stand alone 的启动方式较佳!事实上,我们常常开玩笑的说明 stand alone 与 super daemon 的情况,可以银行的窗口来作为说明的范例!

  1. 个别窗口负责单一服务的 stand alone:
    在银行里面,假设有一种单一服务的窗口,例如存钱窗口,所以当你需要存钱的时候,直接前往该窗口,就有『与人』为你服务! 这就是 stand alone 的情况。

  2. 统一窗口负责各种业务的 super daemon:
    在银行里面假设还有另外一种复合型态的统一窗口,同时提供转账、资金调度、提款等等的业务,那当你需要其中一项业务的时候, 就需要前往该窗口。但是坐在窗口的这个营业员,拿到你的需求单之后,往后面一丢『喂!那个转账的仁兄!该你的工作了』 那么那个仁兄就开始工作去!

那么这里就会引出另外一个问题!假设银行今天的人潮特别的汹涌,所以这个窗口后面除了你之外还有很多的人! 这个窗口是要『一个完成再来下一个』还是『全部都把你们的单据拿来,我全部处理掉』呢?基本上,针对这种 super daemon 的处理模式有两种,分别是这样:

  • multi-threaded (多重线程):
    就是我们提到的,全部的客户之要求都给他拿来,一次给他交办下去,所以一个服务同时会负责好几个程序。
  • single-threaded (单个线程):
    这个就是目前我们『人类的银行』最常见的方式,不论如何,反正一个一个来,第一个没有处理完之前,后面的请排队!嘿嘿! 所以如果 client 的要求突然大增的话,那么这些晚到的 client 可得等上一等!
    这里写图片描述
    如上所示,左侧为多重执行的方式, daemon 会一直被触发多支程序来提供不同 client 的服务,所以不论你是第几个登入者, 都可以享用 daemon 的服务。至于右侧则是单一执行的方式,仅会有一支 daemon 被唤醒,第一个用户达成联机后, 后续想要联机的用户就得要等待,因此她们的联机不会成功的。
    另外,需要注意的是,既然银行里头有这两种窗口同时存在,所以在 Linux 系统里面,这两种 daemon 的启动方式也是可以同时存在的!也就是说,某些服务可以使用 stand alone 来启动,而有些其他的服务则可以使用 xinetd 这个 super daemon 来管理!

四、daemon 工作形态的类型
如果以 daemon 提供服务的的工作状态来区分,又可以将 daemon 分为两大类,分别是:

  • signal-control
    这种 daemon 是透过讯号来管理的,只要有任何客户端的需求进来,他就会立即启动去处理!例如打印机的服务 (cupsd)。
  • interval-control
    这种 daemon 则主要是『每隔一段时间就主动的去执行某项工作』,所以你要作的是在配置文件指定服务要进行的时间与工作, 该服务在指定的时间才会去完成工作。我们在第十六章提到的 atd 与 crond 就属与这种类型的 daemon (每分钟侦测一次配置文件)。

另外,如果你对于开发程序很有兴趣的话,那么可以自行查阅一下『 man 3 daemon 』看看系统对于 daemon 的详细说明吧!

五、daemon 的命名规则
每一个服务的开发者,当初在开发他们的服务时,都有特别的故事!不过,无论如何,这些服务的名称被建立之后,被挂上 Linux 使用时,通常在服务的名称之后会加上一个 d ,例如例行性命令的建立的 at, 与 cron 这两个服务, 他的程序文件名会被取为 atd 与 crond,这个 d 代表的就是 daemon 的意思。所以,在第十七章中,我们使用了 ps 与 top 来观察程序时,都会发现到很多的 {xxx}d 的程序,通常那就是一些 daemon 的程序!

扫描二维码关注公众号,回复: 2783927 查看本文章

18.1.2. 服务与埠口的对应: /etc/services
从第十七章与前一小节对服务的说明后,你应该要知道的是, 系统所有的功能都是某些程序所提供的,而程序则是透过触发程序而产生的。同样的,系统提供的网络服务当然也是这样的! 只是由于网络牵涉到 TCP/IP 的概念,所以显的比较复杂一些就是了。
玩过因特网 (Internet) 的朋友应该知道 IP 这玩意儿,大家都说 IP 就是代表你的主机在因特网上面的『门牌号码』。 但是你的主机总是可以提供非常多的网络服务而不止一项功能而已,但我们仅有一个 IP !当客户端联机过来我们的主机时, 我们主机是透过埠号 (port number)分辨不同的服务要求 !埠号简单的想象,他就是你家门牌上面的第几层楼! 这个 IP 与 port 就是因特网联机的最重要机制之一。我们拿底下的网址来说明:

有没有发现,两个网址都是指向 ftp.isu.edu.tw 这个义守大学的 FTP 网站,但是浏览器上面显示的结果却是不一样的? 这是因为我们指向不同的服务!一个是 http 这个 WWW 的服务,一个则是 ftp 这个文件传输服务,当然显示的结果就不同了。
这里写图片描述
事实上,为了统一整个因特网的端口号对应服务的功能,好让所有的主机都能够使用相同的机制来提供服务与要求服务, 所以就有了『通讯协议』。也就是说,有些约定俗成的服务都放置在同一个埠号上面!举例来说, 网址列上面的 http 会让浏览器向 WWW 服务器的 80 埠号进行联机的要求!而 WWW 服务器也会将 httpd 这个软件激活在 port 80, 这样两者才能够达成联机的!
那么想一想,系统上面有没有什么设定可以让服务与埠号对应在一起呢?那就是 /etc/services !
这里写图片描述
像上面说的是,第一栏为 daemon 的名称、第二栏为该 daemon 所使用的端口号与网络数据封包协议, 封包协议主要为可靠联机的 TCP 封包以及较快速但为非面向连接的 UDP 封包。 举个例子说,那个远程联机机制使用的是 ssh 这个服务,而这个服务的使用的埠号为 22 !

18.1.3. daemon 的启动脚本与启动方式: 配置文件, stand alone, service, super daemon
提供某个服务的 daemon 虽然只是一支程序而已,但是这支 daemon 的启动还是需要执行档、配置文件、执行环境等等, 举例来说,你可以查阅一下 httpd 这个程序 (man httpd) ,里面可谈到不少的选项与参数!此外,为了管理上面的方便, 所以通常 distribution 都会记录每一支 daemon 启动后所取得程序的 PID 在 /var/run/ 这个目录下! 还有在启动这些服务之前,你可能也要自行处理一下 daemon 能够顺利执行的环境是否正确等等。这里要讲的是, 要启动一支 daemon 考虑的事情很多,并非单纯执行一支程序就够了。
为了解决上面谈到的问题,因此通常 distribution 会给我们一个简单的 shell script 来进行启动的功能。 该 script 可以进行环境的侦测、配置文件的分析、PID 档案的放置,以及相关重要交换文件案的锁住 (lock) 动作, 你只要执行该 script ,上述的动作就一口气连续的进行,最终就能够顺利且简单的启动这个 daemon ! 这也是为何我们会希望你可以详细的研究一下第十三章的原因。
那么这些 daemon 的启动脚本 (shell script) 放在哪里啊?还有, CentOS 5.x 通常将 daemon 相关的档案放在哪里? 以及某些重要的配置文件又是放置到哪里?基本上是放在这些地方:

  • /etc/init.d/*:启动脚本放置处
    系统上几乎所有的服务启动脚本都放置在这里!事实上这是公认的目录,我们的 CentOS 实际上放置在 /etc/rc.d/init.d/ ! 不过还是有设定连结档到 /etc/init.d/ 的!既然这是公认的目录,因此建议您记忆这个目录即可!
  • /etc/sysconfig/* :各服务的初始化环境配置文件
    几乎所有的服务都会将初始化的一些选项设定写入到这个目录下,举例来说,登录档的 syslog 这支 daemon 的初始化设定就写入在 /etc/sysconfig/syslog 这里!而网络的设定则写在 /etc/sysconfig/network 这个档案中。 所以,这个目录内的档案也是挺重要的;
  • /etc/xinetd.conf, /etc/xinetd.d/* :super daemon 配置文件
    super daemon 的主要配置文件 (其实是默认值) 为 /etc/xinetd.conf ,不过我们上面就谈到了, super daemon 只是一个统一管理的机制,他所管理的其他 daemon 的设定则写在 /etc/xinetd.d/* 里头!
  • /etc/* :各服务各自的配置文件
    第六章就讲过了,大家的配置文件都是放置在 /etc/ 底下的!
  • /var/lib/* :各服务产生的数据库
    一些会产生数据的服务都会将他的数据写入到 /var/lib/ 目录中。举例来说,数据库管理系统 MySQL 的数据库默认就是写入 /var/lib/mysql/ 这个目录下!
  • /var/run/* :各服务的程序之 PID 记录处
    我们在第十七章谈到可以使用讯号 (signal) 来管理程序, 既然 daemon 是程序,所以当然也可以利用 kill 或 killall 来管理!不过为了担心管理时影响到其他的程序, 因此 daemon 通常会将自己的 PID 记录一份到 /var/run/ 当中!例如登录文件的 PID 就记录在 /var/run/syslogd.pid 这个档案中。如此一来, /etc/init.d/syslog 就能够简单的管理自己的程序。

上面谈到的部分是配置文件,那么 stand alone 与 super daemon 所管理的服务启动方式怎么作呢?他是这样做的:

一、Stand alone 的 /etc/init.d/* 启动
刚刚谈到了几乎系统上面所有服务的启动脚本都在 /etc/init.d/ 底下,这里面的脚本会去侦测环境、搜寻配置文件、 加载 distribution 提供的函数功能、判断环境是否可以运作此 daemon 等等,等到一切都侦测完毕且确定可以运作后, 再以 shell script 的 case….esac 语法来启动、关闭、 观察此 daemon !我们可以简单的以 /etc/init.d/syslog 这个登录档启动脚本来进行说明:
这里写图片描述
由于系统的环境都已经帮你制作妥当,所以利用 /etc/init.d/* 来启动、关闭与观察,就非常的简单!话虽如此, CentOS 还是有提供另外一支可以启动 stand alone 服务的脚本,那就是 service 这个程序。 其实 service 仅是一支 script ,他可以分析你下达的 service 后面的参数,然后根据你的参数再到 /etc/init.d/ 去取得正确的服务来 start 或 stop !他的语法是这样的:
这里写图片描述
这样就将一堆服务的运作状态栏出,你也可以根据这个输出的结果来查询你的某些服务是否正确运作了! 在上面的范例当中,启动方式以 service 这个程序,或者直接去到 /etc/init.d/ 底下启动都一样!自行去解析/sbin/service 就知道为啥了!

二、Super daemon 的启动方式
其实 Super daemon 本身也是一支 stand alone 的服务,看图 1.1.1 就知道了!因为 super daemon 要管理后续的其他服务嘛,他当然自己要常驻在内存中!所以 Super daemon 自己启动的方式与 stand alone 是相同的! 但是他所管理的其他 daemon 就不是这样做了!必须要在配置文件中设定为启动该 daemon 才行。配置文件就是 /etc/xinetd.d/* 的所有档案。那如何得知 super daemon 所管理的服务是否有启动呢?你可以这样做:
这里写图片描述
因为 disable 是『取消』的意思,因此如果『 disable = yes 』则代表取消此项服务的启动,如果是『 disable = no 』 才是有启动该服务!假设我想要启动如上的 rsync 这个服务,那么你可以这样做:
这里写图片描述
也就是说,你先修改 /etc/xinetd.d/ 底下的配置文件,然后再重新启动 xinetd 就对了!而 xinetd 是一个 stand alone 启动的服务!这部份得要特别留意!

18.2. 解析 super daemon 的配置文件
前一小节谈到的 super daemon 我们现在知道他是一支总管程序,这个 super daemon 是 xinetd 这一支程序所达成的。 而且由图 1.1.1 我们知道这个 xinetd 可以进行安全性或者是其他管理机制的控管, 由图 1.1.2 则可以了解 xinetd 也能够控制联机的行为。这些控制的手段都可以让我们的某些服务更为安全, 资源管理更为合理。而由于 super daemon 可以作这样的管理,因此一些对客户端开放较多权限的服务 (例如 telnet), 或者本身不具有管理机制或防火墙机制的服务,就可以透过 xinetd 来管理!
既然这家伙这么重要,那么底下我们就来谈谈 xinetd 这个服务的预设配置文件 /etc/xinetd.conf ,以及各个设定项目的意义!

18.2.1. 默认值配置文件:xinetd.conf: 重要参数说明
先来看一看预设的 /etc/xinetd.conf 这个档案的内容是什么吧!
这里写图片描述
为什么 /etc/xinetd.conf 可以称为默认值的配置文件呢?因为如果你有启动某个 super daemon 管理的服务, 但是该服务的设定值并没有指定上述的那些项目,那么该服务的设定值就以上述的默认值为主 ! 至于上述的默认值会将 super daemon 管理的服务设定为:『一个服务最多可以有 50 个同时联机, 但每秒钟发起的「新」联机最多仅能有 50 条,若超过 50 条则该服务会暂停 10 秒钟。同一个来源的用户最多仅能达成 10 条联机。 而登入的成功与失败所记录的信息并不相同。』这样说,可以比较清楚了吧? 至于更多的参数说明,我们会在底下再强调的!
既然这只是个预设参数档,那么自然有更多的服务参数档案啰~而所有的服务参数档都在 /etc/xinetd.d 里面,这是因为上表当中的最后一行!那么每个参数档案的内容是怎样呢?一般来说,他是这样的:
这里写图片描述
第一行一定都有个 service ,至于那个 里面的内容,则与/etc/services 有关,因为他可以对照着 /etc/services 内的服务名称与埠号来决定所要启用的 port 是哪个!然后相关的参数就在两个大括号中间。attribute 是一些 xinetd 的管理参数, assign_op 则是参数的设定方法。 assign_op 的主要设定形式为:

  • = : 表示后面的设定参数就是这样!
  • += : 表示后面的设定为『在原来的设定里头加入新的参数』;
  • -= : 表示后面的设定为『在原来的参数舍弃这里输入的参数!』;

用途不太相同,敬请留意!底下再来说一说那些 attribute 与 value !
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
我们就利用上面这些参数来架构出我们所需要的一些服务的设定吧!参考看看底下的设定方法!

18.2.2. 一个简单的 rsync 范例设定
我们知道透过 super daemon 控管的服务可以多一层管理的手续来达成类似防火墙的机制, 那么该如何仔细的设定这些类似防火墙机制的设定参数呢?底下我们使用 rsync 这个可以进行远程镜射 (mirror) 的服务来说明。 rsync 可以让两部主机上面的某个目录一模一样,在远程异地备援系统上面是挺好用的一个机制。 而且预设一装好 CentOS 就已经存在这玩意儿了!那就来瞧瞧预设的 rsync 配置文件吧!
这里写图片描述
能不能修改 user 成为其他身份呢?由于在 /etc/services 当中规定 rsync 使用的端口口号码为 873 ,这个埠口小于 1024 ,所以理论上启动这个埠口的身份一定要是 root 才行!这里 user 就请您先别乱改啰! 由于我的测试主机在安装时已经有捉到网络卡,目前有两个接口,一个是 192.168.1.100 ,一个则是 127.0.0.1, 假设我将 192.168.1.100 设计为对外网域, 127.0.0.1 为内部网域,且内外网域的分别权限设定为:

  • 对内部 127.0.0.1 网域开放较多权限的部分:
    o 这里的设定值需绑在 127.0.0.1 这个接口上;
    o 对 127.0.0.0/8 开放登入权限;
    o 不进行任何联机的限制,包括总联机数量与时间;
    o 但是 127.0.0.100 及 127.0.0.200 不允许登入 rsync 服务。

  • 对外部 192.168.1.100 网域较多限制的设定:
    o 对外设定绑住 192.168.1.100 这个接口;
    o 这个接口仅开放 140.116.0.0/16 这个 B 等级的网域及 .edu.tw 网域可以登入;
    o 开放的时间为早上 1-9 点以及晚上 20-24 点两个时段;
    o 最多允许 10 条同时联机的限制。

在这样的规划情况下,我们可以将刚刚上头的 /etc/xinetd.d/rsync 这个档案修改成为:
这里写图片描述
这里写图片描述
在上面这个配置文件中,共写了两段 service rsync 的设定,一段针对内部网域一段针对外部网域, 如果设计完毕你将他重新启动后,就会出现如下的状态!
这里写图片描述
这里写图片描述
如同上面的设定,我们就可以将某个系统服务针对不同的客户端来源指定不同的权限!这样子系统服务可以安全多了! 如果未来你的某些服务想要使用这个咚咚来设定也是 OK 的!更多的设定数据就有待您自己的理解了。

18.3. 服务的防火墙管理 xinetd, TCP Wrappers
一般来说,系统的防火墙分析主要可以透过封包过滤或者是透过软件分析,我们的 Linux 默认有提供一个软件分析的工具, 那就是 /etc/hosts.deny, /etc/hosts.allow 这两个可爱的配置文件!另外,如果有安装 tcp wrappers 套件时, 我们甚至可以加上一些额外的追踪功能!底下就让我们分别来谈谈这些玩意儿!

18.3.1. /etc/hosts.allow, /etc/hosts.deny 管理: ldd, 配置文件语法
我们在前面几章知道了要管制 at 的使用可以透过修订 /etc/at.{allow|deny} 来管理,至于 crontab 则是使用 /etc/cron.{allow|deny} 来管理的。那么有没有办法透过个什么机制,就能够管理某些程序的网络使用呢? 就有点像管理某些程序是否能够接受或者是拒绝来自因特网的联机的意思!有的!那就是 /etc/hosts.{allow|deny} 。
任何以 xinetd 管理的服务,都可以透过 /etc/hosts.allow, /etc/hosts.deny 来设定防火墙。那么什么是防火墙呢?简单的说,就是针对来源 IP 或网域进行允许或拒绝的设定, 以决定该联机是否能够成功达成连接的一种方式就是了。其实我们刚刚修改 /etc/xinetd.d/rsync 里头的 no_access, only_from 也可以进行这方面的防火墙设定。不过,使用 /etc/hosts.allow, /etc/hosts.deny 则更容易集中控管,在设定与查询方面也较为方便! 那么就让我们谈谈这两个档案的设定技巧吧!
其实 /etc/hosts.allow 与 /etc/hosts.deny 也是 /usr/sbin/tcpd 的配置文件,而这个 /usr/sbin/tcpd 则是用来分析进入系统的 TCP 网络封包的一个软件,TCP 是一种面向连接的网络联机封包,包括 www, email, ftp 等等都是使用 TCP 封包来达成联机的。 所以这个套件本身的功能就是在分析 TCP 网络数据封包!而 TCP 封包的文件头主要记录了来源与目主机的 IP 与 port ,因此藉由分析 TCP 封包并搭配 /etc/hosts.{allow,deny} 的规则比对,就可以决定该联机是否能够进入我们的主机。 所以我们要使用 TCP Wrappers 来控管的就是:

  1. 来源 IP 或/与 整个网域的 IP 网段;
  2. port (就是服务,前面有谈到启动某个埠口是 daemon 的责任)

基本上只要一个服务受到 xinetd 管理,或者是该服务的程序支持 TCP Wrappers 函式的功能时,那么该服务的防火墙方面的设定就能够以 /etc/hosts.{allow,deny} 来处理。换个方式来说,只要不支持 TCP Wrappers 函式功能的软件程序就无法使用 /etc/hosts.{allow,deny} 的设定值。不过,那要如何得知一个服务的程序有没有支持 TCP Wrappers 呢,你可以这样简单的处理。
这里写图片描述
这里写图片描述
ldd (library dependency discovery) 这个指令可以查询某个程序的动态函式库支持状态,因此透过这个 ldd 我们可以轻松的就查询到 sshd, httpd 有无支持 tcp wrappers 所提供的 libwrap.so 这个函式库档案。从上表的输出中我们可以发现, sshd 有支持但是 httpd 则没有支持。因此我们知道 sshd 可以使用 /etc/hosts.{allow,deny} 进行类似防火墙的抵挡机制,但是 httpd 则没有此项功能!

一、配置文件语法
这两个档案的设定语法都是一样的,基本上,看起来应该像这样:
这里写图片描述
重点是两个,第一个是找出你想要管理的那个程序的文件名,第二个才是写下来你想要放行或者是抵挡的 IP 或网域。 那么程序的文件名要如何写呢?其实就是写下档名!举例来说上面我们谈到过 rsync 配置文件内不是有 server 的参数吗? rsync 配置文件内 /usr/bin/rsync 为其参数值,那么在我们这里就得要写成 rsync 即可!依据 rsync 的配置文件资料,我们将抵挡的 127.0.0.100, 127.0.0.200, 及放行的 140.116.0.0/16 写在这,内容有点像这样:
这里写图片描述
当然也可以写成两行,亦即是:
这里写图片描述
这样一来,对方就无法以 rsync 进入你的主机!方便吧!不过,既然如此,为什么要设定成 /etc/hosts.allow 及 /etc/hosts.deny 两个档案呢?其实只要有一个档案存在就够了, 不过,为了设定方便起见,我们存在两个档案,其中需要注意的是:

  • 写在 hosts.allow 当中的 IP 与网段,为预设『可通行』的意思,亦即最后一个字段 allow 可以不用写;
  • 而写在 hosts.deny 当中的 IP 与网段则预设为 deny ,第三栏的 deny 亦可省略;
  • 这两个档案的判断依据是: (1) 以 /etc/hosts.allow 为优先,而 (2) 若分析到的 IP 或网段并没有记录在 /etc/hosts.allow ,则以 /etc/hosts.deny 来判断。

也就是说, /etc/hosts.allow 的设定优先于 /etc/hosts.deny !基本上,只要 hosts.allow 也就够了,因为我们可以将 allow 与 deny 都写在同一个档案内,只是这样一来似乎显得有点杂乱无章,因此通常我们都是:

  1. 允许进入的写在 /etc/hosts.allow 当中;
  2. 不许进入的则写在 /etc/hosts.deny 当中。

此外,我们还可以使用一些特殊参数在第一及第二个字段!内容有:

  • ALL:代表全部的 program_name 或者是 IP 都接受的意思,例如 ALL: ALL: deny
  • LOCAL:代表来自本机的意思,例如: ALL: LOCAL: allow
  • UNKNOWN:代表不知道的 IP 或者是 domain 或者是服务时;
  • KNOWN:代表为可解析的 IP, domain 等等信息时;

再强调一次,那个 service_name 其实是启动该服务的程序,举例来说, /etc/init.d/sshd 这个 script 里面, 实际上启动 ssh 服务的是 sshd 这个程序,所以,你的 service_name 自然就是 sshd ! 而 /etc/xinetd.d/telnet (你的系统可能尚未安装) 内有个 server 的设定项目, 那个项目指到 in.telnetd 这个程序来启动的!要注意的很!(请分别使用 vi 进这两支 scripts 查阅) 好了,我们还是以 rsync 为例子来说明好了,现在假设一个比较安全的流程来设定,就是:

  1. 只允许 140.116.0.0/255.255.0.0 与 203.71.39.0/255.255.255.0 这两个网域,及 203.71.38.123 这个主机可以进入我们的 rsync 服务器;
  2. 此外,其他的 IP 全部都挡掉!

这样的话,我可以这样设定:
这里写图片描述

18.3.2. TCP Wrappers 特殊功能
那么有没有更安全的设定?例如,当有其他人扫瞄我的 rsync port 时,我就将他的 IP 记住,以做为未来的查询与认证之用呢? 是有的!只是,那就得要有额外的动作参数加在第三栏了,而且你还需要安装了 TCP Wrappers 软件才行。要确定有没有安装 TCP Wrappers 可以使用『 rpm -q tcp_wrappers 』来查询。至于更加细部的主要动作则有:

  • spawn (action)
    可以利用后续接的 shell 来进行额外的工作,且具有变量功能,主要的变量内容为: %h (hostname), %a (address), %d (daemon)等等;
  • twist (action)
    立刻以后续的指令进行,且执行完后终止该次联机的要求 (DENY)

为了达成追踪来源目标的相关信息的目的,此时我们需要 safe_finger 这个指令的辅助才行。而且我们还希望客户端的这个恶意者能够被警告。 整个流程可以是这样的:

  1. 利用 safe_finger 去追踪出对方主机的信息 (包括主机名、用户相关信息等);
  2. 将该追踪到的结果以 email 的方式寄给我们本机的 root ;
  3. 在对方屏幕上面显示不可登入且警告他已经被记录的讯息;

由于是抵挡的机制,因此我们这个 spawn 与 twist 的动作大多是写在 /etc/hosts.deny 档案中的。我们将上述的动作写成类似如下的咚咚:
这里写图片描述
上面其实是针对一个 rsync 所写的信息,你可以看到上面这四行共有三个冒号来隔开成四个咚咚,这四个咚咚的意义是:

  1. rsync: 指的就是 rsync 这个服务的程序;
  2. ALL: 指的是来源,这个范围指的当然是全部的所有来源,因为是 ALL 嘛!
  3. spawn (echo “security notice from host $(/bin/hostname)” ; echo ; /usr/sbin/safe_finger @%h ) | /bin/mail -s “%d-%h security” root &: 由于要将一些侦测的数据送给 root 的邮件信箱,因此需要使用数据流汇整的括号( ),括号内的重点在于 safe_finger 的项目,他会侦测到客户端主机的相关信息,然后使用管线命令将这些数据送给 mail 处理, mail 会将该信息以标头为 security 的字样寄给 root !由于 spawn 只是中间的过程,所以还能够有后续的动作!
  4. twist ( /bin/echo -e “\n\nWARNING connection not allowed.\n\n” ): 这个动作会将 Warning 的字样传送到客户端主机的屏幕上! 然后将该联机中断。

在上面的例子中,第三行的 root 那个账号,可以写成你的个人账号或者其他 e-mail ,这样就能够寄到你常用的 email , 这样也比较好管理。如此一来,当未经允许的计算机尝试登入你的主机时,对方的屏幕上就会显示上面的最后一行,并且将他的 IP 寄到 root ( 或者是你自己的信箱 )那里去!

18.4. 系统开启的服务
现在假设你已经知道了 daemons 的启动档案放置的目录,也知道了服务与 port 的对应,那么要如何查询目前系统上面已经启动了的服务呢?不要再打混了!已经学过了 ps 与 top 应该要会应用才对!没错,可以使用 ps 与 top 来找寻已经启动了的服务的程序与他的 PID !不过,我们怎么知道该服务启动的 port 是哪一个?可以直接使用 netstat 这个网络状态观察指令来检查我们的 port !甚至他也可以帮我们找到该 port 的程序 (PID) !这个指令的相关用途,我们在 第十七章程序管理已经谈过了。

18.4.1. 观察系统启动的服务
观察系统已启动的服务方式很多,不过,我们最常使用 netstat 来观察。基本上,以 ps 来观察整个系统上面的服务是比较妥当的,因为他可以将全部的 process 都找出来。不过,我们比较关心的还是在于有启动网络监听的服务, 所以我会比较喜欢使用 netstat 来查阅。
这里写图片描述
这里写图片描述
利用 netstat 可以取得很多跟网络有关的服务信息,透过这个指令,我们可以轻易的了解到网络的状态, 并且可以透过 PID 与 kill 的相关功能,将有问题的数据给他剔除说~ 当然要更详细的取得 PPID 的话,才能够完全的抵挡有问题的程序!
另外,除了已经存在系统当中的 daemon 之外,如何在一开机就完整的启动我们所需要的服务呢? 底下我们就来谈一谈 chkconfig 及 ntsysv 这两个好用的东西!

18.4.2. 设定开机后立即启动服务的方法: chkconfig, ntsysv
就如同上面提到的,我们使用 netstat 仅能观察到目前已经启动的 daemon ,使用 service 这个指令或者是『 /etc/init.d/* start 』的方法则仅能在目前的环境下立即启动某个服务而已。 那么重新启动后呢?该服务是否还是继续的自动启动?这个时候我们就得要了解一下,到底我的 Linux 主机是怎么开机的呢?

  1. 打开计算机电源,开始读取 BIOS 并进行主机的自我测试;
  2. 透过 BIOS 取得第一个可开机装置,读取主要开机区 (MBR) 取得开机管理程序;
  3. 透过开机管理程序的设定,取得 kernel 并加载内存且侦测系统硬件;
  4. 核心主动呼叫 init 程序;
  5. init 程序开始执行系统初始化 (/etc/rc.d/rc.sysinit)
  6. 依据 init 的设定进行 daemon start (/etc/rc.d/rc[0-6].d/*)
  7. 加载本机设定 (/etc/rc.d/rc.local)

关于更多开机流程的详细说明,我们会在第二十章时再来跟大家说明。 由上面的流程你可以看到系统服务在开机时就可以被启动的地方是在第六个步骤,而事实上第六个步骤就是以不同的执行等级呼叫不同的服务! 那么什么叫做执行等级呢?
我们在启动 Linux 系统时,可以进入不同的模式,这模式我们称为执行等级 (run level)。不同的执行等级有不同的功能与服务, 目前你先知道正常的执行等级有两个,一个是具有 X 窗口接口的 run level 5 ,另一个则是纯文本界面的 run level 3。 由于默认我们是以图形接口登入系统的,因此可以想象得到的是,我们应该是在 run level 5 的环境中! 那你怎么知道 run level 5 有哪些服务预设可以启动呢?这就得要使用特殊的指令来查询!

一、chkconfig: 管理系统服务默认开机启动与否
这里写图片描述
chkconfig 是可很容易管理我们所需要的服务: 你可以轻松的透过 chkconfig 来管理 super daemon 的服务!另外,你得要知道的是, chkconfig 仅是设定开机时预设会启动的服务而已, 所以该服务目前的状态如何是不知道的。我们举个底下的例子来说明好了:
这里写图片描述
这里写图片描述
上面的范例四并没有启动 httpd 的原因很简单,因为我们并没有使用 /etc/init.d/httpd start !我们仅是设定开机时启动而已!那我们又没有重新启动,所以当然使用 chkconfig 并不会导致该服务立即被启动!也不会让该服务立即被关闭,而是只有在开机时才会被加载或取消载入而已。而既然 chkconfig 可以设定开机是否启动,那么我们能不能用来管理 super daemon 的启动与关闭呢?我们就来试看看底下的案例:
这里写图片描述
最后一个指令你会发现原本 rsync 不见了!这样是否很轻易的就能够启动与关闭你的 super daemon 管理的服务呢!

二、ntsysv: 类图形接口管理模式
chkconfig 真的已经很好用了,不过我们的 CentOS 还有提供一个更不错的 ntsysv ! chkconfig 很多的 distributions 都存在,但是 ntsysv 则是 Red Hat 系统特有的!
这里写图片描述
一般我们都是直接输入 ntsysv 即可进入管理画面了,整个画面如下图所示:
这里写图片描述
上图中的中间部分是每个服务预设开机是否会启动的设定值,若中括号内出现星号 (*) 代表预设开机会启动,否则就是不会在开机时启动。 你可以使用上下键来移动中括号内的光标到你想要变更的那个服务上头,然后按下空格键就能够选取或取消。如果一切都选择完毕后, 你可以使用 [tab] 按键来移动光标到 [OK] [Cancel] 等按钮上面,当然按下 [Ok] 就是确认你的选取会生效。 总结一下上述的按钮功能:

  • 上下键: 可以在中间的方框当中,在各个服务之间移动;
  • 空格键: 可以用来选择你所需要的服务,前面的 [] 会有 出现;
  • tab 键: 可以在方框、OK、Cancel 之间移动;
  • [F1]键: 可以显示该服务的说明
    这里写图片描述
    上图是将游标游动到 atd 这个服务上头后,再按下 [F1] 所出现的结果,所以你可以透过 ntsysv 去观察预设开机启动的服务, 还能够查阅该服务的基本功能,这样就能够稍微理清一下该服务是否需要存在!

二、chkconfig: 设定自己的系统服务
这里写图片描述
现在你知道 chkconfig 与 ntsysv 是真好用的东西,那么如果我自己写了一个程序并且想要让该程序成为系统服务好让 chkconfig 来管理时, 可以怎么进行呢?只要将该服务加入 init 可以管理的 script 当中,亦即是 /etc/init.d/ 当中即可。 举个例子,我们在 /etc/init.d/ 里面建立一个 myvbird 档案,该档案仅是一个简单的服务范例,基本上,没有任何用途…. 对于该档案的必须性是这样的:

  • myvbird 将在 run level 3 及 5 启动;
  • myvbird 在 /etc/rc.d/rc[35].d 当中启动时,以 80 顺位启动,以 70 顺位结束。

关于所谓的顺位问题,我们会在第二十章介绍,这里你先看看即可。 你该如何进行呢?可以这样做:
这里写图片描述
你可以参考你自己系统上面的档案;基本上,比较重要的是第二行,他的语法是: 『 chkconfig: [runlevels] [启动顺位] [停止顺位] 』其中, runlevels 为不同的 run level 状态,启动顺位 (start number) 与 结束顺位 (stop number) 则是在 /etc/rc.d/rc[35].d 内建立以 S80myvbird 及 K70myvbird 为档名的设定方式!
这里写图片描述
chkconfig 真的是个不错用的工具!尤其是当你想要自己建立自己的服务时!

18.4.3. CentOS 5.x 预设启动的服务简易说明
随着 Linux 上面软件支持性越来越多,加上自由软件蓬勃的发展,我们可以在 Linux 上面用的 daemons 真的越来越多了。所以,想要写完所有的 daemons 介绍几乎是不可能的,因此这里仅介绍几个很常见的 daemons 而已, 更多的信息就得要麻烦你自己使用 ntsysv 或者是 vi /etc/init.d/* 里面的档案去瞧一瞧了 ! 底下的建议主要是针对 Linux 单机服务器的角色来说明的,不是桌上型的环境!
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
上面的服务是 CentOS 5.x 预设有启动的,这些预设启动的服务很多是针对桌面计算机所设计的,所以如果你的 Linux 主机用途是在服务器上面的话,那么有很多服务是可以关闭的!如果你还有某些不明白的服务想要关闭的, 请务必要搞清楚该服务的功能为何!举例来说,那个 syslog 就不能关闭,如果你关掉他的话,系统就不会记录登录文件, 那你的系统所产生的警告讯息就无法记录起来,你将无法进行 debug 了。
底下继续说明一些可能在你的系统当中的服务,只是预设并没有启动这个服务就是了。只是说明一下, 各服务的用途还是需要您自行查询相关的文章。
这里写图片描述

猜你喜欢

转载自blog.csdn.net/kk53976047/article/details/79502591