Linux (系统服务守护程序)

1、守护程序与服务

简单来说,可以将服务与守护程序视作相同的东西,就是在后台中执行的程序,可以提供某些功能。

2、守护进程的主要分类

根据启动与管理方式,可以将守护程序分为可独立启动的独立启动守护程序,以及通过统一安全机制管理的超级守护程序两大类。

a、独立启动(stand_alone):该守护程序启动后,就直接常驻内存。他虽然一直占用系统资源,但最大的优点就是响应快。常见的守护程序比如httpd。

b、超级守护程序(super daemon):相对于独立启动的执行方式,这种服务的启动方式是通过统一的守护程序来负责唤起服务。统一负责的守护程序就是inet服务。不过,后来的Linux开发套件中,是使用xinet。以FC4的xinet说明下。当有网络服务要求时,该要求会先送给xinet服务,然后xinet根据该网络要求送来的数据包内容(该内容会记录IP地址与端口号),将数据包送给实际运行的服务,而该服务此时才会启动。最常见的就是ftp服务。他的最大优点是不会一直占用系统资源(该服务会在睡眠状态),但他的反应时间也比较慢,因为还要花时间去“唤醒”该服务。

针对超级守护进程的处理模式有两种:

(1)多线程(multi-threaded):可以理解为将所有请求一次交给程序处理,所以一个服务同时会负责好几个程序。

(2)单线程(single-threaded):请求一个个的处理,前一个没处理完之前,后面的请排队。

如果以守护程序的工作状态来区分,主要分为:

a、单独控制(signal-control):这种守护程序是通过信号来管理的,只要有任何需求,他就会立即启动去处理,如打印机的服务(cupsd)。

b、间隔控制(interval-control):这种守护程序是每隔一段时间就主动执行某项工作,所以,即使设置好配置文件,他也不会立即执行,而是某个时间点才回去工作。atd与crond就是这样(每分钟执行一次)。

3、与服务有关的端口信息:/etc/services

不同的网络服务又不一样的监听端口(listen port)。Linux主机的服务与端口信息记录在/etc/services文件中。这个文件的内容以下面的方式来排:<守护进程名称> <port与数据类型> <该服务的说明>

注意:一般不要修改这个文件的内容,使用默认的即可,否则可能出现问题。

4、守护进程命名规则

通常在服务名称后面加上一个d,例如建立at与cron这两个服务,通常被称为atd或crond,d表示守护进程。

5、系统的守护程序位置

为了很轻松的启动服务,Linux会替系统启动守护程序,方法是利用shell脚本。举个例子,如果想知道syslogd是如何启动的,可以查询man 8 syslogd,很麻烦,其实可以使用启动syslogd守护程序的shell脚本(/etc/init.d/syslog)。只要“/etc/init.d/syslog restart”就行了。

这些shell脚本放置的地方根据独立启动守护程序还是超级守护程序有所不同:

