第十八章、认识系统服务 (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 的名称、第二栏为该 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 ,至于那个 里面的内容,则与 /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
(单一用户来源)
  • 配置值:[一个数字或 UNLIMITED]
如果想要控制每个来源 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 则没有此项功能喔!


  • 配置文件语法

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

 :  : 
<服务   (亦即程序名称)> :  : < 动作 >
# 上头的 < > 是不存在于配置文件中的喔!

重点是两个,第一个是找出你想要管理的那个程序的文件名,第二个才是写下来你想要放行或者是抵挡的 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 ]
选项与参数:
--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/xinetd 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) 
      " 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 都可以查阅的到!
  • 承上,那么哪些服务『目前』是在启动的状态?
    可以透过 service --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:加入情境模拟,并且修订课后练习题的部分了。