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

在Unix-Like的系统中,你会经常听到daemon这个字眼。那么什么是传说中的daemon呢?这些 daemon 放在什么地方?它的功能是什么?该如何启动这些 daemon?又如何有效地将这些 daemon 管理妥当?此外,要如何查看这些 daemon 开了多少个端口?这些端口要如何关闭?还有,知道你系统的这些端口各代表的是什么服务吗?这些都是最基础需要注意的呢!尤其是在架设网站之前,这里的概念就显得更重要了。

18.1 什么是daemon 与服务(service)

我们在第17章就曾经谈过“服务”,当时的说明是:常驻在内存中的进程,且可以提供一些系统或网络功能,那就是服务。而服务一般的英文说法是“service”。

但如果你经常上网去查看一些数据的话,尤其是Unix-Like的相关操作系统,应该经常看到“请启动某daemon来提供某种功能”,那么daemon与service有关嗌?否则为什么都能够提供某些系统或网络功能?此外,这个 daemon 是什么东西呀?daemon 的字面上的意思就是“守护神、恶魔”,还真是有点奇怪。

简单地说,系统为了某些功能必须要提供一些服务(不论是系统本身还是网络方面),这个服务就称为service。但是service的提供总是需要进程的运行,否则如何执行呢?所以实现这个service的程序我们就称它为daemon。举例来说,实现循环型例行性工作调度服务(service)的程序为crond这个daemon。这样说比较容易理解了吧!

你不必去区分什么是 daemon 与 service 。事实上,你可以将这两者视为相同!因为达成某个服务是需要一个 daemon 在后台中运行,没有这个 daemon 就不会有 service 。所以不需要分得太清楚啦!

一般来说,当我们以文本模式或图形模式(非单用户维护模式)完整开机进入Linux主机后,系统已经提供我们很多的服务了,包括打印服务、工作调度服务、邮件管理服务等;那么这些服务是如何被启动的?它们的工作类型如何?下面我们就来谈一谈。

18.1.1 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这个就是!

figure_0547_0314

图18-1 Superdaemon 的运行示意图

如图 18-1 所示,Super daemon 是常驻在内存中的,Program 1/2/3 则是启动某些服务的进程(未被启动状态)。当有客户端的请求时,Super daemon 才会去触发相关的进程加载成为daemon 而存在于内存中,此时,客户端的请求才会被 Super daemon 导向 Daemon1 去达成连接。当客户端的请求结束时,Daemon 1 将会被删除,图中实线的连接就会中断。

窗口类型的解说

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

个别窗口负责单一服务的stand alone

在银行里面,假设有一种单一服务的窗口,例如存钱窗口,所以当你需要存钱的时候,直接前往该窗口,就有“专人”为你服务。这就是 stand alone 的情况。

统一窗口负责各种业务的super daemon

在银行里面假设还有另外一种复合类型的统一窗口,同时提供转账、资金调度、提款等的业务,那当你需要其中一项业务的时候,就需要前往该窗口。但是坐在窗口的这个营业员拿到你的需求单之后,往后面一丢:“喂!那个转账的仁兄!该你工作了!”那么那个仁兄就开始工作去。然而里面还有资金调度与提款等负责业务的仁兄呢!都在干自己的事了。

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

multi-threaded(多线程)

就是我们提到的,全部的客户的要求都给他拿来,一次给他交办下去,所以一个服务同时会负责好几个进程。

single-threaded(单线程)

这个就是目前我们“人类的银行”最常见的方式啦,不论如何,反正一个一个来,第一个没有处理完之前,后面的请排队。所以如果客户端的请求突然大增的话,那么这些晚到的客户端可得等上一等!

figure_0547_0315

图18-2 单执行与多重执行的super daemon 运作方式

如图18-2所示,左侧为多重执行的方式,daemon会一直被触发多个进程来提供不同client的服务,所以不论你是第几个登录者,都可以享用 daemon 的服务。至于右侧则是单一执行的方式,仅会有一支 daemon 被唤醒,第一个用户达成连接后,后续想要连接的用户就得要等待,因此他们的连接不会成功的。

另外,需要注意的是,既然银行里面有这两种窗口同时存在,所以,在 Linux 系统里面,这两种daemon的启动方式也是可以同时存在的。也就是说,某些服务可以使用stand alone 来启动,而有些其他的服务则可以使用xinetd这个super daemon来管理,大致的情况就是这样。

daemon工作形态的类型

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

signal-control

这种daemon是通过信号来管理的,只要有任何客户端的请求进来,它就会立即启动去处理。例如打印机的服务(cupsd)。

interval-control

这种 daemon 则主要是每隔一段时间就主动去执行某项工作,所以,你要做的是在配置文件指定服务要进行的时间与工作,该服务在指定的时间才会去完成工作。我们在第16章提到的atd与crond就属于这种类型的daemon(每分钟检测一次配置文件)。

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

daemon的命名规则

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

18.1.2 服务与端口的对应

从第 17 章与前一小节对服务的说明后,你应该要知道的是,系统所有的功能都是某些程序所提供的,而进程则是通过触发程序而产生的。同样,系统提供的网络服务当然也是这样的!只是由于网络牵涉到TCP/IP的概念,所以显得比较复杂一些就是了。

玩过Internet的朋友应该知道IP这玩意儿,大家都说IP就是代表你的主机在因特网上面的“门牌号码”。但是你的主机总是可以提供非常多的网络服务而不止一项功能而已,但我们仅有一个IP呢!当客户端连接我们的主机时,我们主机是如何分辨不同的服务请求呢?那就是通过端口号( portnumber)。端口号就可想象成你家门牌上面的第几层楼。这个 IP 与 port 就是因特网连接的最重要机制之一。我们拿下面的网址来说明:

http://ftp.isu.edu.cn/

ftp://ftp.isu.edu.cn/

有没有发现,两个网址都是指向 ftp.isu.edu.cn 这个义守大学的FTP网站,但是浏览器上面显示的结果却是不一样的?是啊!这是因为我们指向不同的服务嘛!一个是http这个WWW的服务,一个则是ftp这个文件传输服务,当然显示的结果就不同了,如图18-3所示。

figure_0548_0316

图18-3 port 与daemon 的对应,客户端连接协议不同,服务导向端口号也不同

事实上,为了统一整个因特网的端口号对应服务的功能,好让所有的主机都能够使用相同的机制来提供服务与请求服务,所以就有了“协议”。也就是说,有些约定俗成的服务都放置在同一个端口号上面。举例来说,网址栏上面的http会让浏览器向WWW服务器的80端口号进行连接的请求。而WWW服务器也会将httpd这个软件激活在port 80,这样两者才能够达成连接的!

那么想一想,系统上面有没有什么设置可以让服务与端口号对应在一起呢?那就是/etc/services。

[root@www ~]# cat /etc/services

….(前面省略)….

ftp   21/tcp

ftp   21/udp  fsp fspd

ssh   22/tcp      # SSH Remote Login Protocol

ssh   22/udp      # SSH Remote Login Protocol

….(中间省略)….

http   80/tcp  www www-http # WorldWideWeb HTTP

http   80/udp  www www-http # HyperText Transfer Protocol

….(下面省略)….

这个文件的内容是以下面的方式来编排的:

<daemon name> <port/数据包协议> <该服务的说明>

像上面说的是,第一列为daemon的名称,第二列为该daemon所使用的端口号与网络数据包协议,数据包协议主要为可靠连接的TCP数据包以及较快速但为非面向连接的UDP数据包。举个例子说,那个远程连接机制使用的是ssh这个服务,而这个服务使用的端口号为22。

请特别注意!虽然有的时候你可以通过修改 /etc/services 来更改一个服务的端口号,不过并不建议如此做,因为很有可能会造成一些协议的错误情况!这里特此说明一番!(除非你要架设一个地下网站,否则的话,使用 /etc/services 原先的设置就好!)

18.1.3 daemon 的启动脚本与启动方式

提供某个服务的daemon虽然只是一个进程而已,但是这个daemon的启动还是需要执行文件、配置文件、执行环境等,举例来说,你可以查阅一下httpd这个进程(man httpd),里面可谈到不少的参数呢!此外,为了管理上面的方便,所以通常distribution都会记录每一个daemon启动后所取得进程的PID并放在/var/run/这个目录下呢!在启动这些服务之前,你可能也要自行处理一下daemon能够顺利执行的环境是否正确等。鸟哥这里要讲的是,要启动一个daemon考虑的事情很多,并非单纯执行一个进程就够了。

为了解决上面谈到的问题,因此通常 distribution 会给我们一个简单的 shell script 来进行启动的功能。该script可以进行环境的检测、配置文件的分析、PID文件的放置,以及相关重要交换文件的锁住(lock)操作,你只要执行该 script,上述的操作就一口气连续进行,最终就能够顺利且简单地启动这个daemon。这也是为何我们会希望你可以详细研究一下第13章的原因。