a、独立启动守护程序:放在/etc/init.d/目录里,几乎所有的RPM安装的套件启动脚本都在这里。不过FC4是放到/etc/rc.d/init.d/*中。

b、超级守护程序:即xinet或inet。请注意,xinet也是一个守护程序。他是独立启动的,所以xinet的启动脚本写在/etc/init.d/xinted 里。挂在这个守护程序里的服务设置项目写在/etc/cinetd.conf与/etc/xinetd.d/*目录的任何文件中。

守护进程的启动:

a、/etc/init.d/

对于独立期待您给的守护程序,以syslog为例:

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

[root@linux ~]# service syslog start

service格式:

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

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

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

b、/etc/xinetd.conf :这个文件就是设置xinet服务的参数文件

c、/etc/xinetd.d/*:这个目录里面的所有文件就是挂上xinet的所有服务,如wu-ftpd、telnet与pop3等。

对于启动超级守护进程,以telnet为例:[root@linux ~]# vi /etc/xinetd.d/telnet

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

6、超级守护进程序的设置文件

xinetd的主要默认参数文件:/etc/xinetd.conf,几项主要内容:

instances = 60//同一服务的同时联机数最多可达60台

log_type = SYSLOG daemon info //登录后,会记录到登陆文件的信息log_on_failure = HOST //成功登陆是,记录的信息有哪些 log_on_success= PID HOST DURATION EXIT //登录失败,记录的信息是什么 cps = 25 30 //同一秒钟内最大联机数量为25台,若超过25台,该服务会暂时停止30秒

includedir /etc/xinetd.d //更多设置值在/etc/xinetd.d目录中

这个文件中的数据只是默认值,当某个使用超级守护程序管理的服务启动时,除非该服务已经设置好管理的项目,否则将使用上述xinetd.conf内的默认值。所有的服务参数文件都在/etc/xinetd.d目录中(如果某服务在此目录中有设置文件,就不再使用默认值)。每个参数配置文件的格式一般:

service <service_name>

{

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

}

其中attribute是一些xinetd的管理参数,assign_op是参数的设置方法。assign_op的主要设置形式为:

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

+=:表示后面的设置为“在原设置中加入新的参数”

-+:表示后面的设置为“在原参数中舍弃这里输入的参数”

attribute与value:

一般设置项目:

disable:设置服务器可执行或不可执行。设置为yes表示不能执行,设置为no表示可以执行。(必须设置)

socket_type:stream为联机机制较为可靠的TCP包,若为UDP表,则使用dgram机制。ram表示服务器需要与IP直接对话。

protocol:联机状态使用哪种协议。各协议代号可参考/etc/protocols的内容,除非自己设置的服务,否则这个可以不用设置。

wait:多线程与单线程方式,如果是多线程设置为no,单线程设置为yes。

user:UID,这是个安全防范机制,需要注意UID必须在/etc/passwd中。

group:与user的意思相同,这个GID也必须在 /etc/group中。

instances:同一时间内同一个服务允许的联机数目,可以写入一个数字。例在同时段ftp联机最多30台,这里就可以填入30。

nice:范围是-19~19,数字越小表示程序越优先执行。

server:指出服务的启动程序。例如telnet的话,就是server = /usr/sbin/in.telnetd。

server_args:服务器的参数。例如in.telnetd中,可以加入某些参数。

log_on_success:成功登陆后需要记录的项目。PID为记录该服务器启动时的进程ID,HOST为远程主机IP,USERID为登陆者账号,EXIT为离开是记录的项目,DURATION为该用户使用此服务的时间。

log_on_failure:登录失败时需要记录的项目。HOST为远程主机IP,USERID为登陆者账号,ATTEMPT记录登录失败者的企图,RECORD为记录远程主机的信息,以及为什么本机server不能启动的原因。login、shell、exec、finger等命令可以在这里使用。

高级设置项目:

env:可以设置环境变量。

port:可以设置不同服务与对应的端口,但是记住端口与服务名称必须与/etc/services内的记载相同。

redirect:将客户端对我们server的需求转到另一台主机上去。例如当有人要使用您的ftp时,您就可以将他转到另一台机器上去。那个IP_Address就表示另一台远程主机的IP。

includedir:将某个目录下所有文件都放到xinetd.conf设置里。很有用,这样就可以一个一个设置不同的项目,而不用将所有服务都写进xinetd.conf里。

安全控管项目:

bind:设置允许使用此服务的适配卡。例如Linux主机上有两个IP,而只想让IP1可以使用此服务,IP2不能使用,这里就可以写入IP1,IP2就不能使用此服务器。

interface:与bind相同。

only_from:用在安全机制上,就是管制只有这里规定的IP或主机名称可以登录,如果是0.0.0.0表示所有PC皆可登陆。另外,也可以选择域名。

no_access:与only_from差不多,用来管理能否进入Linux主机启用服务器服务的管理项目。no_access表示不可登陆的PC。

access_times:设置该服务的服务器启动的时间,使用24小时设置。例如ftp要在8点到16点开放,则:08:00- 16:00。

umask:可以设置用户建立的目录或者是文件的属性。系统建议022。

注:对于一个网段,可以这样设置:192.168.1.0/24表示192.168.1.0~192.168.1.24网段。

7、TCP_Wrappers

除了使用xinetd的设置文件来设置安全机制外,还可以使用额外的机制来阻止某些不受欢迎的数据来源,就是/etc/hosts.allow以及/etc/hosts.deny这两个文件。需要安装tcp_wrappers套件。/etc/hosts.allow优先级高于/etc/hosts.deny,可以把所有条件都写进一个文件,但是会显得杂乱无章。

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

例:以telnet在FC4下为例:

[root@linux ~]# vi /etc/hosts.deny

in.telnetd : 140.116.44.202 140.116.32.0/255.255.255.0 : deny

也可以写成两行:

in.telnetd: 140.116.44.202 : deny

in.telnetd: 140.116.32.0/255.255.255.0 : deny

另外,在第一个和第二个字段还可以使用一些特殊参数:

ALL:表示接受全部的program_name或者IP,例如:ALL:ALL:deny;

LOCAL:表示来自本机,例如:ALL:LOCAL:allow

UNKNOWN:表示不知道的IP、域或服务

KNOWN:表示可解析的IP、域等信息

再次强调,service_name必须与xinetd或/etc/init.d/*中的程序名相同。

还有更安全的设置,比如他人扫描telnet端口时,记录他的IP,以便查询与取证,这要在第三栏中使用额外的参数:

spawn(action):可以利用后续接的shell来进行附加工作,且具有变量功能,主要变量内容为:%h(homename)、%a(address)、%d(daemon)等。

twist(action):立刻执行后面的命令,起执行完后终止该次联机的要求。

例:利用safe_finger追踪对方主机信息,将追踪到的结果以电子邮件方式寄给root,在对方屏幕上显示不可登陆的消息,此时可利用:

spwan(action1)|(action2):twist(action3) 来进行。

[root@linux ~]# vi /etc/hosts.deny

in.telnetd: ALL : spawn (echo "security notice from host ‘/bin/hostname’";\

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

/bin/main -s "%d-%h securitv" root & \

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

另外注意:/usr/sbin/safe_finger是由tcp_wrappers套件提供。

8、观察系统启动的服务

观察已启动服务的方式很多,但最常使用的是netstat。通常,以ps来观察整个系统上的服务比较好,但是观察启动网络监听的服务,netstat比较好。

例:找出当前系统打开的“网络服务”有哪些

[root@linux ~]# netstat -tulp

例:找出所有监听网络的服务(包含套接字状态)

[root@linux ~]#netstat -lnp

例:观察所有的网络连接状态,查询是否有异常联机

[root@linux ~]# netstat -anp

9、设置开机后立即启动的服务

整个服务开机就能启动的地方有两处,一处是在守护程序启动(/etc/rc.d/rc[0-6].d/*)目录下,该目录下的文件主要以S或K开头,分别表示开机时启动与关机时关闭。也就是说如果可以要启动的服务写入这个目录内,该服务开机时就能自动启动。另一处也可以在开机时启动的文件就是/etc/rc.d/rc.local。可以将任何想在开机时启动的程序写入这个文件,该文件以shell脚本的语法写成。

实际上不用手动去修改这两个地方就能设置启动服务,系统提供了两个命令来实现这个功能:chkconfig和ntsysv

a、chkconfig

[root@linux ~]# chkconfig –list

[root@linux ~]# chkconfig [–add | –del] [service_name]

[root@linux ~]# chkconfig –level [0123456] [service_name] [on|off]

–list :仅列出当前各项服务的状态

–add:给chkconfig增加一个服务名称,该service_name必须在/etc/init.d中

–del:删除chkconfig管理的一个服务

–level:设置某个服务在该level下启动或关闭

例:列出当前系统上所有被chkconfig管理的服务

[root@linux ~]# chkconfig –list | more

//输出主要分为两个部分,首先是独立启动的服务,他会列出0~6各运行等级的数据,即上半部分的显示。下半部是超级守护程序管理的服务输出,由超级守护程序管理的服务,是没有运行等级之分的。

例:让atd服务在运行等级3、4、5是启动

[root@linux ~]#chkconfig –level 345 atd on //会在/etc/rc.d/rc3.d、/etc/rc.d/rc4.d和/etc/rc.d/rc5.d里建立一个链接文件。

例:将自己建立的服务加入到chkconfig的管理中。首先该服务必须加入init可管理的脚本中,即/etc/init.d/中。比如,在/etc/init.d中建立一个myvbird文件,该文件是简单的服务范例,要求:将在运行等级3和5启动;在/etc/rc.d/rc[35].d中启动时,以S80开始以K70结束。

[root@linux ~]# vi /etc/init.d/myvbird

#!/bin/bash

#chkconfig: 35 80 70

echo "Nothing"

说明:第二行比较重要,他的语法是:chkconfig: [runlevels] [start number] [stop number],其中runlevels为不容的运行等级状态,start number与stop number则是在/etc/rc.d/rc[35].d内建立的设置文件,文件名为S80myvbird即K70myvbird

[root@linux ~]# chkconfig –add myvbird //加入chkconfig管理中

[root@linux ~]# chkconfig –list myvbird

//如果想删除

[root@linux ~]#chkconfig –del myvbird

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

b、ntsysv(很多版本都有chkconfig,但是ntsysv是Red Hat所特有的)

[root@linux ~]# ntsysv [–level <levels>]

–level:后面接不同的运行等级,例如ntsysv –level 35

例:直接编辑当前运行等级下默认启动项目

[root@linux ~]# ntasysv//出现编辑菜单,上下键控制移动;空格键选择需要的服务,tab键可在方框、OK、CANCEL间移动,[F1]键显示该服务的说明。

将会错过更好的风景,保持一份平和,保持一份清醒。

Linux (系统服务守护程序)

相关文章:

你感兴趣的文章:

标签云: