分类: LINUX
2011-01-24 21:04:19
关于linux下面系统服务的管理的讨论,
Linux系统服务可以分为三类:
1、由init控制的服务
2、由System V启动脚本启动的服务
3、由xinetd管理的服务
下面我们来介绍这三种系统服务:
一.Init控制的服务
Init的配置文件在/etc/inittab这个文件中。
二.System V服务
经常使用几个配置文件,大多数服务启动一个或多个进程。都是独立启动服务。
在/etc/init.d/下面的脚本都是system V服务。
[root@localhost ~]# cd /etc/init.d/
[root@localhost init.d]# ls
acpid functions kudzu nscd setroubleshoot
anacron gpm libvirtd ntpd single
apmd haldaemon lvm2-monitor pand smartd
atd halt mcstrans pcscd sshd
auditd hidd mdmonitor portmap syslog
autofs hplip mdmpd psacct vmware-tools
avahi-daemon ip6tables messagebus rawdevices vncserver
avahi-dnsconfd ipmi microcode_ctl rdisc vsftpd
bluetooth ipmievd multipathd readahead_early wdaemon
conman iptables named readahead_later winbind
cpuspeed irda netconsole restorecond wpa_supplicant
crond irqbalance netfs rhnsd xend
cups iscsi netplugd rpcgssd xendomains
cups-config-daemon iscsid network rpcidmapd xfs
dnsmasq kdump NetworkManager rpcsvcgssd xinetd
dund killall nfs saslauthd ypbind
firstboot krb524 nfslock sendmail yum-updatesd
[root@localhost init.d]#
在这个里面的所有脚本都是system V的服务,
如果想运行这些服务,可以使用两种方式,
#/etc/init.d/vsftpd restart
[root@localhost ~]#
[root@localhost ~]# /etc/init.d/vsftpd restart
Shutting down vsftpd: [ OK ]
Starting vsftpd for vsftpd: [ OK ]
[root@localhost ~]#
直接使用脚本的方式来运行,还有一种方式,
#service vsftpd restart
[root@localhost ~]#
[root@localhost ~]# service vsftpd restart
Shutting down vsftpd: [ OK ]
Starting vsftpd for vsftpd: [ OK ]
[root@localhost ~]#
使用service命令来调用脚本。
如何控制系统服务呢?
我们一般使用chkconfig工具来管理,
我们可以使用chkconfig工具来定义那个服务运行在那个级别上面。
#chkconfig --list
这条命令会显示系统中所有的系统服务,输出很多。后面可以跟查询的服务。
# Chkconfig --list vsftpd
[root@localhost ~]#
[root@localhost ~]# chkconfig --list vsftpd
vsftpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
[root@localhost ~]#
通过chkconfig工具可以查询到vsftpd这个服务在下次启动的时候在2,3,4,5这四个级别上面是启动的。
如何定义系统服务在下次启动的时候在那个级别启动呢?
现在我们定义vsftpd服务在下次启动的时候在3,5级别启动。
# chkconfig --level 35 vsftpd on
[root@localhost ~]#
[root@localhost ~]# chkconfig --level 35 vsftpd on
[root@localhost ~]#
[root@localhost ~]# chkconfig --list vsftpd
vsftpd 0:off 1:off 2:off 3:on 4:off 5:on 6:off
[root@localhost ~]#
现在我们的vsftpd服务在下次启动的时候就会在3和5的级别启动。
如果我们不加任何级别,直接将vsftpd服务给off。
#chkconfig vsftpd off
[root@localhost ~]#
[root@localhost ~]# chkconfig vsftpd off
[root@localhost ~]#
[root@localhost ~]# chkconfig --list vsftpd
vsftpd 0:off 1:off 2:off 3:off 4:off 5:off 6:off
[root@localhost ~]#
现在在所有的级别上面,vsftpd服务就off了。
将vsftpd服务直接给on呢。
#chkconfig vsftpd on
[root@localhost ~]#
[root@localhost ~]# chkconfig vsftpd on
[root@localhost ~]#
[root@localhost ~]# chkconfig --list vsftpd
vsftpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
[root@localhost ~]#
那么就会在2,3,4,5级别上面启动。因为在0,1,6级别启动没有意义。
这条命令也是我们最长用到的。
我们可以添加服务或者删除服务在chkconfig的管理程序里面。
删除一个服务在chkconfig的管理程序里面,
#chkconig --del vsftpd
[root@localhost ~]#
[root@localhost ~]# chkconfig --del vsftpd
[root@localhost ~]#
[root@localhost ~]# chkconfig --list vsftpd
service vsftpd supports chkconfig, but is not referenced in any runlevel (run 'chkconfig --add vsftpd')
[root@localhost ~]#
Vsftpd这个服务就从chkconfig的管理程序里面删除了,通过chkconfig --list命令也查询不到了。
添加一个服务到chkconfig的管理程序里面。
#chkconfig --add vsftpd
[root@localhost ~]#
[root@localhost ~]# chkconfig --add vsftpd
[root@localhost ~]#
[root@localhost ~]# chkconfig --list vsftpd
vsftpd 0:off 1:off 2:off 3:off 4:off 5:off 6:off
[root@localhost ~]#
OK,vsftpd服务就被成功的添加到了chkconfig的管理程序里面。
注意:service vsftpd restart这条命令是使vsftpd服务在当前生效,下次启动不生效。而chkconfig工具开启的服务是在下次生效。
Chkconfig vsftpd on这条命令一定要敲。
关于/etc/sysconfig下面的文件,
/etc/sysconfig这个目录我们并不陌生了,这个目录下面的所有文件都是全局配置文件。我们很多的服务都在/etc/sysconfig下面有全局的配置文件。
三.Xinetd管理的服务。
我们由xinetd管理的服务都在/etc/xinetd/下面。
[root@localhost ~]#
[root@localhost ~]# cd /etc/xinetd.d/
[root@localhost xinetd.d]# ls
chargen-dgram discard-stream gssftp rsync time-stream
chargen-stream echo-dgram klogin tcpmux-server
daytime-dgram echo-stream krb5-telnet telnet
daytime-stream eklogin kshell tftp
discard-dgram ekrb5-telnet rmcp time-dgram
[root@localhost xinetd.d]#
这个目录下面的服务都是由Xinetd来管理的。
可以看到,在这个目录下面有个telnet。也就是说telnet是由xinetd来管理的。
现在我们打开这个文件来看看。
# default: on
# description: The telnet server serves telnet sessions; it uses \
# unencrypted username/password pairs for authentication.
service telnet
{
flags = REUSE
socket_type = stream
wait = no
user = root
server = /usr/sbin/in.telnetd
log_on_failure += USERID
disable = yes
}
在telnet的配置文件里面有个disable = yes,是不是关闭这个服务呢,yes。
现在我们将它改成no,不关闭。
那么我们如何重新启动这个服务呢。
使用service telnetd restart来试试,
[root@localhost ~]#
[root@localhost ~]# service telnetd restart
telnetd: unrecognized service
[root@localhost ~]#
好像不行,因为telnet不是system V的服务,不可能会调用/etc/init.d下面的脚本。
telnet服务是属于xinetd服务的,我们重启下xinetd服务,试试。
[root@localhost ~]#
[root@localhost ~]# service xinetd restart
Stopping xinetd: [ OK ]
Starting xinetd: [ OK ]
[root@localhost ~]#
OK,xinetd服务启动成功。
因为xinetd服务也是属于system V服务,所以可以用service来启动。
我们知道telnet的端口号是23,我们来查询这个端口有没有监听。
[root@localhost ~]#
[root@localhost ~]# netstat -tulnp | grep 23
tcp 0 0 0.0.0.0:23 0.0.0.0:* LISTEN 14854/xinetd
[root@localhost ~]#
可以看到,telnet服务的确是监听在23号端口的。并且是由xinetd来管理的。
现在我们来测试一下,
[root@localhost ~]#
[root@localhost ~]# telnet 192.168.0.254
Trying 192.168.0.254...
Connected to 192.168.0.254 (192.168.0.254).
Escape character is '^]'.
Red Hat Enterprise Linux Server release 5.4 (Tikanga)
Kernel 2.6.18-164.el5xen on an i686
login: user1
Password:
Last login: Mon Mar 8 14:22:29 from 192.168.0.2
[user1@localhost ~]$ ls
[user1@localhost ~]$
同样的,我们也可以使用chkconfig来管理telnet。
[root@localhost ~]#
[root@localhost ~]# chkconfig telnet on
[root@localhost ~]# chkconfig --list telnet
telnet on
[root@localhost ~]# chkconfig telnet off
[root@localhost ~]# chkconfig --list telnet
telnet off
[root@localhost ~]#
关于system V服务和xinetd管理的服务,
System V 占用资源,反应速度快。
Xinted 占用资源少,反应速度慢。
Xinetd的全局配置文件在/etc/xinetd.conf文件,
/etc/xinetd.d/service这个是xinetd服务的配置文件。
以xinetd服务自己定义的为准,如果xinetd服务没有定义的条目,就会继承全局配置文件中定义的条目。
首先来看看全局配置文件,
Enabled = yes or no
开启或者关闭,
Instances = 50
最多可以管理50个请求,
Per_source = 10
每个单一的IP仅可以访问10次,
V6only
是否启用ipv6,
log_on_failure = HOST
当访问我失败,记录主机名。
Log_on_success = PID HOST DURATION EXIT
当访问我成功了,就记录这些信息。
Cps =50 10
当连接到我的计算机上面的用户超过50,就暂停10S。
在来看看xinetd服务的配置文件,
Service telnet
服务的名字
Disable = yes or no
是否开启telnet
Socket_type = stream
类型是TCP
Wait = no
是否等待
User = root
服务的管理者是root
Log_on_failure += USERID
登录失败,记录用户的uid。
下面就是关于xinetd服务的访问控制,
语法:
使用only_from 来定义允许访问,
使用no_access来定义禁止访问。
Only_from代表仅允许那些人来访问,
No_access代表不允许那些人访问。
关于xinetd服务访问控制的主机模式
192.168.0.10 主机
192.168.0.0/24 网段
Station10.example.com. 主机名
.example.com 域名
现在我们来做试验,
[root@localhost ~]#
[root@localhost ~]# ssh 192.168.0.10
root@192.168.0.10's password:
Permission denied, please try again.
root@192.168.0.10's password:
Last login: Mon Mar 8 15:32:07 2010 from 192.168.0.254
[root@localhost ~]#
[root@localhost ~]# telnet 192.168.0.254
Trying 192.168.0.254...
Connected to 192.168.0.254 (192.168.0.254).
Escape character is '^]'.
Red Hat Enterprise Linux Server release 5.4 (Tikanga)
Kernel 2.6.18-164.el5xen on an i686
login: user1
Password:
Last login: Mon Mar 8 15:21:50 from 192.168.0.10
[user1@localhost ~]$
现在我们是可以telnet到192.168.0.254上面的。
现在我们对telnet来做访问控制,
[root@localhost ~]#
[root@localhost ~]# cat /etc/xinetd.d/telnet
# default: on
# description: The telnet server serves telnet sessions; it uses \
# unencrypted username/password pairs for authentication.
service telnet
{
disable = no
flags = REUSE
socket_type = stream
wait = no
user = root
server = /usr/sbin/in.telnetd
log_on_failure += USERID
no_access = 192.168.0.10
}
[root@localhost ~]#
我们拒绝192.168.0.10进行telnet到192.168.0.254。
然后重启下xinetd服务,
[root@localhost ~]#
[root@localhost ~]# service xinetd restart
Stopping xinetd: [ OK ]
Starting xinetd: [ OK ]
服务启动成功,测试下,
[root@localhost ~]#
[root@localhost ~]# ssh 192.168.0.10
root@192.168.0.10's password:
Last login: Mon Mar 8 15:49:20 2010 from 192.168.0.254
[root@localhost ~]#
[root@localhost ~]# telnet 192.168.0.254
Trying 192.168.0.254...
Connected to 192.168.0.254 (192.168.0.254).
Escape character is '^]'.
Connection closed by foreign host.
[root@localhost ~]#
OK,可以看到,连接就被拒绝了。
那192.168.0.20可以telnet到192.168.0.254上面吗。试试
[root@localhost ~]#
[root@localhost ~]# ssh 192.168.0.20
root@192.168.0.20's password:
Last login: Mon Mar 8 15:58:27 2010 from 192.168.0.254
[root@localhost ~]#
[root@localhost ~]# telnet 192.168.0.254
Trying 192.168.0.254...
Connected to 192.168.0.254 (192.168.0.254).
Escape character is '^]'.
Red Hat Enterprise Linux Server release 5.4 (Tikanga)
Kernel 2.6.18-164.el5xen on an i686
login: user1
Password:
Last login: Mon Mar 8 15:32:35 from 192.168.0.10
[user1@localhost ~]$
是可以的,我们只是拒绝了192.168.0.10进行telnet到192.168.0.254。
所以192.168.0.20是可以的。
如果有这样的情况呢?
Only_from 192.168.0.0/24
No_access 192.168.0.20
那么192.168.0.20最终可以访问吗?
我们来尝试一下。
[root@localhost ~]#
[root@localhost ~]# cat /etc/xinetd.d/telnet
# default: on
# description: The telnet server serves telnet sessions; it uses \
# unencrypted username/password pairs for authentication.
service telnet
{
disable = no
flags = REUSE
socket_type = stream
wait = no
user = root
server = /usr/sbin/in.telnetd
log_on_failure += USERID
only_from = 192.168.0.0/24
no_access = 192.168.0.20
}
[root@localhost ~]#
配置OK,重启下服务,
[root@localhost ~]#
[root@localhost ~]# service xinetd restart
Stopping xinetd: [ OK ]
Starting xinetd: [ OK ]
服务启动成功,测试下,
[root@localhost ~]#
[root@localhost ~]# ssh 192.168.0.20
root@192.168.0.20's password:
Last login: Mon Mar 8 16:03:23 2010 from 192.168.0.254
[root@localhost ~]# telnet 192.168.0.254
Trying 192.168.0.254...
Connected to 192.168.0.254 (192.168.0.254).
Escape character is '^]'.
Connection closed by foreign host.
[root@localhost ~]#
可以看到,192.168.0.20最终还是不可以telnet到192.168.0.254上面去的。
那么192.168.0.10可以telnet吗?
[root@localhost ~]#
[root@localhost ~]# ssh 192.168.0.10
root@192.168.0.10's password:
Last login: Mon Mar 8 16:05:00 2010 from 192.168.0.254
[root@localhost ~]#
[root@localhost ~]# telnet 192.168.0.254
Trying 192.168.0.254...
Connected to 192.168.0.254 (192.168.0.254).
Escape character is '^]'.
Red Hat Enterprise Linux Server release 5.4 (Tikanga)
Kernel 2.6.18-164.el5xen on an i686
login: user1
Password:
Last login: Mon Mar 8 16:00:42 from 192.168.0.20
[user1@localhost ~]$
OK,192.168.0.10是没有问题的,可以telnet到192.168.0.254上面去。
我们允许192.168.0.0/24这个网段里面所有的主机,但是拒绝192.168.0.10这台主机。
这个访问控制还可以支持访问时间的控制。
Access_times = 8:00-12:00
[root@localhost ~]#
[root@localhost ~]# cat /etc/xinetd.d/telnet
# default: on
# description: The telnet server serves telnet sessions; it uses \
# unencrypted username/password pairs for authentication.
service telnet
{
disable = no
flags = REUSE
socket_type = stream
wait = no
user = root
server = /usr/sbin/in.telnetd
log_on_failure += USERID
access_times = 8:00-12:00
}
[root@localhost ~]#
配置就OK,重启下服务,
[root@localhost ~]#
[root@localhost ~]# service xinetd restart
Stopping xinetd: [ OK ]
Starting xinetd: [ OK ]
服务启动成功,测试下,
[root@localhost ~]#
[root@localhost ~]# ssh 192.168.0.10
root@192.168.0.10's password:
Last login: Mon Mar 8 16:12:00 2010 from 192.168.0.254
[root@localhost ~]# date
Mon Mar 8 16:12:20 CST 2010
[root@localhost ~]#
[root@localhost ~]# telnet 192.168.0.254
Trying 192.168.0.254...
Connected to 192.168.0.254 (192.168.0.254).
Escape character is '^]'.
Connection closed by foreign host.
[root@localhost ~]#
192.168.0.10是不可以telnet到192.168.0.254上面去的,因为访问时间限制了。
在linux下面的系统服务的讨论就是这么多了。