Linux 中的服务脚本管理与编写

校睿宝培训机构ERP,学员课时管理软件
实验预约管理软件,实验室管理软件,大学、高校实验预约平台
网站日志分析软件,网站访问日志在线分析
哲涛服务器监控软件,IT运维管理软件,CPU、内存、磁盘监控软件
在Unix-Like 的系统中,你会常常听到daemon 这个字眼! 那么什么是传说中的daemon 呢? 这些daemon 放在什么地方? 他的功能是什么? 该如何启动这些daemon ? 又如何有效的将这些daemon 管理妥当? 此外,要如何视察这些daemon 开了多少个ports ? 又这些ports 要如何关闭? 还有还有,晓得你系统的这些port 各代表的是什么服务吗? 这些都是最基础需要注意的呢! 尤其是在架设网站之前,这里的观念就显的更重要了。

1. 什么是daemon与服务(service) 
1.1 daemon的主要分类 : stand alone , super daemon , 工作形态 , 命名规则 
1.2 服务与埠口的对应 : /etc/services 
1.3 daemon的启动脚本与启动方式 : 设定档 , stand alone , service , super daemon 
2. 解析super daemon的设定档 
2.1 预设值设定档:xinetd.conf : 重要参数说明 
2.2 一个简单的rsync范例设定 
3. 服务的防火墙管理xinetd, TCP Wrappers 
3.1 /etc/hosts.allow, /etc/hosts.deny管理 : ldd , 设定档语法 
3.2 TCP Wrappers特殊功能 
4. 系统开启的服务 
4.1 观察系统启动的服务 
4.2 设定开机后立即启动服务的方法 : chkconfig , ntsysv 
4.3 CentOS 5.x预设启动的服务简易说明 
5. 重点回顾 
6. 本章习题 
7. 参考资料与延伸阅读 
8. 针对本文的建议:http://phorum.vbird.org/viewtopic.php?t=23894

大标题的图示 什么是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 的命名规则

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


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

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

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

  • http://ftp.isu.edu.tw/
  • ftp://ftp.isu.edu.tw/

有没有发现,两个网址都是指向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 
(单一用户来源)
  • 设定值:[一个数字或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 
(服务转址)
  • 设定值:
将client 端对我们server 的要求,转到另一部主机上去! 呵呵! 这个好玩呦! 例如当有人要使用你的ftp 时,你可以将他转到另一部机器上面去! 那个IP_Address 就代表另一部远端主机的IP 啰!
includedir 
(呼叫外部设定)
  • 设定值:[目录名称]
表示将某个目录底下的所有档案都给他塞进来xinetd.conf 这个设定里头! 这东西有用多了, 如此一来我们可以一个一个设定不同的项目! 而不需要将所有的服务都写在xinetd.conf 当中! 你可以在/etc/xinetd.conf 发现这个设定呦!
安全控管项目:
bind 
(服务介面锁定)
  • 设定值:
这个是设定『允许使用此一服务的介面卡』的意思! 举个例子来说,你的Linux 主机上面有两个IP ,而你只想要让IP1 可以使用此一服务,但IP2 不能使用此服务,这里就可以将IP1 写入即可! 那么IP2 就不可以使用此一server 啰
interface
  • 设定值:
与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 则更容易集中控管,在设定与查询方面也较为方便! 那么就让我们谈谈这两个档案的设定技巧吧!

其实/e​​tc/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/xinetd restart
  • 立即启动stand alone daemon 的方法亦可以使用service 这个指令
  • Super daemon 的设定档/etc/xinetd.conf ,个别daemon 设定档则在/etc/xinetd.d/* 内。 在设定档内还可以设定连线用户端的连线与否, 具有类似防火墙的功能喔。
  • 若想要统一管理防火墙的功能,可以透过/etc/hosts.{allow,deny} ,若有安装TCP Wrappers 时,还能够使用额外的spaw​​n 功能等
  • 若想要设定开机时启动某个服务时,可以透过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 都可以查阅的到!
  • 承上,那么哪些服务『目前』是在启动的状态?
    可以透过service --status-all,或者是透过netstat -anl 等方式。 也可以透过pstree 去查询喔! 只是相关对应的服务daemon 档名就得要个别查询了。
  • tcp wrappers 软体功能与xinetd 的功能中,可以使用哪两个档案进行网路防火墙的控管?
    /etc/hosts.{allow,deny}

大标题的图示 参考资料与延伸阅读 
  •  注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/
校睿宝培训机构ERP,学员课时管理软件
实验预约管理软件,实验室管理软件,大学、高校实验预约平台
网站日志分析软件,网站访问日志在线分析
哲涛服务器监控软件,IT运维管理软件,CPU、内存、磁盘监控软件

上海哲涛网络科技有限公司版权所有 © 2005-2023       沪ICP备06058430号-1

沪公网安备 31011302000898号

点我咨询