大家可能常听到daemon,而什么是daemon可能不太清楚,我的理解是让服务启动的东东称为daemon。而服务(service)就是为我
们提供服务(如web mail
ftp等)的东东。所以说,我们是通过daemon来管理service的。而很多时候我们也把daemon说成service,其实这样也差不多了。
daemon 的分类
根据daemon的启动与管理方式来分,可以将daemon为可独立启动的daemon,和通过super daemon来统一管理的服务这两大类,下面来简单的介绍一下他们两个的区别:
独立启动的服务:这种类型的 daemon 可以独立启动而无需通过其他机制来管理,此类daemon启动并加载到内存后就一直占用内存与系统资源。最大的优点就是:因为是一直存在内存内,所以当有客户请求时,他的响应速度较快。
super
daemon:这种服务的启动是由一个普通的daemon来统一管理(在RHEL/CentOS的系统中是xinetd)一些服务。这种管理方式的特点
是:原本各项服务都是未启动的,当有客户来请求时,此时super daemon
才唤醒相对应的服务,当客户端的请求结束后,被唤醒的这个服务也会关闭并释放系统资源。所以说由super daemon管理的服务响应是比较慢的。
服务与端口
这个端口我相应大家都很清楚,可以用个比喻来说明一下IP与端口的作用。我们可以把IP当作互联网上的地址,而端口就是楼层号,不同的楼层就提供不同的服务了,哈哈……
想查看服务对应的端口,可以参考/etc/services。这里只能参考,因为我们可以改变服务的端口号。
daemon启动脚本的相关目录与文件
/etc/init.d/ 此目录是放启动脚本的位置。在RHEL/CentOS上实际上是放在/etc/rc.d/init.d/,为什么呢?其实查看一下目录就知道了。/etc/init.d其实是/etc/rc.d/init.d的链接目录。
[root@yufei ~]# ls -ld /etc/init.d
lrwxrwxrwx. 1 root root 11 May 31 17:43 /etc/init.d -> rc.d/init.d
/etc/sysconfig/ 各服务的初始化环境配置文件。几乎所有的服务都会将初始化的一些选项设定写到这个目录下。
/etc/xinetd.conf, /etc/xinetd.d/ :super daemon 配置文件的目录。super daemon
的主要配置文件为 /etc/xinetd.conf ,super daemon所管理的其他 daemon 的设定则在
/etc/xinetd.d/ 里。
/etc/ :各服务的配置文件的目录,一般是以.conf结尾。
/var/run/ :各服务的程序的 PID 存放的地方。
服务的启动与停止或加载
我们先来看普通的daemon启动方式
用RPM或YUM安装的服务软件,服务的脚本基本上全部放在/etc/init.d/这个目录下,这里面的脚本一般都可以用VI打开来观察。脚本的内容大致有:脚本的描述、环境调用、搜寻配置文件、加载functions、服务的启动停止与加载、最后还会有脚本的参数。
这里面的脚本可以用脚本的相对路径或绝对路径来执行,当然RHEL/CentOS上还提供了一个命令service来直接调用这里面的脚本。
我们以SSHD为例来看一下
[root@yufei ~]# /etc/init.d/sshd --help
Usage: /etc/init.d/sshd {start|stop|restart|reload|force-reload|condrestart|try-restart|status}
这个提示很清楚,结合脚本文件你就会看明白,参数执行了哪些东西,这就留给大家自己研究吧。
[root@yufei ~]# cd /etc/init.d/
[root@yufei init.d]# ./sshd restart
Stopping sshd: [ OK ]
Starting sshd: [ OK ]
用相对路径启动也是一样的,当然还可以在任何目录下用service来直接执行某个服务,至于为什么他会调用/etc/init.d/里面的脚本,大家看一下/sbin/service这个文件就知道了。
[root@yufei init.d]# service sshd restart
Stopping sshd: [ OK ]
Starting sshd: [ OK ]
再来看看Super daemon 的启动方式
其实Super daemon
本身也是普通的daemon,只是要通过他来管理一些不常用的服务而已。所以说,xinetd他的启动方式与普通的daemon是一样的,而由他管理的服
务都在/etc/xinetd.d/目录下,这里面的服务开启与关闭,都是由此目录下的服务文件本身来控制的。大家可以打开来看看,每个文件里面都有
disable = yes或disable = no这样的内容,如果是YES,那就是不启动了,如果是NO,就是启动了。
下面我们以telnet为例来给大家演示
[root@yufei ~]# cd /etc/xinetd.d/
[root@yufei xinetd.d]# yum install telnet-server
[root@yufei xinetd.d]# ls -l |grep telnet
-rw-r--r--. 1 root root 305 Sep 9 2004 telnet
[root@yufei xinetd.d]# grep disable telnet
disable = yes
我们来启动看看
[root@yufei xinetd.d]# service xinetd restart
Stopping xinetd: [ OK ]
Starting xinetd: [ OK ]
[root@yufei xinetd.d]# telnet localhost
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
telnet: connect to address 127.0.0.1: Connection refused
发现telnet连不上
我们把disable = yes换成no
[root@yufei xinetd.d]# vim telnet
[root@yufei xinetd.d]# grep disable telnet
disable = no
重新启动xinetd
[root@yufei xinetd.d]# service xinetd restart
Stopping xinetd: [ OK ]
Starting xinetd: [ OK ]
[root@yufei xinetd.d]# telnet localhost
Trying ::1...
Connected to localhost.
Escape character is '^]'.
Red Hat Enterprise Linux Server release 6.1 (Santiago)
Kernel 2.6.32-131.0.15.el6.x86_64 on an x86_64
login:
发现这时候的反应有点慢,过一会,就出现了login:的登陆信息了。在RHEL6.1上就算是用户名和密码正确,好像也无法正常登陆,应该是系统为了安全方面考虑,可能是禁止了什么,这个有兴趣的,自己研究吧。
这只是演示了一下关于由xinetd管理的服务启动的方法,我想大家应该很清楚了。当然,telnet是明文的,也是不安全的,所以我们把他卸载掉。
[root@yufei xinetd.d]# yum remove telnet-server -y
[root@yufei xinetd.d]# rm -fr telnet.rpmsave
下面来分析一下/etc/xinetd.conf这个文件
这个文件中包含日志的记录方式与记录的内容设置、连接设置、网络设置和环境参数设置以及其他服务设置
我们主要来看连接限制设置
cps = 50 10
instances = 50
per_source = 10
第一行表示:同一秒内的最大联机数为 50 个,若超过则暂停 10 秒
第二行表示:同一服务的最大同时联机数
第三行表示:同一客户端的最大联机数
这个文件中的参数是一个全局的设置,你也可以对其管理的服务来进行其他更多我设置。他管理的服务就是/etc/xinetd.d/这个目录里面的,你可以打开某个服务看一下里面的参数设置,这里也不一一说明,主要讲一下,关于网络方面的设置。
only_from:只有这里设置的IP或者是主机名才可以使用某个服务。这个设置后面可以是某个网段如192.168.1.0/24,也可以是某个域如.
opsers.org。如果说有多个不同的设置,就可以用+=来设置其他的内容。
no_access:和上面的一样,只是用来限制某些主机不能使用某个服务。
access_times:设置服务开放的时间。他的设置方式是[00:00-12:00],就是从某个时段到某个时段。如果有多个时间段,中间用空格空开就可以,如:01:00-9:00 20:00-23:59
tcp_wrappers
其实,任何以 xinetd 管理的服务,都可以通过 /etc/hosts.allow, /etc/hosts.deny
来限定访问权限,可以叫做防火墙(tcp_wrappers)。这种管理机制更方便用来集中管理。那么这两个文件是不是对系统中所有的服务都起作用呢?其
实不是这样的,只有加载了libwrap.so函数的服务才能被 /etc/hosts.allow, /etc/hosts.deny
所能控制。下面我们就来看看
[root@yufei ~]# ldd $(which sshd) |grep libwrap.so
libwrap.so.0 => /lib64/libwrap.so.0 (0x00007f61d35bf000)
[root@yufei ~]# ldd $(which httpd) |grep libwrap.so
[root@yufei ~]#
我们发现,
SSH是支持 libwrap.so的,所以他可以通过/etc/hosts.allow, /etc/hosts.deny 这两个文件来控制权限了。
关于文件的格式使用可以通过man 5 hosts_options 和 man 5 hosts_access来查看。
基本格式如下
服务:IP 或领域 或主机名:动作
第一及第二个字段一些特殊参数:
ALL:代表全部的 program_name 或者是 IP 都接受的意思,例如 ALL: ALL: deny
LOCAL:代表来自本机的意思,例如: ALL: LOCAL: allow
UNKNOWN:代表不知道的 IP 或者是 domain 或者是服务
KNOWN:代表为可解析的 IP, domain 等等信息
特别要注意:
服务是启动该服务的程序,一般情况下,服务名在脚本中能看到。
一般情况下,我们把
1、允许进入的写在 /etc/hosts.allow 当中
2、阻止进入的则写在 /etc/hosts.deny 当中
而这两个文件判断的依据是ALLOW优先
下面我们来介绍一下服务的观察
一个命令是ps,这个命令一般是用来查询系统中所有的进程
一个命令是netstat,他是用来显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况。我们主要来介绍netstat (network statistics) 的用法
[root@yufei ~]# netstat –help
使用上面的命令会显示netstat的格式及相关参数,下面就介绍一下主要的参数意义。
-r, –route 显示路由表(和route命令一样,都可以加上后面的-n参数)
-i, –interfaces 显示网络接口的连接情况(eth0、lo)
-s, –statistics 显示IP、ICMP、IcmpMsg、TCP、UDP、UdpLite、TcpExt、IpExt的统计信息
-n, –numeric 以数字形式显示地址和端口号
-p, –programs 显示PID/Program name
-l, –listening 显示监听端口
-a, –all, –listening 显示所有连接和监听端口
-t, –tcp 显示TCP传输协议的连线状况
-u, –udp 显示UDP传输协议的连线状况
–e本选项用于显示关于以太网的统计数据。它列出的项目包括传送的数据报的总字节数、错误数、删除数、数据报的数量和广播的数量。这些统计数据既有发送的数据报数量,也有接收的数据报数量。这个选项可以用来统计一些基本的网络流量)。
从整体上看,netstat的输出结果可以分为两个部分,一个是Active Internet connections,称为活动的网络连接。列出下面的一些信息
Proto:显示连接使用的协议
Recv-Q:本地未收到的字节数
Send-Q:远程主机未收到的字节数
Local Address:本地的地址与端口
Foreign Address:远程的地址与端口
State:连接的状态情况
另一个是Active UNIX domain sockets,称为活动的Unix域套接口。列出下面的一些信息
Proto:显示连接使用的协议
RefCnt:表示连接到本套接口上的进程号
Types:显示套接口的类型
State:显示套接口当前的状态
Path:表示连接到套接口的其它进程使用的路径名
netstat与网络有密切关系,所以如果想更清楚的了解上面列出来的信息,最好是有点网络基础。当然,如果你没有也没有关系,下面我列举几个我们常用的命令组合,让大家来使用。
netstat -tl 查看当前tcp监听端口
netstat -ul 查看当前udp监听端口
netstat -tlp 查看当前tcp监听端口, 同时显示监听的程序名
netstat -tlpn 以数字方式显示上面的内容
netstat -tulpna 查看出正在连接的网络信息
以上这些信息基本上够用了,如果想了解更多的netstat相关用法,请用man来帮助。
服务的管理
上面讲了这么多,我相信大家对服务有了一个更深入的了解了,那么下面我们就来看看服务是如何来管理的。
要想管理好服务,就需要掌握chkconfig此命令的使用。先来看看这个命令的使用吧。
chkconfig –list [name]
列出系统中(/etc/init.d/目录下)的服务(/etc/init.d/)状态。[name]加上则是查看某个服务的状态,不加就是查看系统中全部的服务状态
chkconfig –add <name>
把某个服务增加到/etc/init.d/目录下
chkconfig –del <name>
删除/etc/init.d/目录下的某个服务
chkconfig [--level <levels>] <name> <on|off>
设置某级别的某个服务的状态
上面的命令比较简单,但要注意几点:
1、要想管理某个服务,那么此服务必需要在/etc/init.d/目录下,才能够用chkconfig来管理,否则会出现“error
reading information on service network: No such file or directory”这要的错误。
2、这个文件要有执行权限
3、/etc/init.d/目录下的服务文件都有一些共同点,那就是有一行类似# chkconfig: 2345 10
90这样的内容,就和第一行#!
/bin/bash一样,是必需的,而不是我们平时所说的注释。三栏表示的意思是:不同的运行级别、启动顺序、关闭顺序。也就是说在/etc/rc.d
/rcN.d/(N为2、3、4、5)下会有S10开头的对应文件和/etc/rc.d/rcN.d/(N为0、1、6)下以K90开头的对应文件。这个
我们可以查看前面有关运行级别的相关信息。
最后说明一点,如果你的系统中没有xinetd的话,请安装些软件
[root@yufei ~]# yum install xinetd
[root@yufei ~]# chkconfig --list
省略
xinetd based services:
chargen-dgram: off
chargen-stream: off
daytime-dgram: off
daytime-stream: off
discard-dgram: off
discard-stream: off
echo-dgram: off
echo-stream: off
tcpmux-server: off
time-dgram: off
time-stream: off