那么这些 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,不过我们上面就谈到了,superdaemon只是一个统一管理的机制,它所管理的其他daemon的设置则写在/etc/xinetd.d/*里面。

/etc/*:各服务各自的配置文件

第6章就讲过了,大家的配置文件都是放置在/etc/下面的。

/var/lib/*:各服务产生的数据库

一些会产生数据的服务都会将它的数据写入到/var/lib/目录中。举例来说,数据库管理系统MySQL的数据库默认就是写入/var/lib/mysql/这个目录下。

/var/run/*:各服务的程序的PID记录处

我们在第17章谈到可以使用信号(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这个日志文件启动脚本来进行说明:

[root@www ~]# /etc/init.d/syslog

用法: /etc/init.d/syslog {start|stop|status|restart|condrestart}

什么参数都不加的时候,系统会告诉你可以用的参数有哪些,如上所示。

范例一:查看 syslog 这个 daemon 目前的状态

[root@www ~]# /etc/init.d/syslog status

syslogd (pid 4264) 正在执行…

klogd (pid 4267) 正在执行…

代表 syslog 管理两个 daemon ,这两个 daemon 正在运行中。

范例二:重新让 syslog 读取一次配置文件

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

正在关闭内核记录器:  [ 确定 ]

正在关闭系统记录器:  [ 确定 ]

正在启动系统记录器:  [ 确定 ]

正在启动内核记录器:  [ 确定 ]

[root@www ~]# /etc/init.d/syslog status

syslogd (pid 4793) 正在执行…

klogd (pid 4796) 正在执行…

因为重新启动过,所以 PID 与第一次查看的值就不一样了。

由于系统的环境都已经帮你制作妥当,所以利用/etc/init.d/*来启动、关闭与查看,就非常简单!话虽如此,CentOS 还是有提供另外一个可以启动 stand alone 服务的脚本,那就是 service这个进程。其实service仅是一个script,它可以分析你执行的service后面的参数,然后根据你的参数再到/etc/init.d/去取得正确的服务来start或stop。它的语法是这样的:

[root@www ~]# service [service name] (start|stop|restart|…)

[root@www ~]# service —status-all

参数:

service name:即是需要启动的服务名称,需与 /etc/init.d/ 对应;

start|… :即是该服务要进行的工作;

—status-all:将系统所有的 stand alone 的服务状态全部列出来。

范例三:重新启动 crond 这个 daemon :

[root@www ~]# service crond restart

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

这两种方法随便你用哪一种来处理都可以!不过鸟哥比较喜欢使用 /etc/init.d/*

范例四:显示出目前系统上面所有服务的运行状态

[root@www ~]# service —status-all

acpid (pid 4536) 正在执行…

anacron 已停止

atd (pid 4694) 正在执行…

….(下面省略)….

这样就将一堆服务的运行状态列出,你也可以根据这个输出的结果来查询你的某些服务是否正确运行了!其实,在上面的范例当中,启动方式以service这个程序,或者直接去到/etc/init.d/下面启动,都一样啦!自行去解析/sbin/service就知道为什么了!

事实上,在 Linux 系统中,要开或关某个端口,就是需要启动或关闭某个服务。因此,你可以找出某个端口对应的服务及程序对应的服务,进而启动或关闭它,那么那个经由该服务而启动的端口自然就会关掉了!

super daemon 的启动方式

其实super daemon本身也是一个stand alone的服务,看图18-1就知道啦!因为super daemon要管理后续的其他服务,它当然自己要常驻在内存中。所以super daemon自己启动的方式与 stand alone 是相同的!但是它所管理的其他daemon就不是这样做了。必须要在配置文件中设置为启动该daemon才行。配置文件就是/etc/xinetd.d/*的所有文件。那如何得知super daemon 所管理的服务是否有启动呢?你可以这样做:

[root@www ~]# grep -i 'disable' /etc/xinetd.d/*

….(前面省略)….

/etc/xinetd.d/rsync:   disable = yes

/etc/xinetd.d/tcpmux-server: disable = yes

/etc/xinetd.d/time-dgram: disable = yes

/etc/xinetd.d/time-stream: disable = yes

因为disable是“取消”的意思,因此如果“disable=yes”则代表取消此项服务的启动,如果是“disable=no”才是有启动该服务。假设我想要启动如上的rsync这个服务,那么你可以这样做:

1. 先修改配置文件成为启动的模样:

[root@www ~]# vim /etc/xinetd.d/rsync

请将 disable 那一行改成如下的模样 (原本是 yes 改成 no 就对了)

service rsync

{

disable = no

….(后面省略)….

2. 重新启动 xinetd 这个服务

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

正在停止 xinetd:   [ 确定 ]

正在激活 xinetd:   [ 确定 ]

3. 查看启动的端口

[root@www ~]# grep 'rsync' /etc/services <==先看看端口是哪一号

rsync  873/tcp   # rsync

rsync  873/udp   # rsync

[root@www ~]# netstat -tnlp | grep 873

tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 4925/xinetd

注意看!启动的服务并非 rsync ,而是 xinetd ,因为它要控制 rsync 。

若有疑问,一定要去看看图18-1 才行!

也就是说,你先修改/etc/xinetd.d/下面的配置文件,然后再重新启动xinetd就对了!而xinetd是一个standalone启动的服务。这部分得要特别留意呢!

18.2 解析super daemon 的配置文件

前一小节谈到的super daemon我们现在知道它是一个总管进程,这个super daemon是xinetd这一个进程所实现的。而且由图18-1我们知道这个xinetd可以进行安全性或者是其他管理机制的控制,由图18-2则可以了解xinetd也能够控制连接的行为。这些控制的手段都可以让我们的某些服务更为安全、资源管理更为合理。而由于super daemon可以做这样的管理,因此一些对客户端开放较多权限的服务(例如telnet)或者本身不具有管理机制或防火墙机制的服务就可以通过xinetd来管理。

既然这家伙这么重要,那么下面我们就来谈谈xinetd这个服务的默认配置文件/etc/xinetd.conf,以及各个设置选项的意义。

18.2.1 默认值配置文件:xinetd.conf

先来看一看默认的/etc/xinetd.conf这个文件的内容是什么吧!

[root@www ~]# vim /etc/xinetd.conf

defaults

{

服务启动成功或失败,以及相关登录行为的日志文件

log_type  = SYSLOG daemon info  <==日志文件的记录服务类型

log_on_failure = HOST     <==发生错误时需要记录的信息为主机 (HOST)

log_on_success = PID HOST DURATION EXIT <==成功启动或登录时的记录信息

允许或限制连接的默认值

cps   = 50 10     <==同一秒内的最大连接数为 50 个,若超过则暂停 10 秒

instances = 50      <==同一服务的最大同时连接数

per_source  = 10     <==同一来源的客户端的最大连接数

网络 (network) 相关的默认值

v6only   = no      <==是否仅允许 IPv6 ?可以先暂时不启动 IPv6 支持

环境参数的设置

groups  = yes

umask   = 002

}

includedir /etc/xinetd.d      <==更多的设置值在 /etc/xinetd.d 那个目录内

为什么 /etc/xinetd.conf 可以称为默认值的配置文件呢?因为如果你有启动某个 super daemon管理的服务,但是该服务的设置值并没有指定上述的那些项目,那么该服务的设置值就以上述的默认值为主。至于上述的默认值会将 super daemon 管理的服务设置为:一个服务最多可以有 50 个同时连接,但每秒钟发起的“新”连接最多仅能有50条,若超过50条则该服务会暂停10秒钟。同一个来源的用户最多仅能达成 10 条连接。而登录的成功与失败所记录的信息并不相同。这样说,可以比较清楚了吧?至于更多的参数说明,我们会在下面再强调。

既然这只是个默认参数文件,那么自然有更多的服务参数文件。而所有的服务参数文件都在/etc/xinetd.d 里面,这是由上面的最后一行代码设置的。那么每个参数文件的内容是怎样呢?一般来说,它是这样的:

service <service_name>

{

<attribute> <assign_op> <value> <value> …

………….

}

第一行一定都有一个service,至于那个<service_name>里面的内容则与/etc/services有关,因为它可以对照着/etc/services内的服务名称与端口号来决定所要启用的port是哪个啊!然后相关的参数就在两个大刮号中间。attribute 是一些 xinetd 的管理参数,assign_op 则是参数的设置方法。assign_op的主要设置形式为:

=:表示后面的设置参数就是这样;

+=:表示后面的设置为在原来的设置里面加入新的参数;

-=:表示后面的设置为在原来的参数中舍弃这里输入的参数!

用途不太相同,敬请留意。好了!下面再来说一说那些attribute与value,如表18-1所示。

表18-1

figure_0553_0317

续表

figure_0554_0318

续表

figure_0555_0319

我们就利用上面这些参数来架构出我们所需要的一些服务的设置吧!参考看看下面的设置方法。

18.2.2 一个简单的rsync 范例设置

我们知道通过super daemon管理的服务可以多一层管理的手续来达成类似防火墙的机制,那么该如何仔细设置这些类似防火墙机制的设置参数呢?下面我们使用rsync这个可以进行远程镜射(mirror)的服务来说明。rsync 可以让两部主机上面的某个目录一模一样,在远程异地备份系统上面是挺好用的一个机制,而且默认一个装好CentOS就已经存在了!那就来瞧瞧默认的rsync配置文件吧!

[root@www ~]# vim /etc/xinetd.d/rsync

service rsync <==服务名称为 rsync

{

disable = no      <==默认是关闭的!刚才被我们打开了

socket_type = stream   <==使用 TCP 的连接机制之故

wait   = no    <==可以同时进行大量连接功能

user   = root   <==启动服务为 root 这个身份

server  = /usr/bin/rsync <==就是这个进程启动 rsync 的服务

server_args = —daemon  <==这是必要的参数

log_on_failure += USERID  <==登录错误时,额外记录用户 ID

}

能不能修改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网开放较多权限的部分

这里的设置值需绑在127.0.0.1这个接口上;

对127.0.0.0/8开放登录权限;

不进行任何连接的限制,包括总连接数量与时间;

但是127.0.0.100及127.0.0.200不允许登录rsync服务。

对外部192.168.1.100网较多限制的设置

对外设置绑住192.168.1.100这个接口;

这个接口仅开放140.116.0.0/16这个B等级的网段及.edu.cn网段可以登录;

开放的时间为早上1∶00~9∶00点以及晚上20∶00~24∶00点两个时段;

最多允许10条同时连接的限制。

有经验的朋友当然知道 127.0.0.1 是内部循环测试用的 IP ,用它来设计网络是没有意义的。不过,我们这里仅是作一个设计的介绍,而且我们尚未谈到服务器篇的网络部分,所以大家先这样实际测试。

在这样的规划情况下,我们可以将刚才上面的/etc/xinetd.d/rsync这个文件修改成为:

[root@www ~]# vim /etc/xinetd.d/rsync

先针对对内的较为松散的限制来设置:

service rsync

{

disable = no      <==要启动才行啊!

bind   = 127.0.0.1   <==服务绑在这个接口上!

only_from  = 127.0.0.0/8  <==只开放这个网段的源登录

no_access  = 127.0.0.{100,200} <==限制这两个不可登录

instances  = UNLIMITED   <==替代 /etc/xinetd.conf 的设置值

socket_type = stream   <==下面的设置则保留

wait   = no

user   = root

server  = /usr/bin/rsync

server_args = —daemon

log_on_failure += USERID

}

再针对外部的连接来进行限制呢!

service rsync

{

disable = no

bind   = 192.168.1.100

only_from  = 140.116.0.0/16

only_from += .edu.tw     <==因为累加,所以利用 += 设置

access_times = 01:00-9:00 20:00-23:59 <==时间有两时段,有空格隔开

instances  = 10      <==只有 10 条连接

socket_type = stream

wait   = no

user   = root

server  = /usr/bin/rsync

server_args = —daemon

log_on_failure += USERID

}

在上面这个配置文件中,鸟哥共写了两段 service rsync 的设置,一段针对内网,一段针对外网,如果设计完毕你将它重新启动后,就会出现如下的状态。

1. 先看看原本的 873 状态

[root@www ~]# netstat -tnlp | grep 873

tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 4925/xinetd

仔细看,仅针对 0.0.0.0 这个全网监听而已呢!

2. 重新启动 xinetd 吧!不是启动 rsync 。别搞错!

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

[root@www ~]# netstat -tnlp | grep 873

tcp 0 0 192.168.1.100:873 0.0.0.0:*  LISTEN 7227/xinetd

tcp 0 0 127.0.0.1:873  0.0.0.0:*  LISTEN 7227/xinetd

有没有看到两个接口啊?而且,PID 会是同一个呢!

如同上面的设置,我们就可以将某个系统服务针对不同的客户端来源指定不同的权限。这样系统服务可以安全多了!如果将来你的某些服务想要使用这个来设置也是OK的。更多的设置数据就有待你自己的理解了。

18.3 服务的防火墙管理 xinetd, TCP Wrappers

一般来说,系统的防火墙分析主要可以通过数据包过滤或者是通过软件分析,我们的Linux默认有提供一个软件分析的工具,那就是/etc/hosts.deny和/etc/hosts.allow这两个可爱的配置文件!另外,如果有安装tcp wrappers套件时,我们甚至可以加上一些额外的跟踪功能呢!下面就让我们分别来谈谈。

18.3.1 /etc/hosts.allow,/etc/hosts.deny 管理

我们在前面几章知道了要控制 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}来处理。换个方式来说,只要不支持TCPWrappers 函数功能的软件程序就无法使用/etc/hosts.{allow,deny}的设置值,这样说有没有比较清楚啊?不过,那要如何得知一个服务的程序有没有支持TCP Wrappers呢?你可以这样简单处理。

范例一:测试一下sshd 及 httpd 这两个程序有无支持 TCP Wrappers 的功能

[root@www ~]# ldd $(which sshd httpd)

/usr/sbin/sshd:

libwrap.so.0 => /usr/lib64/libwrap.so.0 (0x00002abcbfaed000)

libpam.so.0 => /lib64/libpam.so.0 (0x00002abcbfcf6000)

….(中间省略)….

/usr/sbin/httpd:

libm.so.6 => /lib64/libm.so.6 (0x00002ad395843000)

libpcre.so.0 => /lib64/libpcre.so.0 (0x00002ad395ac6000)

….(下面省略)….

重点在于软件有没有支持 libwrap.so 那个函数库

ldd(library dependency discovery)这个命令可以查询某个程序的动态函数库支持状态,因此通过这个 ldd 我们可以轻松地查询到 sshd、httpd 有无支持 tcp wrappers 所提供的 libwrap.so 这个函数库文件。从上面的输出中我们可以发现,sshd 有支持但是httpd 则没有支持。因此我们知道 sshd可以使用/etc/hosts.{allow,deny}进行类似防火墙的抵挡机制,但是httpd则没有此项功能。

配置文件语法

这两个文件的设置语法都是一样的,基本上,看起来应该像这样:

<service(program_name)> : <IP, domain, hostname> : <action>

<服务 (即程序名称)>  : <IP 或域 或主机名>  : < 操作 >

上面的< >是不存在于配置文件中的。

重点是两个,第一个是找出你想要管理的那个程序的文件名,第二个才是写下来你想要放行或者是抵挡的IP或域。那么程序的文件名要如何写呢?其实就是写下文件名。举例来说,上面我们谈到过rsync配置文件内不是有server的参数吗?rsync配置文件内 /usr/bin/rsync为其参数值,那么在我们这里就得要写成rsync即可。依据rsync的配置文件资料,我们将被阻挡的 127.0.0.100, 127.0.0.200 及放行的 140.116.0.0/16 写在这,内容有点像这样:

关于 IP、域、网段,还有相关的网络知识,在这个基础篇当中我们不会谈到,你只要记得下面写的 140.116.0.0/255.255.0.0 代表一个域就是了。详细的数据请先自行参考服务器架设篇的内容!

[root@www ~]# vim /etc/hosts.deny

rsync : 127.0.0.100 127.0.0.200 : deny

当然也可以写成两行,即是:

[root@www ~]# vim /etc/hosts.deny

rsync : 127.0.0.100  : deny

rsync : 127.0.0.200  : deny

这样一来,对方就无法以 rsync 进入你的主机。方便吧!不过,既然如此,为什么要设置成/etc/hosts.allow 及/etc/hosts.deny 两个文件呢?其实只要有一个文件存在就够了,不过,为了设置方便起见,我们使用两个文件,其中需要注意的是:

写在hosts.allow当中的IP与网段为默认“可通行”的意思,即最后一个字段allow可以不用写;

而写在hosts.deny当中的IP与网段则默认为deny,第三列的deny也可省略;

这两个文件的判断依据是:以/etc/hosts.allow 为优先,若分析到的 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全部都挡掉!

这样的话,我可以这样设置:

[root@www ~]# vim /etc/hosts.allow

rsync: 140.116.0.0/255.255.0.0

rsync: 203.71.39.0/255.255.255.0

rsync: 203.71.38.123

rsync: LOCAL

[root@www ~]# vim /etc/hosts.deny

rsync: ALL <==利用 ALL 设置让所有其他来源不可登录

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文件中的。我们将上述的操作写成类似如下:

[root@www ~]# vim /etc/hosts.deny

rsync : ALL: spawn(echo "security notice from host $(/bin/hostname)" ;\

echo; /usr/sbin/safe_finger @%h) | \

/bin/mail -s "%d-%h security" root & \

: twist( /bin/echo -e "\n\nWARNING connection not allowed.\n\n")〓ZW1

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

18.4 系统开启的服务

好了,现在假设你已经知道了daemons的启动文件放置的目录,也知道了服务与port的对应,那么要如何查询目前系统上面已经启动了的服务呢?不要再打混了!已经学过了ps与top应该要会应用才对。没错,可以使用ps与top来查找已经启动了的服务的程序与它的PID呢!不过,我们怎么知道该服务启动的port是哪一个?好问题!可以直接使用netstat这个网络状态查看命令来检查我们的port呢!甚至它也可以帮我们找到该port的进程呢(PID)!这个命令的相关用途我们在第17章程序管理中已经谈过了,不清楚的话请回去查一查先,这里仅介绍如何使用。

18.4.1 查看系统启动的服务

查看系统已启动的服务方式很多,不过,我们最常使用netstat来查看。基本上,以ps来查看整个系统上面的服务是比较妥当的,因为它可以将全部的process都找出来。不过,我们比较关心的还是在于有启动网络监听的服务,所以鸟哥会比较喜欢使用netstat来查阅。

范例一:找出目前系统开启的网络服务有哪些

[root@www ~]# netstat -tulp

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address  Foreign Address State PID/Program name

tcp  0 0 www.vbird.tsai:2208 :   LISTEN 4575/hpiod

tcp  0 0 :737    :*   LISTEN 4371/rpc.statd

tcp  0 0 :sunrpc   :*   LISTEN 4336/portmap

tcp  0 0 www.vbird.tsai:ipp :   LISTEN 4606/cupsd

tcp  0 0 www.vbird.tsai:smtp :   LISTEN 4638/sendmail: acce

tcp  0 0 :ssh    :*   LISTEN 4595/sshd

udp  0 0 :filenet-tms  :*     4755/avahi-daemon:

….(下面省略)….

看一下上面,Local Address 的地方会出现主机名与服务名称的,要记得的是,

可以加上 -n 来显示 port number ,而服务名称与 port 对应则在 /etc/services中

范例二:找出所有的有监听网络的服务 (包含 socket 状态):

[root@www ~]# netstat -lnp

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name

tcp  0 0 127.0.0.1:2208 0.0.0.0:*   LISTEN 4575/hpiod

….(中间省略)….

Active UNIX domain sockets (only servers)

Proto RefCnt Flags Type State I-Node PID/Program name Path

….(中间省略)….

unix 2 [ ACC ] STREAM LISTENING 10624 4701/xfs  /tmp/.font-unix/fs7100

unix 2 [ ACC ] STREAM LISTENING 12824 5015/Xorg  /tmp/.X11-unix/X0

unix 2 [ ACC ] STREAM LISTENING 12770 4932/gdm-binary /tmp/.gdm_socket

….(以下省略)….

仔细瞧一瞧,除了原有的网络监听 port 之外,还会有 socket 显示在上面,

我们可以清楚地知道有哪些服务被启动呢!

范例三:查看所有的服务状态

[root@www ~]# service —status-all

这个命令有趣,本章之前有谈过这命令,自行查询。

利用netstat可以取得很多跟网络有关的服务信息,通过这个命令,我们可以轻易了解到网络的状态,并且可以通过 PID 与 kill 的相关功能,将有问题的数据给他杀掉。当然,要更详细地取得 PPID 的话,才能够完全阻挡有问题的进程!

另外,除了已经存在系统当中的daemon之外,如何在一开机就完整启动我们所需要的服务呢?下面我们就来谈一谈chkconfig及ntsysv这两个好用的东西!

18.4.2 设置开机后立即启动服务的方法

就如同上面提到的,我们使用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的设置进行daemonstart(/etc/rc.d/rc[0-6].d/*);

7.加载本机设置(/etc/rc.d/rc.local)。

关于更多开机流程的详细说明,我们会在第 20 章时再来跟大家说明。由上面的流程你可以看到系统服务在开机时就可以被启动的地方是在第六个步骤,而事实上第六个步骤就是以不同的执行等级调用不同的服务。那么什么叫做执行等级呢?

我们在启动 Linux 系统时,可以进入不同的模式,这模式我们称为执行等级(run level)。不同的执行等级有不同的功能与服务,目前你先知道正常的执行等级有两个,一个是具有X窗口界面的run level 5,另一个则是纯文本界面的 run level 3。由于默认我们是以图形界面登录系统的,因此可以想象得到的是,我们应该是在 run level 5 的环境中。那你怎么知道 run level 5 有哪些服务默认可以启动呢?这就得要使用特殊的命令来查询。

chkconfig:管理系统服务默认开机启动与否

[root@www ~]# chkconfig —list [服务名称]

[root@www ~]# chkconfig [—level [0123456]] [服务名称] [on|off]

参数:

—list :仅将目前的各项服务状态栏显示出来

—level:设置某个服务在该 level 下启动 (on) 或关闭 (off)

范例一:列出目前系统上面所有被 chkconfig 管理的服务

[root@www ~]# chkconfig —list |more

NetworkManager 0:off 1:off 2:off 3:off 4:off 5:off 6:off

acpid  0:off 1:off 2:off 3:on 4:on 5:on 6:off

….(中间省略)….

yum-updatesd 0:off 1:off 2:on 3:on 4:on 5:on 6:off

xinetd based services: <==下面为 super daemon 所管理的服务

chargen-dgram: off

chargen-stream: off

….(下面省略)….

你可以发现上面分为两个块,一个具有 1, 2, 3 等数字,一个则被 xinetd

管理。没错!从这里我们就能够发现服务有 stand alone 与 super daemon 之分。

范例二:显示出目前在 run level 3 为启动的服务

[root@www ~]# chkconfig —list | grep '3:on'

范例三:让 atd 这个服务在 run level 为 3, 4, 5 时启动:

[root@www ~]# chkconfig —level 345 atd on

chkconfig是否很容易管理我们所需要的服务呢?真的很方便啦!你可以轻松地通过chkconfig来管理super daemon的服务。另外,你得要知道的是,chkconfig仅是设置开机时默认会启动的服务而已,所以该服务目前的状态如何是不知道的。我们举个下面的例子来说明好了:

范例四:先查看 httpd ,再查看默认有无启动,之后以 chkconfig 设置为默认启动

[root@www ~]# /etc/init.d/httpd status

httpd 已停止 <==根本就没有启动

[root@www ~]# chkconfig —list httpd

httpd  0:off 1:off 2:off 3:off 4:off 5:off 6:off

原因是默认并没有启动。

[root@www ~]# chkconfig httpd on; chkconfig —list httpd

httpd  0:off 1:off 2:on 3:on 4:on 5:on 6:off

已经设置为“开机默认启动”了,再来查看看看到底该服务启动没。

[root@www ~]# /etc/init.d/httpd status

httpd 已停止

竟然还是没有启动喔!怎么会这样啊?

上面的范例四并没有启动 httpd 的原因很简单,因为我们并没有使用/etc/init.d/httpd start 。我们仅是设置开机时启动而已啊!那我们又没有重新启动,所以当然使用chkconfig并不会导致该服务立即被启动!也不会让该服务立即被关闭,而是只有在开机时才会被加载或取消载入而已。而既然 chkconfig可以设置开机是否启动,那么我们能不能用来管理 super daemon的启动与关闭呢?非常好!我们就来试看看下面的案例:

范例五:查看 rsync 是否启动,若要将其关闭该如何处理?

[root@www ~]# /etc/init.d/rsync status

-bash: /etc/init.d/rsync: No such file or directory

rsync 是 super daemon 管理的,所以当然不可以使用 stand alone 的启动方式来查看

[root@www ~]# netstat -tlup | grep rsync

tcp 0 0 192.168.201.110:rsync : LISTEN 4618/xinetd

tcp 0 0 www.vbird.tsai:rsync : LISTEN 4618/xinetd

[root@www ~]# chkconfig —list rsync

rsync  on <==默认启动呢!将它处理成默认不启动吧!

[root@www ~]# chkconfig rsync off; chkconfig —list rsync

rsync  off <==看吧!关闭了。现在来处理一下 super daemon 。

[root@www ~]# /etc/init.d/xinetd restart; netstat -tlup | grep rsync

最后一个命令你会发现原本 rsync 不见了!这样是否很轻易地就能够启动与关闭你的 super daemon管理的服务呢!

ntsysv:类图形界面管理模式

基本上,chkconfig真的已经很好用了,不过,我们的CentOS还有提供一个更不错的东东,那就是ntsysv了!注意,chkconfig在很多的distributions中都存在,但是ntsysv则是Red Hat系统特有的!

[root@www ~]# ntsysv [—level <levels>]

参数:

—level :后面可以接不同的 run level ,例如 ntsysv —level 35

一般我们都是直接输入ntsysv即可进入管理界面了,整个界面如图18-4所示。

图中的中间部分是每个服务默认开机是否会启动的设置值,若中括号内出现星号(*)代表默认开机会启动,否则就是不会在开机时启动。你可以使用上下键来移动中括号内的光标到你想要更改的那个服务上面,然后按下空格键就能够选取或取消。如果一切都选择完毕后,你可以使用[tab]按键来移动光标到[OK]、[Cancel]等按钮上面,当然,按下[Ok]就是确认你的选取会生效。总结一下上述的按钮功能:

上下键:可以在中间的方框当中,在各个服务之间移动;

空格键:可以用来选择你所需要的服务,前面的[]会有出现;

tab键:可以在方框、OK、Cancel之间移动;

[F1]键:可以显示该服务的说明。

图18-5所示是鸟哥将光标移动到atd这个服务上面后,再按下[F1]所出现的结果,所以,你可以通过ntsysv去查看默认开机启动的服务,还能够查阅该服务的基本功能为何,这样就能够稍微理清一下该服务是否需要存在。这样理解了吧?

figure_0563_0320

图18-4 ntsysv的执行示意图

figure_0563_0321

图18-5 ntsysv 的执行示意图

chkconfig:设置自己的系统服务

[root@www ~]# chkconfig [—add|—del] [服务名称]

参数:

—add :增加一个服务名称给 chkconfig 来管理,该服务名称必须在 /etc/init.d/ 内

—del :删除一个给 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顺序结束。

关于所谓的顺序问题,我们会在第20章介绍,这里你先看看即可。你该如何进行呢?可以这样做:

[root@www ~]# vim /etc/init.d/myvbird

!/bin/bash

chkconfig: 35 80 70

description: 没什么!只是用来作为练习之用的一个范例

echo "Nothing"

这个文件很好玩。你可以参考你自己系统上面的文件;基本上,比较重要的是第二行,它的语法是:“chkconfig: [runlevels] [启动顺序][停止顺序]”。其中,runlevels 为不同的 run level状态,启动顺序(start number)与结束顺序(stop number)则是在/etc/rc.d/rc[35].d 内新建以S80myvbird及K70myvbird为文件名的设置方式!

[root@www ~]# chkconfig —list myvbird

service myvbird supports chkconfig, but is not referenced in any

runlevel (run 'chkconfig —add myvbird')

尚未加入 chkconfig 的管理机制中!所以需要再动点手脚

[root@www ~]# chkconfig —add myvbird; chkconfig —list myvbird

myvbird  0:off 1:off 2:off 3:on 4:off 5:on 6:off

看吧!加入了 chkconfig 的管理当中了!

很有趣吧!如果要将这些数据都删除的话,那么就下达这样的命令:

[root@www ~]# chkconfig —del myvbird

[root@www ~]# rm /etc/init.d/myvbird

chkconfig真的是个不错用的工具吧?尤其是当你想要自己创建自己的服务时。

18.4.3 CentOS 5.x 默认启动的服务简易说明

随着 Linux 上面软件支持性越来越多,加上自由软件蓬勃的发展,我们可以在 Linux 上面用的daemons真的越来越多了。所以,想要写完所有的daemons介绍几乎是不可能的,因此,鸟哥这里仅介绍几个很常见的 daemons 而已,更多的信息呢,就得要麻烦你自己使用 ntsysv 或者是 vi/etc/init.d/*里面的文件去瞧一瞧。下面的建议主要是针对 Linux 单机服务器的角色来说明的,不是台式机的环境喔!如表18-2所示。

表18-2

figure_0564_0322

续表

figure_0565_0323

续表

figure_0566_0324

上面的服务是CentOS 5.x默认有启动的,这些默认启动的服务很多是针对台式机所设计的,所以,如果你的Linux主机用于服务器上面的话,那么有很多服务是可以关闭的。如果你还有某些不明白的服务想要关闭的,请务必要搞清楚该服务的功能。举例来说,那个syslog就不能关闭,如果你关掉它的话,系统就不会记录日志文件,那你的系统所产生的警告信息就无法记录起来,你将无法进行调试。

下面鸟哥继续说明一些可能在你的系统当中的服务,只是默认并没有启动这个服务就是了。只是说明一下,各服务的用途还是需要你自行查询相关的文章,如表18-3所示。

表18-3

figure_0566_0325

18.5 重点回顾

服务(daemon)主要可以分为 stand alone(服务可单独启动)及 super daemon(通过 xinetd统一管理的服务)两种。

super daemon 由于是经过一个统一的 xinetd 来管理,因此可以具有类似防火墙管理功能。此外,管理的连接机制又可以分为multi-threaded及single-threaded。

启动daemon的进程通常最末会加上一个d,例如sshd,vsftpd,httpd等。

stand alone daemon 启动的脚本放置到/etc/init.d/这个目录中,super daemon 的配置文件放在 /etc/xinetd.d/*内,而启动的方式则为/etc/init.d/xientd restart。

立即启动 stand alone daemon 的方法也可以使用 service 这个命令。

super daemon 的配置文件/etc/xinetd.conf,个别 daemon 配置文件则在/etc/xinetd.d/*内。在配置文件内还可以设置连接客户端的连接与否,具有类似防火墙的功能。

若想要统一管理防火墙的功能,可以通过/etc/hosts.{allow,deny},若安装 TCP Wrappers 时,还能够使用额外的spawn功能等。

若想要设置开机时启动某个服务时,可以通过chkconfig,ntsysv等命令。

一些不需要的服务可以关闭。

18.6 本章习题

情境模拟题一

通过安装、设置、启动、查看与管理防火墙等机制,完整了解一个服务的启动与查看现象。

目标:了解 daemon 的管理机制,以 super daemon 为例;

前提:需要对本章已经了解,尤其是 super daemno 部分;

需求:最好已经连上Internet,因为会动用到安装软件。

在本情境中,我们使用 telnet 这个服务来查看,假设最终我们只开放.edu.cn 的网段来使用本机的telnet服务,可以这样做看看:

1.先看看telnet服务器有没有安装。telnet服务器在CentOS上面指的是telnet-server这个程序,所以可以这样看看:

[root@www ~]# rpm -q telnet-server

package telnet-server is not installed

[root@www ~]# yum install telnet-server

==============================================================

Package  Arch Version  Repository Size

==============================================================

Installing:

telnet-server i386 1:0.17-39.el5 base  35 k

Transaction Summary

==============================================================

Install 1 Package(s)

Update  0 Package(s)

Remove  0 Package(s)

Total download size: 35 k

Is this ok [y/N]: y

Downloading Packages:

telnet-server-0.17-39.el5.i386.rpm  | 35 kB 00:00

warning: rpmts_HdrFromFdno: Header V3 DSA signature: NOKEY, key ID e8562897

Importing GPG key 0xE8562897 "CentOS-5 Key (CentOS 5 Official Signing Key)

<centos-5-key@centos.org>" from /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5

Is this ok [y/N]: y

Running rpm_check_debug

Running Transaction Test

Finished Transaction Test

Transaction Test Succeeded

Running Transaction

Installing : telnet-server  [1/1]

Installed: telnet-server.i386 1:0.17-39.el5

Complete!

2.如果已经安装了,那么直接来查看一下配置文件,看看telnet是stand alone还是super daemon。最简单的方法就是chkconfig了!

[root@www ~]# chkconfig —list telnet

telnet  off <==只有 on 或 off 者为 super daemon

[root@www ~]# ll /etc/xinetd.d/telnet

-rw-r—r— 1 root root 305 Dec 1 2007 /etc/xinetd.d/telnet

看吧!果然是 super daemon 哩!

[root@www ~]# grep '^telnet' /etc/services

telnet  23/tcp

telnet  23/udp

由上面可以看到,telnet 是 super daemon,而启动的端口在 port 23 这个地方。

3.如果要启动的话,可以这样来处理:

[root@www ~]# chkconfig telnet on; chkconfig —list telnet

telnet  on

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

正在停止 xinetd:     [ 确定 ]

正在激活 xinetd:     [ 确定 ]

[root@www ~]# netstat -tlnp | grep xinetd

tcp 0 0 0.0.0.0:23 0.0.0.0:* LISTEN 2487/xinetd

确认一下,确实有启动 port 23 。

4 .现在假设我们仅要针对.edu.tw 来开放,至于其他的来源则予以关闭。我们这里选择/etc/hosts.{allow,deny}来处理,你必须要这样做:

1. 先找到 telnet 的主程序是哪一个

[root@www ~]# grep server /etc/xinetd.d/telnet

server   = /usr/sbin/in.telnetd

2. 开始指定开放的网段:

[root@www ~]# vim /etc/hosts.allow

in.telnetd : .edu.tw

[root@www ~]# vim /etc/hosts.deny

in.telnetd: ALL

简单!搞定!

简答题部分

使用 netstat -tul 与 netstat -tunl 有什么差异?为何会这样?

你能否找出来启动 port 3306 这个端口的服务是什么?

你可以通过哪些命令查询到目前系统默认开机会启动的服务?

承上,那么哪些服务目前是在启动的状态?

利用 tcp wrappers 与 xinetd,可以使用哪两个文件进行网络防火墙的管理?

18.7 参考数据与扩展阅读

注 1:高级电源管理接口设置(Advanced Configuration and Power Interface,ACPI)官网http://acpid.sourceforge.net/

注2:Zeroconf自动网络管理机制http://www.zeroconf.org/

注3:桌面计算机的自动硬件检测服务http://www.freedesktop.org/wiki/Software/hal

注4:CPU微指令集加载服务的说明http://www.urbanmyth.org/microcode/