鸟哥的 Linux 私房菜
Linux 基础篇 | Linux 服务器篇 | Linux 企业应用篇 | 安全管理
     
 
第十八章、认识系统服务 (daemons)
最近更新日期:2009/09/14
在 Unix-Like 的系统中,你会常常听到 daemon 这个字眼!那么什么是传说中的 daemon 呢?这些 daemon 放在什么地方?他的功能是什么?该如何启动这些 daemon ?又如何有效的将这些 daemon 管理妥当?此外,要如何视察这些 daemon 开了多少个 ports ?又这些 ports 要如何关闭?还有还有,晓得你系统的这些 port 各代表的是什么服务吗? 这些都是最基础需要注意的呢!尤其是在搭建网站之前,这里的观念就显的更重要了。


大标题的图示什么是 daemon 与服务 (service)

我们在第十七章就曾经谈过‘服务’这东西! 当时的说明是‘常驻在记体体中的程序,且可以提供一些系统或网络功能,那就是服务’。而服务一般的英文说法是‘ service ’。

但如果你常常上网去查看一些资料的话,尤其是 Unix-Like 的相关作业系统,应该常常看到‘请启动某某 daemon 来提供某某功能’,唔!那么 daemon 与 service 有关啰?否则为什么都能够提供某些系统或网络功能?此外,这个 daemon 是什么东西呀? daemon 的字面上的意思就是‘守护神、恶魔?’还真是有点奇怪呦!^_^""!

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

Tips:
你不必去区分什么是 daemon 与 service !事实上,你可以将这两者视为相同!因为达成某个服务是需要一支 daemon 在背景中运作, 没有这支 daemon 就不会有 service !所以不需要分的太清楚啦!
鸟哥的图示

一般来说,当我们以文字模式或图形模式 (非单人维护模式) 完整开机进入 Linux 主机后, 系统已经提供我们很多的服务了!包括列印服务、工作排程服务、邮件管理服务等等; 那么这些服务是如何被启动的?他们的工作型态如何?底下我们就来谈一谈啰!


小标题的图示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 的运作示意图
图 1.1.1、Super daemon 的运作示意图

如上所示,Super daemon 是常驻在记忆体中的, Program 1, 2, 3 则是启动某些服务的程序 (未被启动状态)。当有用户端的要求时, Super daemon 才会去触发相关的程序载入成为 daemon 而存在于记忆体中,此时,用户端的要求才会被 Super daemon 导向 Daemon 1 去达成连线!当用户端的要求结束时,Daemon 1 将会被移除,图中实线的连线就会中断啰!


  • 窗口类型的解说

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

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

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

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

    在银行里面假设还有另外一种复合型态的统一窗口,同时提供转帐、资金调度、提款等等的业务,那当你需要其中一项业务的时候, 就需要前往该窗口。但是坐在窗口的这个营业员,拿到你的需求单之后,往后面一丢‘喂!那个转帐的仁兄!该你的工作了’ 那么那个仁兄就开始工作去!然而里头还有资金调度与提款等负责业务的仁兄呢?他们在干嘛?嘿嘿!看看报、喝喝茶啰!

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

    • multi-threaded (多重执行绪):
      就是我们提到的,全部的客户之要求都给他拿来,一次给他交办下去,所以一个服务同时会负责好几个程序。

    • single-threaded (单一执行绪)
      这个就是目前我们‘人类的银行’最常见的方式啦,不论如何,反正一个一个来,第一个没有处理完之前,后面的请排队!嘿嘿! 所以如果 client 的要求突然大增的话,那么这些晚到的 client 可得等上一等!

    单执行与多重执行的 super daemon 运作方式
    图 1.1.2、单执行与多重执行的 super daemon 运作方式

    如上所示,左侧为多重执行的方式, 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 的程序啰!


小标题的图示服务与端口的对应

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

