认识系统服务daemons(转摘资料)

来源:互联网 发布:淘宝买药品提交需求 编辑:程序博客网 时间:2024/06/16 08:39

什么是 daemon
  如果您常常上网去查看一些资料的话,尤其是关于 Unix-Like 的相关作业系统,如 FreeBSD, Unix, Linux 等等,应该会常常听到 daemons 这个字眼,那么 daemon 是什么东西呀!?怎么这么常被见到?呵呵,Daemon 的字面上的意思就是『守护神、恶魔?』还真是有点奇怪呦! ^_^"" 。基本上,我们的 Linux 主机常常会收到一些要求,不论是来自本机系统的要求或者是网路 Client 端的服务要求,反正只要有要求来的时候,通常就是各式各样的 daemons 负责去唤起应该要工作的 Servers 来工作啦!那么 daemons 目前有两种基本的模式,分别是 stand_alone 与 super daemon 两种方式,底下就来说一说这两种 daemon 的工作型态:
  ·stand_alone : 就字面上的意思来说,stand alone 就是『独立的启动』的意思,也就是说,该 daemon 启动之后,就直接常驻在记忆体当中啰!他虽然会一直的占用系统的资源,但最大的优点就是,他会一直启动的啦!所以当有要求来的时候,他就会很快速的回应啰!常常用在这一种 daemon 的网路服务如常见的 httpd 这一个即是一例!
  ·super daemon : 相对于 stand alone 的执行方式,这一种服务的启动方式则是藉由统一的一个 daemon 来负责唤起该服务!这一个统一负责的 daemon 就是 inet 这支服务啦!而在 Red Hat 7.x 以后则是使用 xinet 这个设定啰!当有网路的服务要求来的时候,该要求会先送给 inet 这个服务,然后 inet 根据该网路要求送来的资料封包的内容 ( 该内容会记录 IP 与 port ) 来将资料封包送给实际运作的服务!而该服务这个时候才会启动的!最常见到的就是 ftp 这支网路服务啦!这种最大的优点就是当没有资料封包来的时候,该服务不会一直占据系统资源 ( 该服务会在 sleeping 的状态吧! ) ,但是相对的,他的反应时间也会比较慢,因为还要花费一段时间去『唤醒』该服务呀!
  那么这两种启动的方式哪一个比较好呢?见仁见智啦!而且还要看该主机的工作负荷与实际的用途说!例如当你的主机是用来作为 WWW 伺服器的,那么 httpd 自然就以 stand alone 的启动方式较佳!事实上,我们常常开玩笑的说明 stand alone 与 super daemon 的情况,以银行的窗口来作为说明的范例!
  ·stand alone : 在银行里面,假设有一种单一服务的窗口,例如存钱窗口,所以,当你需要存钱的时候,直接前往该窗口,就有『专人』为您服务啦!
  ·super daemon : 在银行里面假设还有另外一种复合型态的窗口,同时提供转帐、资金调度、提款等等的业务,那当你需要其中一项业务的时候,就需要前往该窗口,但是坐在窗口的这个人,拿到你的需求单之后,往后面一丢『喂!那个转帐的仁兄!该你的工作了』那么那个仁兄就开始工作去!然而里头还有资金调度与提款等负责业务的仁兄呢?他们在干嘛?嘿嘿!看看报、喝喝茶啰!那么这里就会引出另外一个问题啦!假设银行今天的人潮特别的汹涌,所以这个窗口后面除了你之外还有很多的人!那么想一想,这个窗口是要『一个完成再来下一个』还是『全部都把你们的单据拿来,我全部处理掉』呢?呵呵!是不是不太一样?
  omulti-threaded:就是我们提到的,全部的客户之要求都给他拿来,一次给他交办下去,所以一个服务同时会负责好几个程序。
  osingle-threaded : 这个就是目前我们『人类的银行』最常见的方式啦,不论如何,反正一个一个来,第一个没有处理完之前,后面的请排队!嘿嘿!所以如果 client 的要求突然大增的话,那么这些晚到的 client 可得等上一等!
  另外,需要注意的是,既然银行里头有这两种窗口同时存在,所以啰,在 Linux 系统里面,这两种 daemon 是可以同时存在的啦!也就是说,某些服务可以使用 stand alone 来启动,而有其他的服务则可以使用 inet ( 或者是 xinet ) 大致的情况就是这样啦!了呼!?
  OK!这个时候就又发生了另一个问题啰!那么我怎么知道要将我的资料送到那个窗口去!咦!那个窗口不是有写说明说他是干嘛用的吗?!嘿嘿!那个就可以称做是 port 啦!而负责的人员就可以称做 服务 啦!那么在 Linux 系统里面那个档案在说明那个窗口与服务的 ( services and ports ) 对应呢?!呵呵!那就是鼎鼎大名的 /etc/services 这个档案啦!我们取一段常常看到的 port 与相关服务的区段来看一下好了!
  
  # vi /etc/services .... 略 ftp-data 20/tcp ftp-data 20/udp ftp 21/tcp ftp 21/udp ssh 22/tcp # SSH Remote Login Protocol ssh 22/udp # SSH Remote Login Protocol telnet 23/tcp telnet 23/udp smtp 25/tcp mail smtp 25/udp mail nameserver 42/tcp name # IEN 116 nameserver 42/udp name # IEN 116 domain 53/tcp nameserver # name-domain server domain 53/udp nameserver .... 略 < 该服务的说明 >
  像上面说的是,第一栏为 daemon 的名称、第二栏为该 daemon 所使用的 port 号码与其网路资料封包传送时候的类型,主要为较稳定的 tcp 封包与较易破损但较快速之 udp 封包!举个例子说,那个 e-mail 的发信协定为 smtp 这个服务,而这个服务的使用之 port 即为 25 啦!就这样!
  ·请特别注意!虽然有的时候您可以藉由修改 /etc/services 来更改一个服务的 port 号,不过并不建议如此做,因为很有可能会造成一些协定的错误情况!这里特此说明一番呦!(除非您要架设一个地下网站,否则的话,使用 /etc/services 原先的设定就好啦!)
  Daemon 的命名规则:
  这个地方也没有什么好说的啦!呵呵!基本上, Linux 系统里面,只要是 daemon 之类的服务项目,他的启动的名称都会多加上一个 d 字样!例如我们之前在 认识登录档 里面提到的 syslog 这个登录档服务,他的服务启动名称就是 syslogd 啦!而 例行性命令的建立 当中提到的 at, cron 服务呢?嘿嘿!没错,他们的服务名称就称为 atd, crond 啰!这样了解了吗?!
  
  系统的 Daemons 放在哪里:
  好了!那么我们已经知道了 daemon 的作用之后,再来要讨论的是,那么他们启动的 scripts 是放在哪里呀!?呵呵!底下就来说一说啰:
  ·stand alone : 这个放置在 /etc/rc.d/init.d/ 这个目录里面,几乎所有的 RPM 安装的套件之启动项目都在这里啦!
  ·super daemon : 这个工作的那一支服务其实就是 xinet 或者是 inet 啦!请注意, xinet 也是一个 daemon 呢!他是 stand alone 启动的,也就是他会一直在监听大家的需求,所以 xinet 的启动 scripts 写在 /etc/rc.d/init.d/xinetd 这个 scripts 里面啰!但是挂在这个 daemon 里头的服务之设定项目呢?嗯!就是写在 /etc/xinetd.conf 与 /etc/xinetd.d/ 这个目录里面的任何档案!
  /etc/rc.d/init.d/*
  OK!先来了解一下 stand alone 的 daemon 是怎么启动的呢?!很简单,假如我们要启动 syslog 这支记录登录档的服务,那么要启动他的话,就直接下达:
  ·/etc/rc.d/init.d/syslog start
  ·service syslog start
  亦即是档名之后加上 start 即可,或者是使用 Red Hat 才有的这个 service script 来进行启动的功能!如果你还记得我们前几节提到过的 shell scripts 的话,那么或许还记得 case ..... esac 这个有选择性的项目的语法吧!?没错!这几支服务就是以 bash scripts 里头的 case 语法写成的!因此,只要加上后面的参数,如此一来, scripts 就会自动的去找寻执行档来执行啰!如果有兴趣的话,可以在你的系统里面的该目录下开一个档案来观看一下,就知道如何写啰!
  /etc/xinetd.conf
  这个档案就是设定 xinet 服务的参数档案啦!
  /etc/xinetd.d/*
  这个目录里面的所有档案就是个别挂上 xinet 的所有服务啦!例如赫赫有名的 wu-ftpd 及 telnet 与 pop3 等等!
  
  了解一下 xinetd.conf
  我们先来看一看预设的情况之下, xinet 开启的情况为何?
  
  # # Simple configuration file for xinetd # # Some defaults, and include /etc/xinetd.d/ defaults { instances = 60 log_type = SYSLOG authpriv log_on_success = HOST PID log_on_failure = HOST cps = 25 30 } includedir /etc/xinetd.d
  service { ... ... }
  在上面的预设范例当中,说明的是:『如果没有指定的 services ( defaults ) 那么就用 {} 里面的设定来执行之!』正常的情况之下有点像上面例子中的黄色字体所示,那个 <> 里头的资料我们先来说明一下:注:那个 assign_op 主要有三种形式,分别如下:
   = : 表示后面的设定参数就是这样啦!
   = : 表示后面的设定为『在原来的设定里头加入新的参数』
  - : 表示后面的设定为『在原来的参数舍弃这里输入的参数!』
  用途不太相同,敬请留意呦!好了!底下再来说一说那些 attribute 与 value !
  
  attribute (功能)assing_op (允许的动作)说明 (范例)
  一般设定项目:
  disableyes no允许该 server 可以执行或者是不能执行! 当设定为 yes 表示该服务不能执行!
  socket_typestream dgram raw当连线为 TCP 封包时,则使用 stream 类型 当连线为 UDP 封包时,则使用 dgram 类型 raw 代表 server 需要与 IP 直接对谈!
  protocoltcp udp ...这个东西说的是,连线的状态使用的是哪一种协定!?各个协定的代号可以参考 /etc/protocols 内容!此外,除非是你自己设定的服务,否则这个可以不用设定啦!
  waityes no这就是我们刚刚提到的 Multi-threaded 与 single-threaded 的方式啦!一般来说,我们希望大家的要求都可以同时被启用,所以可以设定 wait = no
  userUID root还记得我们在 帐号管理 那一篇提到的 UID 概念吗?对啦!这个 UID 就是那个 UID 啦!要注意的是,假如你的服务启动者不要以 root 为主的话,那么这个地方就可以改变其他的使用者,例如 nobody !这个咚咚也会有安全防护的机制存在!此外,需要注意这个 UID 必须存在于 /etc/passwd 。
  groupGID跟 user 的意思相同!只是这个 GID 的使用者也必须存在于 /etc/group 当中!
  instancesnumber UNLIMITED这个是『在同一时间之内,同一个服务可以允许的连线数目』的意思,你可以写入一个『数字』来控制连线数目,也可以使用 UNLIMITED 来告诉系统『没有上限』啰!例如你在同时段之内仅允许 ftp 连线有 30 个,那么这里就可以输入 30 啦!
  nice-19 ~ 19还记得我们在 程序管理 里面谈到的那个 nice 指令吗?!对啦!这里就是这个东西啰!数字越小( 负值 )代表该程序越优先被执行!
  serverprogram /usr/sbin/in.ftpd这个就是指出这个服务的启动程式!例如要启动 ftp 的话,其实就是 in.ftpd 这支程式啦!所以这个时候在这里输入 server = /usr/sbin/in.ftpd
  server_args一些参数这里应该输入的就是你的 server 那里需要输入的一些参数啦!例如 in.ftpd 当中,我们可能就需要输入 -l -a 这个参数说!
  log_on_successPID HOST USERID EXIT DURATION在『成功登入』之后,需要记录的项目:PID为纪录该 server 启动时候的 process ID ,HOST 为远端主机的 IP、USERID 为登入者的帐号、EXTI 为离开的时候记录的项目、DURATION 为该使用者使用此服务多久?
  log_on_failureHOST 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 。
  portnumber这里可以设定不同的服务与对应的 port ,但是请记住你的 port 与服务名称必须与 /etc/services 内记载的相同才行!
  redirectIP_Address port将 client 端对我们 server 的要求,转到另一部主机上去!呵呵!这个好玩呦!例如当有人要使用你的 ftp 时,你可以将他转到另一部机器上面去!那个 IP_Address 就代表另一部远端主机的 IP 啰!
  includedirdirectory_path表示将某个目录底下的所有档案都给他塞进来 xinetd.conf 这个设定里头!这东西有用多了,如此一来我们可以一个一个设定不同的项目!而不需要将所有的服务都写在 xinetd.conf 当中!你可以在 /etc/xinetd.conf 发现这个设定呦!
  安全控管项目:
  bindIP_Address这个是设定『允许使用此一服务的介面卡』的意思!举个例子来说,你的 Linux 主机上面有两个 IP ,而你只想要让 IP1 可以使用此一服务,但 IP2 不能使用此服务,这里就可以将 IP1 写入即可!那么 IP2 就不可以使用此一 server 啰!
  interfaceIP_Address跟 bind 相同!
  only_from0.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_access0.0.0.0 192.168.1.0/24 host_name domain_name跟 only_from 差不多啦!就是用来管理可否进入你的 Linux 主机启用你的 server 服务的管理项目! no_access 表示『不可登入』的 PC 啰!
  access_times00:00-12:00 HH:MM-HH:MM这个项目在设定『该服务 server 启动的时间』,使用的是 24 小时的设定!例如你的 ftp 要在 8 点到 16 点开放的话,就是: 08:00-16:00。
  umask000 777 022还记得在 档案权限 里面约略提过的 umask 这个东西吗?呵呵!没错!就是那个鬼玩意儿啰!可以设定使用者建立目录或者是档案时候的属性!系统建议值是 022 。
  当然上面的参数不需要每个都设定啦!只要设定需要的就可以啦!而在 /etc/xinetd.conf 这个档案当中,一定会看到『 includedir = /etc/xinetd.d 』这一行!这说明的是,除了 /etc/xinetd.conf 之外,所有在 /etc/xinetd.d 的档案都是可以用来设定的啦!!好了,我们来举个简单的 ftp 的例子吧!那就是 /etc/xinetd.d/wu-ftpd 这个档案,内容有点像这样:
  
  service ftp {     disable = yes                
<==预设是关闭 ftp     socket_type       = stream       <==使用 TCP 来传送资料     wait          = no         <==不需要等待!亦即所有程序同时处理     user          = root        <==程式启动者为 root     server         = /usr/sbin/in.ftpd <==服务启动的程式     server_args       = -l -a       <==上面那个程式的参数啰!     log_on_success      = DURATION USERID  <==登入成功之后记录的内容     log_on_failure      = USERID      <==错误登入时,要记录下来的内容     nice          = 10         <==程式执行的优先顺序! }
  你可以修改成比较安全与多一点机制:
  
  # 先针对内部网路来设定!可以放宽一点呦! service ftp {     disable       = no           <==预设就是启动啦!     bind        = 192.168.0.254     <==这个服务仅允许 192.168.0.254 这个介面使用     only_from      = 192.168.0.0/24     <==仅允许 192.168.0.1 ~ 192.168.0.255 使用     instances      = UNLIMITED       <==同时允许连线不限制!     socket_type     = stream     wait        = no     nice        = 10     user        = root     server       = /usr/etc/in.ftpd     server_args     = -l -a     log_on_success    = DURATION HOST USERID } # 再针对对外网路来设定,可以设定的严格一点! service ftp {     disable       = no           <==预设就是启动啦!     bind        = 211.74.210.20     <==这个服务仅允许 211.74.210.20 这个介面使用     only_from      = 140.116.0.0/16     <==仅允许 140.116.0.0 这个 B class 使用 ftp     only_from      = .edu.tw        <==仅允许学术网路使用啰!     no_access      = 140.116.32.{10,26}   <==不许这些 PC 登入!     access_times    = 1:00-9:00 20:00-23:59 <==只有每天的两个时段开启这个服务!                             经过我们亲爱的网友 paul.hsieh 与 Vincent                             的热情回报,说明原来的设定有问题,这里                             最好不要有 24:00 的字眼会比较好!所以,                             可以改成像上面的 23:59 的字样!     umask        = 022          <==建立档案时候的预设属性值!     instances      = 10           <==同时仅允许 10 个连线使用 ftp !     socket_type     = stream     wait        = no     nice        = 10     user        = root     server       = /usr/etc/in.ftpd     server_args     = -l -a     log_on_success    = DURATION HOST USERID     log_on_failure    = USERID }
  呵呵!如上面的设定,我们可以将 ftp 的启动项目进行更多的限制!如此一来,将有助于我们的安全防护呢!尤其如果可以针对不同的介面来设定,嘿嘿!就更加的棒啰!
  
  TCP_Wrappers
  好了,接着下来我们要来说一说,除了 xinetd 之外,还有另一个可以抵挡利用某些服务进入 Linux 主机的方法,那就是常常使用的 /etc/hosts.allow 与 /etc/hosts.deny 啰!这个方式是我们常常在使用的方法,这里先提几个比较简单的设定方式,因为未来在网路的防火墙设定阶段,我们会更深入的说明这个咚咚的!
  基本上,如果一个服务是受到 xinet 或 TCP_Wrappers 的控制时,那么该服务就会受限于 hosts.allow 与 hosts.deny 的控管了!而如果你自己安装的套件当中( 亦即使用 Tarball 安装的方式之套件 ),除非有自行定义 --with-tcp_wrappers ,否则就无法使用这个玩意而啰!嘿嘿!
  那么这两个档案是干嘛用的?!别担心,我们来谈一谈他的用法:
  ·当档案 /etc/hosts.allow 存在时,则先以此档案内之设定为准;
  ·而在 /etc/hosts.allow 没有规定到的事项,将在 /etc/hosts.deny 当中继续设定!
  也就是说, /etc/hosts.allow 的设定优先于 /etc/hosts.deny 啰!了解了吗?基本上,只要 hosts.allow 也就够了,因为我们可以将 allow 与 deny 都写在同一个档案内,只是这样一来似乎显得有点杂乱无章,因此,通常我们都是:
  ·允许进入的写在 /etc/hosts.allow 当中;
  ·不许进入的则写在 /etc/hosts.deny 当中。
  那么要怎么写?基本的语法是:
  
   : :
  那个 services 跟你的 xinetd 或者是 /etc/rc.d/init.d/* 里面的咚咚要相同,例如你不许 ftp 被进入,并且所有的服务都不需任何人进入的话,那就是在 /etc/hosts.deny 当中写成:
  in.ftpd: 192.168.1.1 : deny
  ALL: ALL : deny
  如果允许 192.168.0.0/24 这个网段进入的话,那么就使用:
  ALL: 192.168.0 : allow
  这是很简单的设定啦,我们在网路的阶段会再跟大家介绍 TCP_Wrappers 的其他设定与基本的检测需求方式呢!
  
  系统开启的服务
  这个不需要说,大概大家都很清楚了!要检查目前你的主机上面开启的 port 的话,那么就使用 netstat 来检测啰!而如果要修正开机预设的启动选项的话,就可以使用 ntsysv, chkconfig 这两支程式啦!基本上,这两支程式使用的内容就是刚刚提到的 /etc/rc.d/init.d 里面的 scripts 与 /etc/xinetd.d 里面的设定项目啰!尤其可以使用 chkconfig 来查看一下,就可以知道那是什么玩意儿啰!
  那么 netstat 呢?呵呵!他主要是在显示目前的连线与网路 port 监听状态,如果有 LISTEN 的 port 那一行,表示该服务目前有在启动的意思啦!所以可以下达:
  netstat -a | more
  来检测目前你的系统有开启的 port 之状况,而要将他在启动的时候预设关闭时,就要使用 ntsysv, chkconfig 以及看一下 /etc/rc.d/rc.local 里头的设定啰!请注意,这个时候仅是将『开机预设启动关闭』而已,并没有实际关闭目前的服务,假设您发现 ftp 还在启动的项目,你要将他关闭,那么就必须:
  1.使用 ntsysv 将 wu-ftpd 前面的符号关闭掉;
  2.跳出之后,以 /etc/rc.d/init.d/xinet restart 或者是 service xinet restart 来重新启动 xinet 这个服务;
  3.再以 netstat -a | more 看一下 ftp 是否还在 LISTEN 呢?
  这样才能关闭呢!同理可证啰!要关闭 sshd 怎么关?!嘿嘿!自己测试看看啰!
  
  各个服务的简单说明
  这个部分应该是可说可不说啦,所以这里我们就稍微谈一谈在 Red Hat 底下预设的几个启动的服务项目!还是再提醒一次,在 Linux 底下, daemons 是以 d 来作为结尾的服务名称,例如 atd, crond 等等!
  
  服务名称· 参数档 · 预设使用 port 号 · 说明 · 是否需要执行
  anacron· /etc/anacrontab · 没有使用 port 号 · 当你的 Linux 主机并不是全天候开机的时候,这个 anacron 就可以帮你执行在『 crontab 』既定的时间内没有执行的工作!举个例子来说,当你的主机在晚上 12:00 会自动关闭,但是偏偏 crontab 这个例行性工作是在 4:00 工作,这个时候例行性工作不是都没有做到吗?嗯! anacron 就可以使用啦! · 如果主机已经 24 小时开机,而且执行了 cron ,那么这个程式就不需要启动了。
  apmd·/etc/sysconfig/apmd ·没有使用 port 号 ·apmd 是 Adventage Power Management daemon 的缩写,顾名思义,可以用来了解系统的『电池电量』,如果对于手提式电脑才有需要吧我想! ·基本上,我们使用的桌上型或者是一直开机的机型,大致上不需要使用此一 daemon。
  arpwatch·/etc/sysconfig/arpwatch ·没有使用 ·这是用来持续监测网路卡的『 Hardware IP (MAC) 与 Software IP (TCP/IP 那个 IP) 』对应的 daemon,还可以提供 e-mail 通知系统管理员呦! ·一般的主机不太需要这个 daemon 啦!
  atd·/etc/at.allow, /etc/at.deny ·没有使用 port 号 ·这个总该不陌生了吧!就是单一使用的例行性命令啰!如果忘记了!赶紧去查看一下! ·这个通常需要启动啦!不过,如果你一般都是使用 cron ,那么这个东西不启动影响也不很大!
  autofs·/etc/rc.d/init.d/autofs ·没有使用 port 号 ·这个东西使用在自动挂载一些装置的 daemon ·不需要开启!
  xinet chargen chargen-udp·这东西主要的 port 号是 19 号; ·主要的功能在于提供类似远端打字的咚咚吧!我也不是很懂说.... ·一般来说,不用启动啦!
  crond·/etc/crontab ·没有使用 port ·用来执行 例行性命令 的 daemon! ·务必启动!
  xinet daytime daytime-udp·这东西使用 13 port 号! ·用来作为 daytime 的服务(我也不清楚,请来信告知耶!) ·不用启动
  xinet echo echo-udp·使用 port 7 ·不用启动啦!
  xinet finger·/etc/xinetd.d/finger ·port 79 ·最大的功能就是让远端的使用者可以查看本地端的使用者资讯 ·由于有安全上的顾虑,没有必要的话,不要启动!
  gpm·/etc/sysconfig/mouse ·没有使用 port 号 ·在文字模式里面可以使用 mouse 来从事『复制、贴上、移动游标』等等的功能! ·没必要的话,建议是『关闭』!
  httpd·/etc/httpd/conf/httpd.conf ·使用 80 port 以及(或) 443 ·这个就是鼎鼎大名的 WWW 主机服务开启的程式啦! ·看你的需求啰!有 WWW 则必须要启动! 
 

原创粉丝点击