|
最近更新日期:2005年10月12日
本文已不再维护,更新文章请参考此处
1. 什么是 daemon 与服务 (service):
1.1 daemon 的主要分类 1.2 与服务有关的端口口对应资料:/etc/services 1.3 命名规则 1.4 系统的 Daemons 放在哪里: /etc/init.d/, /etc/xinetd.conf, /etc/xinetd.d 1.5 daemon 的启动方式:service 2. 解析 super daemon 的配置文件 2.1 主要预设参数档 xinetd.conf 及相关参数原理 2.2 一个简单的 telnet 范例设定 3. TCP_Wrappers:/etc/hosts.allow, /etc/hosts.deny 4. 系统开启的服务: 4.1 观察系统启动的服务: 4.2 设定开机后立即启动服务的方法: chkconfig, ntsysv 4.3 各个服务的简单说明 5. 本章习题练习 6. 针对本文的建议:http://phorum.vbird.org/viewtopic.php?t=23894 大标题的图示什么是 daemon 与服务 (service)
如果您常常上网去查看一些数据的话,尤其是关于 Unix-Like 的相关操作系统,如
FreeBSD, Unix, Linux 等等,应该会常常听到 daemons 这个字眼,那么 daemon
是什么东西呀!?怎么这么常被见到?呵呵,Daemon 的字面上的意思就是『守护神、恶魔?』还真是有点奇怪呦!
^_^""
先来谈一谈 daemon 这个玩意儿是个啥咚咚?还记得我们在 程序与资源管理 一文当中提到过程序的概念,程序有的在 bash 当中执行程序而触发的,也有开机的时候, 系统自行触发而在背景当中执行的。当然也有系统管理员在开机完成后,登入系统来触发的等等。 不论怎么说,这个 daemon 其实就是一个『在背景当中执行的程序』啦! 比较特殊的是,所谓的 daemon 通常是负责系统上面的某个服务 (service) , 好让系统可以接受来自用户或者是网络客户(client)的要求,而加以工作。 那么什么又是服务 (service)?所谓的服务很简单啦,意思是说,主机提供的功能。 这些功能主要分为系统上面的,以及针对网络的服务。针对系统上面的服务,例如我们第四篇提到的 crond 与 atd 等等,他主要负责 Linux 主机上面的工作排程;至于网络服务呢? 包括远程联机 SSH 服务器,或者是全球信息网 WWW 服务器等等,这些让客户端连接上来取得数据的服务, 就是网络服务啦! 那您了解了,之所以要有主机服务器就是希望他可以提供我们一些网络服务,或者是主机端自己的服务, 好让我们用户或者是一般用户可以工作的更愉快!而主机要提供这些服务,必须要有相对应的 daemon 来进行服务需求的监听,例如要提供工作排程的服务,就得要有 atd 或者是 crond 这两个 daemon 才行; 而 daemon 的启动,其实就是某个程序 (program) 的执行,配合这个程序的配置文件, 就能够有效的启动该程序,加载常驻到内存当中成为 daemon ,并提供相对的服务啰! 一般来说,当我们以 run level 3 或者是 run level 5 完整开机进入 Linux 主机后, 系统已经提供我们很多的服务了!包括打印服务、工作排程服务、邮件管理服务等等; 那么这些服务是如何被启动的?他们的工作型态如何?底下我们就来谈一谈啰! Tips: 很多时候,我们不会很细的去切分什么是 daemon 而什么是 service, 简单的来说,你可以将 service 与 daemon 视作相同的东西! 反正就是某个在背景当中执行的程序,他可以提供某些功能就是了! ^_^ 鸟哥的图示 小标题的图示daemon 的主要分类
如果依据 daemon 的启动与管理方式,基本上,可以将 daemon 分为可独立启动的 stand alone ,
与透过统一安全机制管理的 Super daemon 两大类,这两类 daemon 的说明是这样的:
就字面上的意思来说,stand alone 就是『独立的启动』的意思,也就是说,该
daemon 启动之后,就直接常驻在内存当中啰!他虽然会一直的占用系统的资源,
但最大的优点就是,他会一直启动的啦!所以当有要求来的时候,他就会很快速的响应啰!常常用在这一种
daemon 的网络服务如常见的全球信息网 WWW 的 daemon (httpd) 这一个即是一例!
因为他需要比较快的响应速度啊!
相对于 stand alone 的执行方式,这一种服务的启动方式则是藉由统一的一个 daemon
来负责唤起该服务!这一个统一负责的
daemon 就是 inet 这支服务啦!不过,在后来的 Linux 发展套件中,则是使用
xinet 这个设定啰!我们这里以 FC4 的 xinet 来做说明。当有网络的服务要求来的时候,该要求会先送给
xinet 这个服务,然后 xinet 根据该网络要求送来的数据封包的内容 ( 该内容会记录
IP 与 port ) 来将数据封包送给实际运作的服务!而该服务这个时候才会启动的!最常见到的就是
ftp 这支网络服务啦!
那么这两种启动的方式哪一个比较好呢?见仁见智啦!而且还要看该主机的工作负荷与实际的用途说!
例如当你的主机是用来作为
WWW 服务器的,那么 httpd 自然就以 stand alone 的启动方式较佳!事实上,我们常常开玩笑的说明
stand alone 与 super daemon 的情况,可以银行的窗口来作为说明的范例!这种 daemon 最大的优点就是当没有数据封包来的时候,该服务不会一直占据系统资源 ( 该服务会在 sleeping 的状态吧! ) ,但是相对的,他的反应时间也会比较慢, 因为还要花费一段时间去『唤醒』该服务呀!
在银行里面,假设有一种单一服务的窗口,例如存钱窗口,所以,当你需要存钱的时候,
直接前往该窗口,就有『专人』为您服务啦!
在银行里面假设还有另外一种复合型态的窗口,同时提供转账、资金调度、
提款等等的业务,那当你需要其中一项业务的时候,就需要前往该窗口,
但是坐在窗口的这个营业员,拿到你的需求单之后,往后面一丢『喂!那个转账的仁兄!该你的工作了』
那么那个仁兄就开始工作去!然而里头还有资金调度与提款等负责业务的仁兄呢?他们在干嘛?
嘿嘿!看看报、喝喝茶啰!
另外,需要注意的是,既然银行里头有这两种窗口同时存在,所以啰,在 Linux
系统里面,这两种 daemon 是可以同时存在的啦!也就是说,某些服务可以使用
stand alone 来启动,而有其他的服务则可以使用 xinet ( 或者是 inet )
大致的情况就是这样啦!瞭乎!?那么这里就会引出另外一个问题啦!假设银行今天的人潮特别的汹涌, 所以这个窗口后面除了你之外还有很多的人!那么想一想,这个窗口是要『一个完成再来下一个』 还是『全部都把你们的单据拿来,我全部处理掉』呢?呵呵!是不是不太一样?基本上, 针对这种 super daemon 的处理模式有两种,分别是这样:
不过,如果以 daemon 的工作状态来区分,则主要分为两类:
小标题的图示与服务有关的端口口对应资料: /etc/services
现在我们知道系统所提供的服务是执行某个 program ,由该程序的功能所提供的。
也知道一部主机上面可能会同时拥有多个服务,当然,可能会有多个网络服务同时存在。
此时你会不会觉得很奇怪啊?我一部主机同时开启 WWW 与 FTP 时,
客户端跟我要数据,那么主机会响应什么数据给客户端啊?奇不奇怪呢?
其实,就如同上面提到的人类的银行一样,不同的服务有不同的窗口号码, 同样的,在 Linux 系统上面,不同的网络服务,确实有不一样的监听埠口 (listen port)。 我们可以透过指定指向主机的某个端口口 (port) 来连上我们想要的服务呢! 举例来说,我们可以在浏览器上面输入这样的网址: 有没有发现,两个网址都是指向 ftp.isu.edu.tw 这个义守大学的 FTP 网站, 但是浏览器上面显示的结果却是不一样的?是啊!这是因为我们指向不同的服务嘛! 一个是 http 这个 WWW 的服务,一个则是 ftp 这个服务,当然显示的结果就不同了。 那我们怎么知道那个 port 是由那个服务所启动的呢? 因为目前已经有很多既定的网络协议,这些通讯协议使用的 port 是固定的, 也是公认的标准的 port number ,我们可以称为 well known 的信息。 那么我们 Linux 主机有没有相关的信息呢?当然有啊!那就是 /etc/services 这个档案啊!我们取 FC4 的这个档案一部份来说明: [root@linux ~]# vi /etc/services ......省略...... ftp-data 20/tcp ftp-data 20/udp ftp 21/tcp ftp 21/udp fsp fspd ssh 22/tcp # SSH Remote Login Protocol ssh 22/udp # SSH Remote Login Protocol telnet 23/tcp telnet 23/udp ......省略...... http 80/tcp www www-http # WorldWideWeb HTTP http 80/udp www www-http # HyperT pop3 110/tcp pop-3 # POP version 3 pop3 110/udp pop-3 sunrpc 111/tcp portmapper # RPC 4.0 portmapper TCP sunrpc 111/udp portmapper # RPC 4.0 portmapper UDP netbios-ns 137/tcp # NETBIOS Name Service netbios-ns 137/udp netbios-dgm 138/tcp # NETBIOS Datagram Service netbios-dgm 138/udp netbios-ssn 139/tcp # NETBIOS session service netbios-ssn 139/udp ......省略...... # 这个档案的内容是以底下的方式来编排的: # <daemon name> <port 与数据型态> <该服务的说明> Tips: 请特别注意!虽然有的时候您可以藉由修改 /etc/services 来更改一个服务的 port 号,不过并不建议如此做,因为很有可能会造成一些协议的错误情况! 这里特此说明一番呦!(除非您要架设一个地下网站,否则的话,使用 /etc/services 原先的设定就好啦!) 鸟哥的图示 小标题的图示Daemon 的命名规则:
每一个服务的开发者,当初在开发他们的服务时,都有特别的故事啦!
不过,无论如何,这些服务的名称被建立之后,被挂上
Linux 使用时,通常在服务的名称之后会加上一个 d ,例如例行性命令的建立的
at, 与 cron 这两个服务,通常会被称为 atd 与 crond,这个 d 代表的就是 daemon
的意思。所以,在资源管理那一章中,我们使用了
ps 与 top 来观察程序时,都会发现到很多的 xxxd 的程序,呵呵!通常那就是一些
daemon 的程序啰!
小标题的图示系统的 Daemons 放在哪里:
我们说过, daemon 其实是一支可以在背景执行的程序,这个程序可以负责系统的某个服务。
而既然要负责某个服务,当然啰,就需要有所谓的配置文件啰〜而为了让使用者可以很轻易的启动该服务,
因此各主要的 Linux distributions 都会替他们的系统进行较有亲和力的启动 daemon 的方式,
那就是利用 shell script 啦!这也是为何我们会在第三篇的时候建议您务必要学习 shell
script 的原因啊!^_^
举个例子来说,在 FC4 上面管理系统注册表档的服务为 syslogd 这个 daemon, 那么你如何启动这个 daemon 呢?可以查询一下 man 8 syslogd 来看看到底他需要如何被启动。 想必看的结果是『很烦ㄟ!』干嘛要这样启动啊!真是麻烦〜 此时,启动 syslogd 这个 daemon 的 shell script (/etc/init.d/syslog) 就帮上忙了! 你只要『 /etc/init.d/syslog restart 』就能够重新启动 syslogd 呢! 真是很方便啊!而该 shell script 就会主动的去读取相关的配置文件,好让我们的设定生效啊!^_^ OK!那么这些 daemons 的 shell scripts 放在哪里啊?他们放置的地方依据 stand alone 与 super daemon 的差异而有所不同,基本上,是放在这些地方:
OK!先来了解一下 stand alone 的 daemon 是怎么启动的呢?!很简单,假如我们要启动
syslog
这支记录登录文件的服务,那么要启动他的话,就直接下达:
[root@linux ~]# /etc/init.d/syslog start [root@linux ~]# service syslog start
这个档案就是设定 xinet 服务的参数档案啦!
这个目录里面的所有档案就是个别挂上 xinet 的所有服务啦!例如赫赫有名的
wu-ftpd 及 telnet 与 pop3 等等!
小标题的图示daemon 的启动方式: service
知道了一些有关 daemon 的相关知识后,再来,那么我们如何启动一个 daemon 呢?
其实,我们知道所谓的 daemon 就是一支可以在系统背景下面运作的程序 (program) 啊,
所以,要启动该 daemon ,就是找到他的执行档,执行他就是了。
不过,因为该 daemon 的执行档所需要加的参数太多了!举例来说,你可以使用『man syslogd』及
『man sshd』来查阅一下该 daemon 要启动时的设定参数!
为了克服这样的困扰,所以各主要 Linux distributions 都会针对该服务设计一个比较亲和的 shell script 来进行启动的程序啊!那就是 /etc/init.d/ 底下的档案,以及 /etc/xinetd.d/ 底下的设定数据。因此,启动服务的方法就变得很简单了。 只要设定好该服务的配置文件,然后下达: 1. 启动 stand alone 服务的方式:以 syslog 为例: [root@linux ~]# /etc/init.d/syslog start 2. 启动 super daemon 服务的方式:以 telnet 为例: [root@linux ~]# vi /etc/xinetd.d/telnet (设定方式参考下节) [root@linux ~]# /etc/init.d/xinetd restart [root@linux ~]# service [service name] (start|stop|restart|...) 参数: service name:亦即是需要启动的服务名称,需与 /etc/init.d/ 对应; start|... :亦即是该服务要进行的工作。 范例: 范例一:重新启动 crond 这支 daemon : [root@linux ~]# service crond restart [root@linux ~]# /etc/init.d/crond restart Tips: 事实上,在 Linux 系统中,要『开或关某个 port 』,就是需要『 启动或关闭某个服务』啦!因此,你可以找出某个 port 对应的服务,程序对应的服务, 进而启动或关闭他,那么那个经由该服务而启动的 port ,自然就会关掉了! 鸟哥的图示 大标题的图示解析 super daemon 的配置文件
前面提到,Super daemon 就是一支总管许多服务的 daemon ,这支 daemon 在 FC4 上面即是 xinet 啰〜
通常我们也称呼为 xinetd 啦〜这支 daemon 来管理许多的服务是有好处的,
最大的优势就是『安全性较高!』。怎么说呢?因为 super daemon 可以透过额外的数据分析,
来管理谁可以、谁不能使用某个服务,因此,多了一道类似防火墙的手续,自然就能够比较安全一些啦。
而且他还可以记录该服务的使用状态,也可以记录错误登入的信息,用在管理一些比较危险的服务上面,
确实有他的必要性啦!
底下我们就来谈一谈,这个 super daemon 到底是如何分析的, 当然,就得要先谈一谈,这个 xinetd 的主要预设参数档: /etc/xinetd.conf 啰〜 小标题的图示解析 xinetd.conf
先来看一看预设的 /etc/xinetd.conf 这个档案的内容是什么吧!
[root@linux ~]# vi /etc/xinetd.conf # # Simple configuration file for xinetd # # Some defaults, and include /etc/xinetd.d/ defaults { instances = 60 <==同一服务的同时联机数最多可达 60 个 log_type = SYSLOG authpriv <==登录后,会被纪录到登录文件的信息 log_on_success = HOST PID <==若成功的登入时,记录的信息有哪些? log_on_failure = HOST <==若登入失败,则记录的信息又是如何? cps = 25 30 <==同一秒钟内最大联机数量为 25 个,若超过 25 个, 则该服务会暂时停止 30 秒! } includedir /etc/xinetd.d <==更多的设定值在 /etc/xinetd.d 那个目录内 既然这只是个预设参数档,那么自然有更多的服务参数档案啰〜没错〜而所有的服务参数档都在 /etc/xinetd.d 里面,这是因为上表当中的最后一行啊!这样瞭了吧! ^_^。 那么每个参数档案的内容是怎样呢?一般来说,他是这样的: service <service_name>
{
<attribute> <assign_op> <value> <value> ...
.............
}
+= : 表示后面的设定为『在原来的设定里头加入新的参数』 -= : 表示后面的设定为『在原来的参数舍弃这里输入的参数!』 attribute
(功能) assing_op (允许的动作) 说明与范例 一般设定项目:
disable
yes
no 允许该 server 可以执行或者是不能执行!当设定为 yes 表示该服务不能执行! 这个设定是一定要的啦。如果我想要启动某个服务,那么这里就要设定成为:
disable = no socket_type
stream
dgram raw stream 为联机机制较为可靠的 TCP 封包,若为 UDP 封包则使用 dgram 机制。 raw 代表 server 需要与 IP 直接对谈!例如 telnet 使用 TCP ,所以: socket_type = stream protocol
tcp
udp .... 这个东西说的是,联机的状态使用的是哪一种协议!?各个协议的代号可以参考 /etc/protocols 内容!此外,除非是你自己设定的服务,否则这个可以不用设定啦! wait
yes
no 这就是我们刚刚提到的 Multi-threaded 与 single-threaded 的方式啦!一般来说,我们希望大家的要求都可以同时被启用,所以可以设定 wait = no user
UID
root 还记得我们在 账号管理 那一篇提到的 UID 概念吗?对啦!这个 UID 就是那个 UID 啦!要注意的是,假如你的服务启动者不要以 root 为主的话,那么这个地方就可以改变其他的使用者,例如 nobody !这个咚咚也会有安全防护的机制存在!此外,需要注意这个 UID 必须存在于 /etc/passwd 。 group
GID
跟 user 的意思相同!只是这个 GID 的使用者也必须存在于 /etc/group 当中!
instances
number
UNLIMITED 这个是『在同一时间之内,同一个服务可以允许的联机数目』的意思, 你可以写入一个『数字』来控制联机数目,也可以使用 UNLIMITED 来告诉系统『没有上限』啰!例如你在同时段之内仅允许 ftp 联机有 30 个,那么这里就可以输入 30 啦! nice
-20 ~ 19
还记得我们在 程序管理 里面谈到的那个 nice
指令吗?!对啦!这里就是这个东西啰!数字越小( 负值 )代表该程序越优先被执行!
server
program
完整檔名 这个就是指出这个服务的启动程序!例如要启动 telnet 的话,其实就是 in.telnetd 这支程序啦!所以这个时候在这里输入 server = /usr/sbin/in.telnetd server_args
program
一些参数 这里应该输入的就是你的 server 那里需要输入的一些参数啦!例如 in.telnetd 当中,我们还可以加入某些参数! log_on_success
PID
HOST USERID EXIT DURATION 在『成功登入』之后,需要记录的项目:PID 为纪录该 server 启动时候的 process ID , HOST 为远程主机的 IP、USERID 为登入者的账号、EXIT 为离开的时候记录的项目、 DURATION 为该使用者使用此服务多久? log_on_failure
HOST
USERID ATTEMPT RECORD 当登入失败之后被 syslog 登入的项目:HOST为远程主机的 IP,USERID为登入者账号、 ATTEMPT为记录登入失败者企图的意图为何、RECORD为记录远程主机的信息!以及为何本机 server 不能启动的原因!主要有 login, shell, exec, finger 等指令可以使用在这里!( 基本上,可以在 /etc/hosts.allow 或 /etc/hosts.deny 书写内容 )。 进阶设定项目:
env
'name=value'
这一个项目可以让你设定环境变量,环境变量的设定规则可以参考
认识 BASH Shell 。
port
number
这里可以设定不同的服务与对应的 port ,但是请记住你的 port 与服务名称必须与
/etc/services 内记载的相同才行!
redirect
IP_Address port
将 client 端对我们 server 的要求,转到另一部主机上去!呵呵!这个好玩呦!
例如当有人要使用你的 ftp 时,你可以将他转到另一部机器上面去!那个 IP_Address
就代表另一部远程主机的 IP 啰!
includedir
directory
表示将某个目录底下的所有档案都给他塞进来 xinetd.conf 这个设定里头!这东西有用多了,
如此一来我们可以一个一个设定不同的项目!而不需要将所有的服务都写在 xinetd.conf
当中!你可以在 /etc/xinetd.conf 发现这个设定呦!
安全控管项目:
bind
IP_Address
这个是设定『允许使用此一服务的适配卡』的意思!举个例子来说,你的 Linux
主机上面有两个 IP ,而你只想要让 IP1 可以使用此一服务,但 IP2
不能使用此服务,这里就可以将 IP1 写入即可!那么 IP2 就不可以使用此一 server 啰
interface
IP_Address
与 bind 相同
only_from
0.0.0.0
192.168.1.0/24 host_name domain_name 这东西用在安全机制上面,也就是管制『只有这里面规定的 IP 或者是主机名可以登入!』如果是 0.0.0.0 表示所有的 PC 皆可登入,如果是 192.168.1.0/24 则表示为 C class 的网域!亦即由 192.168.1.1 ~ 192.168.1.255 皆可登入!另外,也可以选择 domain name ,例如 .ev.ncku.edu.tw 就可以允许成大环工系的网域 IP 登入你的主机使用该 server ! no_access
0.0.0.0
192.168.1.0/24 host_name domain_name 跟 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。 OK!我们就利用上面这些参数来架构出我们所需要的一些服务的设定吧! 参考看看底下的设定方法啰! ^_^ 小标题的图示一个简单的 telnet 范例设定
我们说过,使用 super daemon 来管理主机,最大的优点就是多了一道管理的手续,
所以,可以进行比较多的监控动作,像上一个小节我们提到的相关参数当中,
就能够发现到一些端倪了。在这里,我们举个简单的例子来说明一下整个 super daemon
的管理吧!但是要设定 telnet 的话,就得要安装 telnet 才行。
在 FC4 的版本上,我们安装的是 telnet-server-0.17-35 这个套件资料,
请您先以 rpm 的方式 来安装喔! ^_^
在预设的 /etc/xinetd.d/telnet 内容是这样的: [root@linux ~]# vi /etc/xinetd.d/telnet service telnet { flags = REUSE <==额外的参数使用 REUSE socket_type = stream <==使用 TCP 的封包格式 wait = no <==可以有多个联机同时连进来 user = root <==启动者预设为 root server = /usr/sbin/in.telnetd <==使用的是这支程序! log_on_failure += USERID <==若登入错误,『加计』记录用户 ID disable = yes <==此服务预设关闭! }
[root@linux ~]# vi /etc/xinetd.d/telnet # 先针对对内的较为松散的限制来设定: service telnet { disable = no <==预设就是启动 telnet 服务 bind = 192.168.1.100 <==只允许经由这个适配卡的封包进来 only_from = 192.168.1.0/24 <==只允许 192.168.0.0/24 这个网段 的主机联机进来使用 telnet 的服务 no_access = 192.168.1.{120,130} <==不许这些 PC 登入 instances = UNLIMITED <==同时允许联机不限制! nice = 0 <==使用的优先级较高 flags = REUSE <==额外使用的参数 socket_type = stream <==使用 tcp 封包常用的联机型态 wait = no <==不需等待,可以同时允许多个联机 user = root <==启动程序的用户身份 server = /usr/sbin/in.telnetd<==服务启动的程序 server_args = -a none <==上面那个程序的参数 log_on_failure += USERID <==错误登入时,要记录下来的内容 } # 再针对外部的联机来进行限制呢! service telnet { disable = no <==预设就是启动 telnet 服务 bind = 140.116.44.125 <==只允许经由这个适配卡的封包进来 only_from = 140.116.0.0/16 <==只允许 140.116.0.0 ~ 140.116.255.255 这个网段联机进来使用 telnet 的服务 only_from += .edu.tw <==累加设定,只有教务界才能联机! access_times = 1:00-9:00 20:00-23:59 <==每天只有这两个时段开放服务 umask = 022 <==建立档案时的默认属性设定 instances = 10 <==同时只允许 10 个联机 nice = 10 <==使用的优先级较低 flags = REUSE <==额外使用的参数 socket_type = stream <==使用 tcp 封包常用的联机型态 wait = no <==不需等待,可以同时允许多个联机 user = root <==启动程序的用户身份 server = /usr/sbin/in.telnetd<==服务启动的程序 server_args = -a none <==上面那个程序的参数 log_on_failure += USERID <==错误登入时,要记录下来的内容 } # 如果您的 telnet 本来就有启动的话,那么会发现有一个联机存在你的系统中 [root@linux ~]# netstat -tulnp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:23 0.0.0.0:* LISTEN 19255/xinetd # 看到喔!是 xinetd 的 program name 呢! # 重新修改 /etc/xinetd.d/telnet 之后,重新启动的方式与观察为: [root@linux ~]# /etc/init.d/xinetd restart [root@linux ~]# netstat -tulnp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 140.116.44.125:23 0.0.0.0:* LISTEN 19281/xinetd tcp 0 0 192.168.1.100:23 0.0.0.0:* LISTEN 19281/xinetd # 有没有看到两个接口啊〜而且, PID 会是同一个呢! 大标题的图示TCP_Wrappers
事实上,除了使用 xinetd 的配置文件来设定安全机制之外,
我们还可以利用额外的机制来抵挡某些不受欢迎的数据源喔!
那就是 /etc/hosts.allow 以及 /etc/hosts.deny 这两个档案的功能啦!
这两个档案可以藉由分析:
其实, /etc/hosts.allow 与 /etc/hosts.deny 是 /usr/sbin/tcpd 的配置文件, 而这个 /usr/bin/tcpd 则是用来分析进入系统的 TCP 封包的一个软件,他是由 TCP Wrappers 所提供的。 那为什么叫做 TCP_Wrappers 呢?那么 wrappers 有包裹的意思,所以说,这个套件本身的功能就是在分析 TCP 网络数据封包啦!那么刚刚我们稍微提到我们网络的封包数据主要是以 TCP 封包为主,这个 TCP 封包的文件头至少记录了来源与目主机的 IP 与 port ,因此,若藉由分析 TCP 封包,就可以比对看我要不要让这个数据进入到主机里面来啰!所以啦,我们要使用 TCP_Wrappers 来控管的,就是:
那么这两个档案是干嘛用的?刚刚不是提过哪!他主要是用来规范 TCP 封包的规则的,所以呢, 里面记录的当然就是:『某些 IP 在特定服务中是否能够进入主机』!那么要怎么写? 这两个档案的内容基本的语法是: <service(program_name)> : <IP, domain, hostname> : <action> [root@linux ~]# vi /etc/hosts.deny
in.telnetd : 140.116.44.202 140.116.32.0/255.255.255.0 : deny
[root@linux ~]# vi /etc/hosts.deny
in.telnetd : 140.116.44.202 : deny
in.telnetd : 140.116.32.0/255.255.255.0 : deny
[root@linux ~]# vi /etc/hosts.allow in.telnetd: 140.116.44.0/255.255.255.0 in.telnetd: 140.116.79.0/255.255.255.0 in.telnetd: 140.116.141.99 in.telnetd: LOCAL [root@linux ~]# vi /etc/hosts.deny in.telnetd: ALL
[root@linux ~]# vi /etc/hosts.deny in.telnetd: 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" ) 大标题的图示系统开启的服务
好了,现在假设您已经知道了 daemons 的启动档案放置的目录,也知道了服务与
port 的对应,那么要如何查询目前系统上面已经启动了的服务呢?不要再打混了!已经学过了
ps 与 top
应该要会应用才对耶!呵呵!没错,可以使用 ps 与 top 来找寻已经启动了的服务的程序与他的
PID 呢!不过,我们怎么知道该服务启动的 port 是哪一个?呵呵!好问题!可以直接使用
netstat 这个网络状态观察指令来检查我们的
port 呢!甚至他也可以帮我们找到该 port 的程序呢( PID )!这个指令的相关用途,我们在
程序与资源管理 那一章已经讲过了,
不清楚的话请回去查一查先〜这里仅介绍如何使用喔〜
小标题的图示观察系统启动的服务:
观察系统已启动的服务方式很多,不过,我们最常使用 netstat 来观察。
基本上,以 ps 来观察整个系统上面的服务是比较妥当的,因为他可以将全部的 process 都找出来。
不过,我们比较关心的,还是在于有启动网络监听的服务啊,所以,
鸟哥会比较喜欢使用 netstat 来查阅啦。
范例一:找出目前系统开启的『网络服务』有哪些? [root@linux ~]# netstat -tulp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 *:ftp *:* LISTEN 1605/vsftpd tcp 0 0 *:pop3 *:* LISTEN 1613/dovecot tcp 0 0 *:ssh *:* LISTEN 1587/sshd udp 0 0 *:bootpc *:* 26035/dhclient # 看一看上头,Local Address 的地方会出现主机名与服务名称, # 要记得的是,可以加上 -n 来显示 port number ,而服务名称与 port # 对应则是写在 /etc/services 里头喔! 范例二:找出所有的有监听网络的服务 (包含 socket 状态): [root@linux ~]# netstat -lnp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 *:ftp *:* LISTEN 1605/vsftpd tcp 0 0 *:pop3 *:* LISTEN 1613/dovecot tcp 0 0 *:ssh *:* LISTEN 1587/sshd udp 0 0 *:bootpc *:* 26035/dhclient Active UNIX domain sockets (only servers) Proto RefCnt Flags Type State I-Node PID/Program name Path unix 2 [ ACC ] STREAM LISTENING 5188 1673/master private/tlsmgr unix 2 [ ACC ] STREAM LISTENING 5192 1673/master private/rewrite ......以下省略...... # 仔细的瞧一瞧啊,除了原有的网络监听 port 之外,还会有 socket 显示在上面, # 我们可以清楚的知道有哪些服务被启动呢! 范例三:观察所有的网络连接状态,查询是否有异常的联机。 [root@linux ~]# netstat -anp # 利用这个指令可以查出有问题的联机,还可取得 PID, # 可以用来 kill 掉任何一个觉得怀疑的程序呢! 另外,除了已经存在系统当中的 daemon 之外,如何在一开机就完整的启动我们所需要的服务呢? 底下我们就来谈一谈 chkconfig 及 ntsysv 这两个好用的东西! 小标题的图示设定开机后立即启动服务的方法:
就如同上面提到的,我们使用 netstat 仅能观察到目前已经存在于系统当中的 daemon ,使用
service 这个指令或者是 /etc/init.d/* start 的方法,
仅能在目前的环境下启动某个服务而已。那么重新启动后呢?该服务是否还是继续的自动启动?
这个时候我们就得要复习一下,到底我的 Linux 主机是怎么开机的呢?
至于另一个也可以在开机时启动的档案,那就是 /etc/rc.d/rc.local 这个档案喔! 你可以将任何想要在开机时启动的程序写入到这个档案当中,这个档案是以 shell script 的语法写成的,所以你可以轻易的就设定好你想要启动的数据了! ^_^ 好了,既然如此的话,那么我是否要使用 ln 去到 /etc/rc.d/rc[0-6].d 当中设定相关的服务呢? 不需要的,因为我们 Fedora 有提供两个好用的指令来达成这个功能啊!那就是 chkconfig 与 ntsysv 喔! [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 下启动 (on) 或关闭 (off) 范例: 范例一:列出目前系统上面所有被 chkconfig 管理的服务 [root@linux ~]# chkconfig --list |more NetworkManager 0:off 1:off 2:off 3:off 4:off 5:off 6:off .....中间省略..... snmpd 0:off 1:off 2:off 3:off 4:off 5:off 6:off yum 0:off 1:off 2:off 3:off 4:off 5:off 6:off xinetd based services: chargen: off .....中间省略..... telnet: off # 这个 chkconfig 的输出主要分为两大部分,分别是 stand alone 的服务, # 他会分出 0~6 个 run level 的资料,亦即上半部的显示,至于下半部则是 # super daemon 管理的服务的输出情况!由 super daemon 管理的服务, # 是没有 run level 之分的喔! 范例二:显示出目前在 run level 3 为启动的服务 [root@linux ~]# chkconfig --list | grep '3:on' 范例三:让 atd 这个服务在 run level 为 3, 4, 5 时启动: [root@linux ~]# chkconfig --level 345 atd on 既然这个玩意儿这么好用,那么我们可否将自己建立的服务给他加入 chkconfig 的管理当中? 当然可以啊!只是该服务必须要加入 init 可以管理的 script 当中,亦即是 /etc/init.d/ 当中才行。 举个例子,我们在 /etc/init.d/ 里面建立一个 myvbird 档案, 该档案仅是一个简单的服务范例,基本上,没有任何用途.... 对于该档案的必须性是这样的:
[root@linux ~]# vi /etc/init.d/myvbird #!/bin/bash # chkconfig: 35 80 70 # description: 没啥!只是用来作为练习之用的一个范例 echo "Nothing" # 这个档案很好玩喔!你可以参考你自己系统上面的档案; # 基本上,比较重要的是第二行,他的语法是: # chkconfig: [runlevels] [start number] [stop number] # 其中, runlevels 为不同的 run level 状态, start number 与 # stop number 则是在 /etc/rc.d/rc[35].d 内建立以 S80myvbird # 及 K70myvbird 为档名的设定方式! [root@linux ~]# chkconfig --add myvbird [root@linux ~]# chkconfig --list myvbird myvbird 0:off 1:off 2:off 3:on 4:off 5:on 6:off # 看吧!加入了 chkconfig 的管理当中了!再去看看 /etc/rc.d/ 底下的档案: [root@linux ~]# find /etc/rc.d/ -type l | grep 'myvbird'|sort /etc/rc.d/rc0.d/K70myvbird /etc/rc.d/rc1.d/K70myvbird /etc/rc.d/rc2.d/K70myvbird /etc/rc.d/rc3.d/S80myvbird /etc/rc.d/rc4.d/K70myvbird /etc/rc.d/rc5.d/S80myvbird /etc/rc.d/rc6.d/K70myvbird # 很有趣吧!如果要将这些数据都删除的话,那么就下达这样的情况: [root@linux ~]# chkconfig --del myvbird [root@linux ~]# rm /etc/init.d/myvbird
基本上, chkconfig 真的已经很好用了,不过,我们的 Fedora 还有提供一个更不错用的,
那就是 ntsysv 了!注意喔, chkconfig 很多的 distributions 都存在,但是 ntsysv
则是 Red Hat 系统特有的!
[root@linux ~]# ntsysv [--level <levels>] 参数: --level :后面可以接不同的 run level ,例如 ntsysv --level 35 范例: 范例一:直接编辑目前 run level 底下的开机默认启动项目: [root@linux ~]# ntsysv 小标题的图示各个服务的简单说明
随着 Linux 上面软件支持性越来越多,加上自由软件蓬勃的发展,
我们可以在 Linux 上面用的 daemons 真的越来越多了。所以,想要写完所有的 daemons
几乎是不可能的,因此,鸟哥这里仅介绍几个很常见的 daemons 而已,
更多的信息呢,就得要麻烦您自己使用 ntsysv 或者是 vi /etc/init.d/* 里面的档案去瞧一瞧啰〜 ^_^
Stand Alone Daemons
服务名称
基本说明
anacron
当你的 Linux 主机并不是全天候开机的时候,这个 anacron 就可以帮你执行在『
crontab 』既定的时间内没有执行的工作!举个例子来说,当你的主机在晚上
12:00 会自动关闭,但是偏偏 crontab 这个例行性工作是在 4:00 工作,
这个时候例行性工作不是都没有做到吗?嗯! anacron 就可以使用啦!
apmd
apmd 是 Adventage Power Management daemon 的缩写,顾名思义,可以用来了解系统的『电池电量』,
如果对于手提式计算机才有需要吧我想!
atd
这个总该不陌生了吧!就是 仅进行一次的工作排程啰!
如果忘记了!赶紧去查看一下!
autofs
如果你的 Linux 是用来做为服务器的,那么这个服务就不需要启动了。
因为这个服务可以自动挂载很多的文件系统与装置,举例来说,自动挂载光盘啊、USB硬盘啊等等的。
如果是主机,我们可以自己好好的控制,不需要系统自动挂载。如果是个人桌面计算机,
那么启动这个 daemon 也不错!
crond
用来执行例行性命令的 daemon ,请务必要启动他!
cups
这个服务在管理 Linux 主机上面的打印机的!
他可以用来作为本机打印机的管理,也可以用来管理网络打印机,
全名为 Common UNIX Printing System (CUPS)。如果您的网络环境当中有打印机,
而且想要透过 Linux 来提供给所有用户使用,那么就可以管理一下 cups 啰〜
gpm
在文本模式里面可以使用 mouse 来从事『复制、贴上、移动光标』等等的功能!
如果你是个教师,需要使用鼠标在纯文本接口底下秀出结果的话,
再使用这玩意就好了。基本上,不需要启动他!
httpd
这个玩意儿可有趣的很哩〜一般来说,新手最喜欢架设 Web 网站啰,
而 WWW 服务器,就是这个玩意儿啊〜更详细的信息请参考服务器篇的内容
iptables
这个家伙就是 Linux 上面有名的『防火墙』啦〜如果你的 Linux 是在区网内,
而且没有连上 Internet 的话,那么这个防火墙机制可以暂时不要启动,
因为可能会抵挡掉你主机所提供的服务。如果连上了 Internet ,不开这个,
会死的很惨〜
kudzu
这个 daemon 预设是启动的,他会在开机的时候去侦测你的硬件,
如果发现硬件有异动,或者是有新增其他的硬件,
那么 kudzu 服务会主动的以 Fedora 相关的设定软件来设定你的新硬件。
不过,对于稳定的系统来说,实在没有必要在开机的时候侦测一次硬件,因为....很慢〜
named
这是个很复杂的玩意儿,那就是 DNS (Domain Name System)。除非你真的很了解 DNS,
否则这个服务不需要启动的!
netfs
这个服务在自动的挂载 /etc/fstab 里头记录的关于网络文件系统,如 NFS, SMB (网芳)
等等,如果你的主机本身并没有挂载来自网络上的 filesystem,不需要启动。
network
看檔名就知道啦!是用来管理网络的,所以,当然要启动了。
不论你有没有网络卡,这个服务都要启动,因为至少 network 会驱动 lo 这个网络接口。
更多的网络相关信息,参考服务器篇的内容。
nfs
nfslock NFS 为 Network File System 的缩写,我们会在服务器篇谈这个服务,
一般来说,不需要启动这个玩意儿〜
ntpd
这个服务的全名是:Network Time Protocol,意思就是在进行网络校时的一个服务。
一般来说,不需要启动他。
portmap
这个咚咚与很多 RPC 的服务有关,例如 NFS 等等。一般来说,如果你的 Linux 尚未连上 internet,
这个服务不需要启动。不过,为了方便起见,各主要 linux distributions 都预设启动这个服务的。
鸟哥通常是关掉他!哈哈!
postfix
sendmail 这个就是邮件服务器啦!由于近来网络垃圾大增,所以,目前所有的 Linux distributions
预设都要启动 postfix 之类的邮件服务器后,我们发出的信件才会接收或者是传送。
预设的情况下,一定会有一个邮件服务器启动的,不要关闭他〜
否则我们主机上面的账号彼此之间无法以 email 传送数据喔!
smb
这个服务其实就是仿真 Linux 成为 Windows 的网络上的芳邻上头的主机啦〜
由于我们还没有连上 Internet 啊,所以自然不需要启动他啦〜
sshd
这个是取代 telnet 的远程联机服务器 daemon ,几乎所有的 Linux distributions 预设都会启动他〜
我们也可以透过这个玩意儿让远程主机联机进来啊!所以当然是启动的啊!
syslog
这个是登录文件记录的一个重要的 daemon ,没有他,你的主机几乎没有事后监控的功能〜
所以请务必启动。我们会在 认识登录档 当中来谈这个咚咚〜
xfs
X Font Server, xfs,顾名思义,他是用来管理 X Window 的字形的一个服务,
如果你是 run level 5 ,或者是想要启动 X Window 的话,那么这个玩意儿就不能不启动。
不过,如果你跟鸟哥一样都是使用纯文本接口的话,这个玩意儿不用启动啦!
xinetd
刚刚上头才讲过这个玩意儿,不会就忘了吧?务必启动喔!
Super Daemons
chargen
chargen-udp 主要的功能在于提供类似远程打字的咚咚吧!
daytime
daytime-udp 用来作为 daytime 的服务,这是 NTP (Network Time Protocol) 的上一代,
目的在进行时间的校正工作。不过,因为他不会计算网络联机过程当中的迟滞时间,
并且是以明码传送,因此除了特殊目的外,目前已经很少使用这玩意儿了
krb5-telnet
用来取代传统的 telnet 服务!可提供 krb 5 的验证机制。
gssftp
用来取代传统的 ftp server,可提供 krb 5 的验证机制
大标题的图示本章习题练习 ( 要看答案请将鼠标移动到『答:』底下的空白处,按下左键圈选空白处即可察看 )
使用 n 时, netstat 就不会使用主机名与服务名称 (hostname & service_name) 来显示,
取而代之的则是以 IP 及 port number 来显示的。IP 的分析与 /etc/hosts 及 /etc/resolv.conf 有关,
这个在未来服务器篇才会提到。至于 port number 则与 /etc/services 有关,请自行参考喔! ^_^
最简单的方法,就是直接将 /usr/local/sbin/backup.sh 这整个指令写入
/etc/rc.d/rc.local 档案当中即可!
2002年07月10日:第一次完成 2003年02月11日:重新编排与加入 FAQ 2005年10月03日:将原本旧版的数据移动到 此处 。 2005年10月12日:经过一段时间的修订,将原本在 系统设定工具 的内容移动到此, 并新增完毕! |
|
本网页主要以Firefox配合解析度 1024x768 作为设计依据 鸟哥自由软件整合应用研究室