玩过网际网络 (Internet) 的朋友应该知道 IP 这玩意儿,大家都说 IP 就是代表你的主机在网际网络上面的‘门牌号码’。 但是你的主机总是可以提供非常多的网络服务而不止一项功能而已,但我们仅有一个 IP 呢!当用户端连线过来我们的主机时, 我们主机是如何分辨不同的服务要求呢?那就是透过埠号 (port number) 啦!埠号简单的想像,他就是你家门牌上面的第几层楼! 这个 IP 与 port 就是网际网络连线的最重要机制之一啰。我们拿底下的网址来说明:

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

port 与 daemon 的对应
图 1.2.1、 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 !就是这样啊!

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

小标题的图示daemon 的启动脚本与启动方式

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

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

OK!那么这些 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 这个登录档启动脚本来进行说明:

[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 就知道为啥了! ^_^

Tips:
事实上,在 Linux 系统中,要‘开或关某个 port ’,就是需要‘ 启动或关闭某个服务’啦!因此,你可以找出某个 port 对应的服务,程序对应的服务, 进而启动或关闭他,那么那个经由该服务而启动的 port ,自然就会关掉了!
鸟哥的图示

  • Super daemon 的启动方式

其实 Super daemon 本身也是一支 stand alone 的服务,看图 1.1.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 嘛!
# 若有疑问,一定要去看看图 1.1.1 才行!

也就是说,你先修改 /etc/xinetd.d/ 底下的设定档,然后再重新启动 xinetd 就对了!而 xinetd 是一个 stand alone 启动的服务!这部份得要特别留意呢!


大标题的图示解析 super daemon 的设定档

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

既然这家伙这么重要,那么底下我们就来谈谈 xinetd 这个服务的预设设定档 /etc/xinetd.conf ,以及各个设定项目的意义啰!


小标题的图示预设值设定档: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 !

attribute (功能)说明与范例
一般设定项目:服务的识别、启动与程序
disable
(启动与否)
  • 设定值:[yes|no],预设 disable = yes
disable 为取消的意思,此值可设定该服务是否要启动。预设所有的 super daemon 管理的服务都不启动的。 若要启动就得要设定为‘ disable = no ’
id
(服务识别)
  • 设定值:[服务的名称]
虽然服务在设定档开头‘ service 服务名称’已经指定了,不过有时后会有重复的设定值,此时可以用 id 来取代服务名称。 你可以参考一下 /etc/xinetd.d/time-stream 来思考一下原理。
server
(程序档名)
  • 设定值:[program 的完整档名]
这个就是指出这个服务的启动程序!例如 /usr/bin/rsync 为启动 rsync 服务的指令,所以这个设定值就会成为: ‘ server = /usr/bin/rsync ’
server_args
(程序参数)
  • 设定值:[程序相关的参数]
这里应该输入的就是你的 server 那里需要输入的一些参数啦!例如 rsync 需要加入 --daemon , 所以这里就设定:‘ server_args = --daemon ’。与上面 server 搭配,最终启动服务的方式‘/usr/bin/rsync --daemon’
user
(服务所属UID)
  • 设定值:[使用者帐号]
如果 xinetd 是以 root 的身份启动来管理的,那么这个项目可以设定为其他使用者。此时这个 daemon 将会以此设定值指定的身份来启动该服务的程序喔!举例来说,你启动 rsync 时会以这个设定值作为该程序的 UID。
group 跟 user 的意思相同!此项目填入群组名称即可。
一般设定项目:连线方式与连线封包协定
socket_type
(封包类型)
  • 设定值:[stream|dgram|raw],与封包有关
stream 为连线机制较为可靠的 TCP 封包,若为 UDP 封包则使用 dgram 机制。raw 代表 server 需要与 IP 直接对谈!举例来说 rsync 使用 TCP ,故设定为‘socket_type = stream ’
protocol
(封包类型)
  • 设定值:[tcp|udp],通常使用 socket_type 取代此设定
使用的网络通讯协定,需参考 /etc/protocols 内的通讯协定,一般使用 tcp 或 udp。由于与 socket_type 重复, 因此这个项目可以不指定。
wait
(连线机制)
  • 设定值:[yes(single)|no(multi)],预设 wait = no
这就是我们刚刚提到的 Multi-threadedsingle-threaded !一般来说,我们希望大家的要求都可以同时被启用,所以可以设定‘ wait = no ’ 此外,一般 udp 设定为 yes 而 tcp 设定为 no。
instances
(最大连线数)
  • 设定值:[数字或 UNLIMITED]
这个服务可接受的最大连线数量。如果你只想要开放 30 个人连线 rsync 时,可在设定档内加入:‘ instances = 30 ’
per_source
(单一用户来源)
  • 设定值:[一个数字或 NULIMITED]
如果想要控制每个来源 IP 仅能有一个最大的同时连线数,就指定这个项目吧!例如同一个 IP 最多只能连 10 条连线‘ per_source = 10 ’
cps
(新连线限制)
  • 设定值:[两个数字]
为了避免短时间内大量的连线要求导致系统出现忙碌的状态而有这个 cps 的设定值。第一个数字为一秒内能够接受的最多新连线要求, 第二个数字则为,若超过第一个数字那暂时关闭该服务的秒数。
一般设定项目:登录档的记录
log_type
(登录档类型)
  • 设定值:[登录项目 等级]
当资料记录时,以什么登录项目记载?且需要记载的等级为何(预设为 info 等级)。这两个设定值得要看过下一章登录档后才会知道哩!这边你先有印象即可。
log_on_success
log_on_failure
(登录状态)
  • 设定值:[PID,HOST,USERID,EXIT,DURATION]
在‘成功登入’或‘失败登入’之后,需要记录的项目:PID 为纪录该 server 启动时候的 process ID , HOST 为远端主机的 IP、USERID 为登入者的帐号、EXIT 为离开的时候记录的项目、DURATION 为该使用者使用此服务多久?
进阶设定项目:环境、网络端口与连线机制等
env
(额外变数设定)
  • 设定值:[变数名称=变数内容]
这一个项目可以让你设定环境变数,环境变数的设定规则可以参考第十一章
port
(非正规埠号)
  • 设定值:[一组数字(小于 65534)]
这里可以设定不同的服务与对应的 port ,但是请记住你的 port 与服务名称必须与 /etc/services 内记载的相同才行!不过,若服务名称是你自订的,那么这个 port 就可以随你指定
redirect
(服务转址)
  • 设定值:[IP port]
将 client 端对我们 server 的要求,转到另一台主机上去!呵呵!这个好玩呦! 例如当有人要使用你的 ftp 时,你可以将他转到另一台机器上面去!那个 IP_Address 就代表另一台远端主机的 IP 啰!
includedir
(呼叫外部设定)
  • 设定值:[目录名称]
表示将某个目录底下的所有文件都给他塞进来 xinetd.conf 这个设定里头!这东西有用多了, 如此一来我们可以一个一个设定不同的项目!而不需要将所有的服务都写在 xinetd.conf 当中!你可以在 /etc/xinetd.conf 发现这个设定呦!
安全管理项目:
bind
(服务介面锁定)
  • 设定值:[IP]
这个是设定‘允许使用此一服务的介面卡’的意思!举个例子来说,你的 Linux 主机上面有两个 IP ,而你只想要让 IP1 可以使用此一服务,但 IP2 不能使用此服务,这里就可以将 IP1 写入即可!那么 IP2 就不可以使用此一 server 啰
interface
  • 设定值:[IP]
与 bind 相同
only_from
(防火墙机制)
  • 设定值:[0.0.0.0, 192.168.1.0/24, hostname, domainname]
这东西用在安全机制上面,也就是管制‘只有这里面规定的 IP 或者是主机名称可以登入!’如果是 0.0.0.0 表示所有的 PC 皆可登入,如果是 192.168.1.0/24 则表示为 C class 的网络!亦即由 192.168.1.1 ~ 192.168.1.255 皆可登入!另外,也可以选择 domain name ,例如 .dic.ksu.edu.tw 就可以允许昆山资传系网络的 IP 登入你的主机使用该 server !
no_access
(防火墙机制)
  • 设定值:[0.0.0.0, 192.168.1.0/24, hostname, domainname]
跟 only_from 差不多啦!就是用来管理可否进入你的 Linux 主机启用你的 server 服务的管理项目! no_access 表示‘不可登入’的 PC 啰!
access_times
(时间管理)
  • 设定值:[00:00-12:00, HH:MM-HH:MM]
这个项目在设定‘该服务 server 启动的时间’,使用的是 24 小时的设定!例如你的 ftp 要在 8 点到 16 点开放的话,就是: 08:00-16:00。
umask
  • 设定值:[000, 777, 022]
还记得在第七章提到的 umask 这个东西吗?呵呵!没错! 就是那个鬼玩意儿啰!可以设定使用者建立目录或者是文件时候的属性!系统建议值是 022 。

OK!我们就利用上面这些参数来架构出我们所需要的一些服务的设定吧!参考看看底下的设定方法啰! ^_^


小标题的图示一个简单的 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.tw 网络可以登入;
    • 开放的时间为早上 1-9 点以及晚上 20-24 点两个时段;
    • 最多允许 10 条同时连线的限制。
Tips:
有资讯背景的朋友当然知道 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 的设定,一段针对内部网络一段针对外部网络, 如果设计完毕你将他重新启动后,就会出现如下的状态喔!

# 0. 先看看原本的 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 这个全域网络监听而已哩!

# 1. 重新启动 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 的喔!更多的设定资料就有待您自己的理解了。


大标题的图示服务的防火墙管理 xinetd, TCP Wrappers

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


小标题的图示/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} 来处理啰。换个方式来说,只要不支援 TCP Wrappers 函式功能的软件程序就无法使用 /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 写在这哩,内容有点像这样:

Tips:
关于 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 亦可省略;
  • 这两个文件的判断依据是: (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 全部都挡掉!
这样的话,我可以这样设定:
[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 设定让所有其他来源不可登入

小标题的图示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" )

上面其实是针对一个 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 ( 或者是你自己的信箱 )那里去!


大标题的图示系统开启的服务

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


小标题的图示观察系统启动的服务

观察系统已启动的服务方式很多,不过,我们最常使用 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 这两个好用的东西!


小标题的图示设定开机后立即启动服务的方法

就如同上面提到的,我们使用 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: 管理系统服务预设开机启动与否
[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 即可进入管理画面了,整个画面如下图所示:

ntsysv 的执行示意图
图 4.2.1、 ntsysv 的执行示意图

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

  • 上下键: 可以在中间的方框当中,在各个服务之间移动;
  • 空白键: 可以用来选择你所需要的服务,前面的 [*] 会有 * 出现;
  • tab 键: 可以在方框、OK、Cancel 之间移动;
  • [F1]键: 可以显示该服务的说明
ntsysv 的执行示意图
图 4.2.2、 ntsysv 的执行示意图

上图是鸟哥将游标游动到 atd 这个服务上头后,再按下 [F1] 所出现的结果,所以啰,你可以透过 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 顺位结束。

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

[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 真的是个不错用的工具吧!尤其是当你想要自己建立自己的服务时! ^_^


小标题的图示CentOS 5.x 预设启动的服务简易说明

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

CentOS 5.x 预设启动的服务内容
服务名称功能简介
acpid(系统)进阶电源管理的介面,这是一个新的电源管理模组, 可以监听来自核心层的电源相关事件而予以回应。 CentOS 的设定档在 /etc/acpi/events/power.conf 中,预设仅有当你按下 power 按钮时,系统会自动关机喔!(注1)
anacron
(可关闭)
(系统)与循环型的工作排程 cron 有关,可在排程过期后还可以唤醒来继续执行, 设定档在 /etc/anacrontab。详情请参考第十六章的说明。
apmd
(可关闭)
(系统)设定档在 /etc/sysconfig/apmd ,也是电源管理模组啦! 可探测电池电量,当电池电力不足时,可以自动关机以保护电脑主机。
atd(系统)单一的例行性工作排程,详细说明请参考第十六章。 抵挡机制的设定档在 /etc/at.{allow,deny} 喔!
auditd(系统)还记得前一章的 SELinux 所需服务吧? 这就是其中一项,可以让系统需 SELinux 稽核的讯息写入 /var/log/audit/audit.log 中。若此服务没有启动,则讯息会传给 syslog 管理。
autofs
(可关闭)
(系统)可用来自动挂载来自网络上的其他服务器所提供的网络磁碟机 (一般是 NFS)。 不过我们是单机系统,所以目前还没必要这个服务。
avahi-daemon
(可关闭)
(系统)也是一个用户端的服务,可以透过 Zeroconf 自动的分析与管理网络。 Zeroconf 较常用在笔记型电脑与行动装置上,所以我们可以先关闭他啦!(注2)
bluetooth
(可关闭)
(系统)用在蓝芽装置的搜寻上,如果 Linux 是当作服务器使用时, 这个服务可以暂时关闭也没关系!
cpuspeed(系统)可以用来管理 CPU 的频率功能。若系统闲置时,此项功能可以自动的降低 CPU 频率来节省电量与降低 CPU 温度喔!
crond(系统)系统设定档为 /etc/crontab,详细资料可参考第十六章的说明。
cups
(可关闭)
(网络)用来管理印表机的服务,可以提供网络连线的功能,有点类似列印服务器的功能哩! 你可以在 Linux 本机上面以浏览器的 http://localhost:631 来管理印表机喔!由于我们目前没有印表机,所以可以暂时关闭他。
firstboot
(可关闭)
(系统)还记得系统第一次进入图形介面还需要进行一些额外的设定吗? 就是这个服务的帮忙啦!既然已经安装妥当,现在你可以将这个服务关闭啰。
gpm(系统)在 tty1~tty6 的环境下你竟然可以使用滑鼠功能来复制贴上,就是这个 gpm 提供的能力啦!
haldaemon
(可关闭)
(系统)通常用在桌上型电脑的环境中,可探测类似 usb 的装置呢! 不过,如果是服务器环境,这个服务倒是可以关闭啦!如果是桌上型电脑,那最好可以启动啰!(注3)
hidd
(可关闭)
(系统)也是蓝芽服务的功能啦!可以提供键盘、滑鼠等蓝芽装置的探测哩! 须搭配 bluetooth。服务器环境倒是不需要此项服务。
hplip
(可关闭)
(系统)主要是针对 HP 的印表机功能所开发的脚本服务,如果你的环境中并没有 HP 相关设备,这个服务就给他关闭吧!
ip6tables
(可关闭)
(网络)是针对本机的防火墙功能!这个防火墙主要是针对 IPv6 的版本, 如果你的网络环境并没有 IPv6 的设备,那么这个服务是可以关闭的。
iptables(网络)本机防火墙功能,是核心支援的呢!所以功能与效能都非常棒!当然不能够取消啊! 只是设定上就得要努力研究啦!我们会在服务器篇介绍网络相关资讯的。
irqbalance(系统)如果你的系统是多核心的硬体,那么这个服务要启动, 因为它可以自动的分配系统中断 (IRQ) 之类的硬体资源。
isdn
(可关闭)
(网络)ISDN 是一种宽频设备 (数据机的一种) ,但是在台湾我们比较常使用 ADSL 及光纤设备, 所以这个服务是可以关闭啦。
kudzu
(可关闭)
(系统)如果你有增加新的硬体时,这个服务可以在开机时自动的探测硬体, 并且会自动的呼叫相关的设定软件,方便你在开机时就处理好你的硬体啊!
lm_sensors
(可关闭)
(系统)这个服务可以帮你探测主机板的相关探测晶片,举例来说, 某些主机板会主动的探测 CPU 温度、频率、电压等,这个 lm_sensors 能够将这些温度、频率等数据显示出来喔! 我们会在第二十一章谈这玩意儿。
lvm2-monitor(系统)我们已经谈过 LVM 啰!所以我们当然要启动这个服务比较妥当。
mcstrans(系统)与 SELinux 有关的服务,最好也启动啊!
mdmonitor
(可关闭)
(系统)可以探测所有软件的状态,暂时似乎也不需要启动这个服务哩!
messagebus
(可关闭)
(系统)可用来沟通各个软件之间的讯息,有点类似剪贴簿的感觉。 不过在服务器环境则没有强烈需求就是了。
microcode_ctl
(可关闭)
(系统)Intel 的 CPU 会提供一个外挂的微指令集提供系统运作, 不过,如果你没有下载 Intel 相关的指令集文件,那么这个服务不需要启动的,也不会影响系统运作。(注4)
netfs
(可关闭)
(网络)可以进行网络磁碟机 (NFS, SMB/CIFS) 的挂载与卸载功能。 目前我们尚未使用网络,因此这个服务可以先关闭。
network(网络)提供网络设定的功能,所以一定要启动的啦!
nfslock
(可关闭)
(网络)NFS 为一种 Unix like 的网络磁碟机,但在进行文件的分享时, 为了担心同一文件多重编辑的问题,所以会有这个锁住 (lock) 的服务!可以避免同一个文件被两个不同的人编辑时所造成的文件错误问题。
pcscd
(可关闭)
(系统)智慧卡探测的服务,可以关闭他啦。
portmap(网络)用在远端程序呼叫的服务,很多服务都使用这个玩意儿来辅助连线的, 因此建议不要取消他,除非你确定你的系统没有使用到任何的 RPC 服务喔!
readahead_early
readahead_later
(可关闭)
(系统)在系统开机的时候可以先将某些程序载入到记忆体中,以方便快速的载入, 可加快一些启动的速度。
restorecond(系统)利用 /etc/selinux/restorecond.conf 的设定来判断当新建文件时,该文件的 SELinux 类型应该如何还原。需要注意的是,如果你的系统有很多非正规的 SELinux 文件类型设定时,这个 daemon 最好关闭,否则他会将你设定的 type 修改回预设值。
rpcgssd
rpcidmapd
(可关闭)
(网络)与 NFS 有关的用户端功能,在你还没有玩到网络阶段时, 这两个咚咚也能够先取消啦!
sendmail(网络)这就是电子邮件的软件啊!我们想要拥有可寄信的功能时, 这个服务可不能关闭。不过,预设这个服务仅能支援本机的功能,无法收受来自网际网络的邮件喔!
setroubleshoot(系统)一定要启动啊!因为这玩意儿可以将你的 SELinux 相关讯息记录在 /var/log/messages 里面,非常有帮助喔!
smartd(系统)这个服务可以自动的探测硬碟状态,如果硬碟发生问题的话, 还能够自动的回报给系统管理员,是个非常有帮助的服务喔!不可关闭他啊!
sshd(网络)这个是远端连线服务器的软件功能, 这个通讯协定比 telnet 好的地方在于 sshd 在传送资料时可以进行加密喔!这个服务不要关闭他啦!
syslog(系统)这个服务可以记录系统所产生的各项讯息, 包括 /var/log/messages 内的几个重要的登录档啊。
xfs
(可关闭)
(系统)这个是 X Font Server,主要提供图形介面的字型的一个服务, 如果你不启动 X 视窗的话,那么这个服务可以启动。但是如果你有需要用到 X 时,一定要启动这玩意儿,否则图形介面是无法启动的喔。
xinetd(系统)就是 super daemon 啊,不必讲了吧 ^_^
yum-updatesd(系统)可以透过 yum 的功能进行软件的线上升级机制, 若有升级的软件释出时,就能够以邮件或者是 syslog 来通知系统管理原来手动升级啊。

上面的服务是 CentOS 5.x 预设有启动的,这些预设启动的服务很多是针对桌上型电脑所设计的,所以啰,如果你的 Linux 主机用途是在服务器上面的话,那么有很多服务是可以关闭的啦!如果你还有某些不明白的服务想要关闭的, 请务必要搞清楚该服务的功能为何喔!举例来说,那个 syslog 就不能关闭,如果你关掉他的话,系统就不会记录登录档, 那你的系统所产生的警告讯息就无法记录起来,你将无法进行 debug 喔。

底下鸟哥继续说明一些可能在你的系统当中的服务,只是预设并没有启动这个服务就是了。只是说明一下, 各服务的用途还是需要您自行查询相关的文章啰。

其他服务的简易说明
服务名称功能简介
dovecot(网络)可以设定 POP3/IMAP 等收受信件的服务,如果你的 Linux 主机是 email server 才需要这个服务,否则不需要启动他啦!
httpd(网络)这个服务可以让你的 Linux 服务器成为 www server 喔!
named(网络)这是领域名称服务器 (Domain Name System) 的服务, 这个服务非常重要,但是设定非常困难!目前应该不需要这个服务啦!
nfs(网络)这就是 Network Filesystem,是 Unix-Like 之间互相作为网络磁碟机的一个功能。
ntpd(网络)服务的全名是 Network Time Protocol ,这个服务可以用来进行网络校时, 让你系统的时间永远都是正确的哩!
smb(网络)这个服务可以让 Linux 模拟成为 Windows 上面的网络上的芳邻。 如果你的 Linux 主机想要做为 Windows 用户端的网络磁碟机服务器,这玩意儿得要好好玩一玩。
squid(网络)作为代理服务器的一个服务,可作为一个区域网络的防火墙之用。
vsftpd(网络)作为文件传输服务器 (FTP) 的服务。

大标题的图示重点回顾
  • 服务 (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 等指令。
  • 一些不需要的服务可以关闭喔!

大标题的图示本章习题
( 要看答案请将滑鼠移动到‘答:’底下的空白处,按下左键圈选空白处即可察看 )
  • 情境模拟题一:透过安装、设定、启动、观察与管理防火墙等机制,完整的了解一个服务的启动与观察现象。

    • 目标:了解 daemon 的管理机制,以 super daemon 为例;
    • 前提:需要对本章已经了解,尤其是 super daemno 部分;
    • 需求:最好已经连上 Internet ,因为会动用到安装软件

    在本情境中,我们使用 telnet 这个服务来观察,假设最终我们只开放 .edu.tw 的网络来使用本机的 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 有什么差异?为何会这样?
    使用 n 时, netstat 就不会使用主机名称与服务名称 (hostname & service_name) 来显示, 取而代之的则是以 IP 及 port number 来显示的。IP 的分析与 /etc/hosts 及 /etc/resolv.conf 有关, 这个在未来服务器篇才会提到。至于 port number 则与 /etc/services 有关,请自行参考喔! ^_^
  • 你能否找出来,启动 port 3306 这个端口的服务为何?
    透过搜寻 /etc/services 内容,得到 port 3306 为 mysql 所启动的端口喔!查询 google, 可得到 mysql 为一种网络资料库系统软件。
  • 你可以透过哪些指令查询到目前系统预设开机会启动的服务?
    本章提到的 chkconfig 以及 ntsysv 都可以查阅的到!
  • 承上,那么哪些服务‘目前’是在启动的状态?
    可以透过 services --status-all,或者是透过 netstat -anl 等方式。也可以透过 pstree 去查询喔! 只是相关对应的服务 daemon 档名就得要个别查询了。
  • tcp wrappers 软件功能与 xinetd 的功能中,可以使用哪两个文件进行网络防火墙的管理?
    /etc/hosts.{allow,deny}

大标题的图示参考资料与延伸阅读

2002/07/10:第一次完成
2003/02/11:重新编排与加入 FAQ
2005/10/03:将原本旧版的资料移动到 此处
2005/10/12:经过一段时间的修订,将原本在 系统设定工具 的内容移动到此,并新增完毕!
2009/03/25:将原本旧的基于 FC4 的资料移动到此处
2009/04/02:加入一些预设启动的服务说明。
2009/09/14:加入情境模拟,并且修订课后练习题的部分了。



 
     
中国存储网 ChinaStor.com排版整理
原文作者鸟哥,主页,更多Linux学习资料在线看:Linux系统管理员手册 - Linux命令大全 - Linux调用大全- Linux专栏 - 国产Linux