linux 系统服务
此文涉及的命令:service、chkconfig。
一条命令显示开机启动服务的先后顺序:[root@gjt init.d]# awk '/chkconfig:/{print $4"\t"$5"\t"FILENAME}' * |sort -n
概念
- daemon 的主要分类
- stand_alone:此 daemon 可以自行单独启动服务
- 属性:daemon 启动并加载到内存后就一直占用内存与系统资源。
- 特点:对于发生客户端的要求时,响应速度较快。
- super daemon: 一支特殊的 daemon 来统一管理
- 属性:Super daemon 是常驻在内存中的。这一种服务的启动方式则是藉由一个统一的 daemon 来负责唤起服务。当没有客户端的要求时,各项服务都是未启动的情况,等到有来自客户端的要求时, super daemon 才唤醒相对应的服务。当客户端的要求结束后被唤醒的这个服务也会关闭并释放系统资源。
- 特点: 具有安全控管的机制,就是类似网络防火墙的功能,不会一直占用系统资源,服务的反应时间会比较慢一些
- 在 Linux 系统里面,这两种 daemon 的启动方式也是可以同时存在的!
- stand_alone:此 daemon 可以自行单独启动服务
- super daemon 的处理模式有两种
- multi-threaded (多重线程):一个服务同时会负责好几个程序。
- single-threaded (单个线程):不论如何,反正一个一个来,第一个没有处理完之前,后面的请排队
- daemon 工作形态的类型
- signal-control :这种 daemon 是透过讯号来管理的,只要有任何客户端的需求进来,他就会立即启动去处理!例如打印机的服务 (cupsd)。
- interval-control:这种 daemon 则主要是『每隔一段时间就主动的去执行某项工作』,所以,你要作的是在配置文件指定服务要进行的时间与工作, 该服务在指定的时间才会去完成工作!
- daemon 的命名规则:后面多加一个d
- 服务与端口的对应:/etc/services
- 请特别注意!虽然有的时候你可以藉由修改 /etc/services 来更改一个服务的端号,不过并不建议如此做, 因为很有可能会造成一些协议的错误情况!这里特此说明一番呦!(除非你要架设一个地下网站,否则的话,使用 /etc/services原先的设定就好啦!)
- daemon 的启动脚本与启动方式
- 为了管理上面的方便, 所以通常 distribution 都会记录每一支 daemon 启动后所取得程序的 PID 在 /var/run/ 这个目录下
- /etc/init.d/* :启动脚本放置处,系统上几乎所有的服务启动脚本都放置在这里!
- /etc/sysconfig/* :各服务的初始化环境配置文件,几乎所有的服务都会将初始化的一些选项设定写入到这个目录下
- /etc/xinetd.conf, /etc/xinetd.d/* :super daemon 配置文件-------------centos 6.5 需要自己安装xinetd。
- super daemon 的主要配置文件 (其实是默认值) 为 /etc/xinetd.conf
- super daemon管理的其他 daemon 的设定则写在 /etc/xinetd.d/* 里头喔!
- /etc/* :各服务各自的配置文件
- /var/lib/* :各服务产生的数据库,一些会产生数据的服务都会将他的数据写入到 /var/lib/ 目录中
- /var/run/* :各服务的程序之 PID 记录处
- stand alone 与 super daemon 所管理的服务启动方式
- Stand alone 的 /etc/init.d/* 启动
- 脚本会去侦测环境、搜寻配置文件、 加载distribution 提供的函数功能、判断环境是否可以运作此daemon 等等,等到一切都侦测完毕且确定可以运作后, 再以 shell script 的 case....esac 语法来启动、关闭
- service 其实 service 仅是一支 script 啦,他可以分析你下达的 service 后面的参数
- Super daemon 的启动方式
- Super daemon 自己启动的方式与 stand alone 是相同的!配置文件就是 /etc/xinetd.d/* 的所有档案
- super daemon 是 xinetd 这一支程序所达成的。
- super daemon 所管理的服务是否有启动
- grep -i 'disable' /etc/xinetd.d/*
- 启动某个服务:
- 先修改配置文件成为启动的模样:vim /etc/xinetd.d/服务
- 重新启动 xinetd 这个服务:/etc/init.d/xinetd restart
- Stand alone 的 /etc/init.d/* 启动
- 览析 super daemon 的配置文件/etc/xinetd.conf
- 配置文件参数说明:
- log_type = SYSLOG daemon info <==登录文件的记录服务类型
- log_on_failure = HOST <==发生错误时需要记录的信息为主机 (HOST)
- log_on_success = PID HOST DURATION EXIT <==成功启动或登入时的记录信息
- cps = 50 10 <==同一秒内的最大联机数为 50 个,若超过则暂停 10 秒
- instances = 50 <==同一服务的最大同时联机数
- per_source = 10 <==同一来源的客户端的最大联机数
- v6only = no <==是否仅允讲 IPv6 ?可以先暂时不启动 IPv6 支持!
- includedir /etc/xinetd.d <==更多的设定值在 /etc/xinetd.d 那个目录内
- 如果你有启动某个 super daemon 管理的服务, 但是该服务的设定值并没有指定上述的那些项目,那么该服务的设定值就以上述的默认值为主!
- /etc/xinetd.d内档案配置说明
- = : 表示后面的设定参数就是这样啦!
- += : 表示后面的设定为『在原来的设定里头加入新的参数』
- -= : 表示后面的设定为『在原来的参数舍弃这里输入的参数!』
- 配置文件参数说明:
- 服务的防火墙管理 xinetd, TCP Wrappers
- 任何以 xinetd 管理的服务,都可以透过 /etc/hosts.allow, /etc/hosts.deny 来设定防火墙。
- /etc/hosts.allow 与 /etc/hosts.deny 也是 /usr/sbin/tcpd 的配置文件
- /usr/sbin/tcpd 则是用来分析进入系统的 TCP 网络封包的一个软件
- /etc/hosts.allow, /etc/hosts.deny 管理
- 一个服务的程序有没有支持 TCP Wrappers
- ldd $(which sshd httpd)
- 重点在于软件有没有支持 libwrap.so 那个函式库啰
- ldd (library dependency discovery) 这个指令可以查询某个程序的动态函式库支持状态
- 一个服务的程序有没有支持 TCP Wrappers
- 配置文件语法
- <服务 (亦即程序名称)> : <IP 或领域 或主机名> : < 动作 >
- vim /etc/hosts.deny
- rsync : 127.0.0.100 127.0.0.200 : deny --------最后一个字段可以不写
- service_name 其实是启动该服务的程序,举例来说, /etc/init.d/sshd 这个 script 里面, 实际上启动ssh 服务的是 sshd 这个程序,所以,你的 service_name 自然就是 sshd 啰! 而 /etc/xinetd.d/telnet(你的系统可能尚未安装) 内有个 server 的设定项目, 那个项目指到 in.telnetd 这个程序来启动的喔
- 特殊参数
- ALL:代表全部的 program_name 或者是 IP 都接受的意思,例如 ALL: ALL: deny
- LOCAL:代表来自本机的意思,例如: ALL: LOCAL: allow
- UNKNOWN:代表不知道的 IP 或者是 domain 或者是服务时
- KNOWN:代表为可览析的 IP, domain 等等信息
- TCP Wrappers 特殊功能-----------655
- 当有其他人扫瞄我的 rsync port 时,我就将他的 IP 记住,需要安装了 TCP Wrappers 软件才行
- spawn (action)
- 可以利用后续接的 shell 来进行额外的工作,且具有变量功能,主要的变量内容为: %h (hostname), %a (address), %d (daemon)等等;
- twist (action)
- 立刻以后续的指令进行,且执行完后终止该次联机的要求 (DENY)
- 整个流程可以是这样的:
- 利用 safe_finger 去追踪出对方主机的信息 (包括主机名、用户相关信息等);
- 将该追踪到的结果以 email 的方式寄给我们本机的 root ;
- 在对方屏幕上面显示不可登入且警告他已经被记录的讯息
- 实际编辑范例:
- vim /etc/hosts.deny
- rsync : 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" )
- 上面其实是针对一个 rsync 所写的信息,你可以看到上面这四行共有三个冒号来隔开成四个咚咚,这四个咚咚的意义是:
- rsync: 指的就是 rsync 这个服务的程序啰;
- ALL: 指的是来源,这个范围指的当然是全部的所有来源啰,因为是 ALL 嘛!
- spawn (echo "security notice from host $(/bin/hostname)" ;echo ; /usr/sbin/safe_finger @%h ) | /bin/mail -s "%d-%h security" root &:
- 由于要将一些侦测的数据送给 root 的邮件信箱,因此需要使用数据流汇整的括号( ),括号内的重点在于 safe_finger 的项目,他会侦测到客户端主机的相关信息,然后使用管线命令将这些数据送给 mail 处理, mail 会将该信息以标头为 security 的字样寄给 root 啦!由于 spawn 只是中间的过程,所以还能够有后续的动作哩!
- twist ( /bin/echo -e "\n\nWARNING connection not allowed.\n\n" ):这个动作会将 Warning 的字样传送到客户端主机的屏幕上! 然后将该联机中断。
- 系统开启的服务
- netstat -tulp-----------找出目前系统开启的『网络服务』有哪些
- netstat -lnp------------找出所有的有监听网络的服务 (包含 socket 状态):
- service --status-all----观察所有的服务状态
- 设定开机后立即启动服务的方法--------------657
- chkconfig: 管理系统服务默认开机启动与否
- chkconfig --list [服务名称]
- chkconfig [--level [0123456]] [服务名称] [on|off]
- --list :仅将目前的各项服务状态栏出来
- --level:设定某个服务在该 level 下启动 (on) 或关闭 (off)
- chkconfig: 管理系统服务默认开机启动与否
- 启动与关闭你的 super daemon 管理的服务
- chkconfig --list rsync----查看
- chkconfig rsync off;------关闭
- ntsysv: 类图形接口管理模式--------red hat 专有
- ntsysv [--level <levels>]
- --level :后面可以接不同的 run level ,例如 ntsysv --level 35
- 一般我们都是直接输入 ntsysv 即可进入管理画面了
- ntsysv [--level <levels>]
- chkconfig: 设定自己的系统服务
- chkconfig [--add|--del] [服务名称]
- --add :增加一个服务名称给 chkconfig 来管理,该服务名称必须在 /etc/init.d/ 内
- --del :删除一个给 chkconfig 管理的服务
- chkconfig [--add|--del] [服务名称]
命令
- Stand alone 的 /etc/init.d/* 启动
- /etc/init.d/syslog
- /etc/init.d/syslog status
- /etc/init.d/syslog restart
- service [service name] (start|stop|restart|...) ----------------在/sbin/service目录内
- service --status-all
- service name:亦即是需要启动的服务名称,需与 /etc/init.d/ 对应;
- start|... :亦即是该服务要进行的工作。
- --status-all:将系统所有的 stand alone 的服务状态通通列出来
- 设定开机后立即启动服务的方法
- .chkconfig --list [服务名称]
- chkconfig [--level [0123456]] [服务名称] [on|off]
- --list :仅将目前的各项服务状态栏出来
- --level:设定某个服务在该 level 下启动 (on) 戒关闭 (off)
- chkconfig [--level [0123456]] [服务名称] [on|off]
- super daemon 管理的服务
- chkconfig --list rsync----查看
- chkconfig rsync off;------关闭
- .chkconfig --list [服务名称]
etc xinetd.d内档案配置说明:
service <service_name>
{
<attribute> <assign_op> <value> <value> ... .............
}
= : 表示后面的设定参数就是这样啦!
+= : 表示后面的设定为『在原来的设定里头加入新的参数』
-= : 表示后面的设定为『在原来的参数舍弃这里输入的参数!』
--------------------------------------------------------------------------------------
attribute (功能) | 说明与范例 |
一般设定项目:服务的识别、启动与程序 | |
disable (启动与否) |
设定值:[yes|no],预设 disable = yes 预设所有的 super daemon 管理的服务都不启动的 |
id(服务识别) | 设定值:[服务的名称] |
server (程序文件名) |
设定值:[program 的完整檔名] 这个就是指出这个服务的启动程序!例如 /usr/bin/rsync 为启动 rsync服务的指令,所以这个设定值就会成为: 『 server = /usr/bin/rsync 』 |
server_args (程序参数) |
设定值:[程序相关的参数] 这里应该输入的就是你的 server 那里需要输入的一些参数啦!例如 rsync需要加入 --daemon , 所以这里就设定:『 server_args = --daemon 』。与上面 server 搭配,最终启动服务的方式『/usr/bin/rsync --daemon』 |
user(服务所属UID) |
设定值:[使用者账号] 如果 xinetd 是以 root 的身份启动来管理的,那么这个项目可以设定为其他用户。此时这个 daemon 将会以此设定值指定的身份来启动该服务的程序喔!举例来说,你启动 rsync 时会以这个设定值作为该程序的 UID。 |
group | 跟 user 的意思相同!此项目填入组名即可。 |
一般设定项目:联机方式与联机封包协议 | |
socket_type(封包类型) |
设定值:[stream|dgram|raw],与封包有关 stream 为联机机制较为可靠的 TCP 封包,若为 UDP 封包则使用 dgram 机制。raw 代表 server 需要与 IP 直接对谈!举例来说 rsync 使用 TCP ,故设定为『socket_type = stream 』 |
protocol(封包类型) |
设定值:[tcp|udp],通常使用 socket_type 取代此设定 使用的网络协议,需参考 /etc/protocols 内的通讯协议,一般使用 tcp 或udp。由于与 socket_type 重复, 因此这个项目可以不指定。 |
wait (联机机制) |
设定值:[yes(single)|no(multi)],预设 wait = no 这就是我们刚刚提到的 Multi-threaded 与 single-threaded !一般来说,我们希望大家的要求都可以同时被启用,所以可以设定『 wait = no 』 此外,一般 udp 设定为 yes 而 tcp 设定为 no。 |
instances(最大联机数) |
设定值:[数字或 UNLIMITED] 这个服务可接受的最大联机数量。如果你只想要开放 30 个人联机 rsync 时,可在配置文件内加入:『 instances = 30 』 |
per_source(单一用户来源) |
设定值:[一个数字或 NULIMITED] 如果想要控制每个来源 IP 仅能有一个最大的同时联机数,就指定这个项目吧!例如同一个 IP 最多只能连 10 条联机『 per_source = 10 』 |
cps(新联机限制) |
设定值:[两个数字] 为了避免短时间内大量的联机要求导致系统出现忙碌的状态而有这个 cps 的设定值。第一个数字为一秒内能够接受的最多新联机要求, 第二个数字则为,若超过第一个数字那暂时关闭该服务的秒数。 |
一般设定项目:登录文件的记录 | |
log_type(登录档类型) |
设定值:[登录项目 等级] 当数据记录时,以什么登录项目记载?且需要记载的等级为何(默认为 info 等级)。 |
log_on_success log_on_failure (登录状态) |
设定值:[PID,HOST,USERID,EXIT,DURATION] 在『成功登入』或『失败登入』之后,需要记录的项目:PID 为记录该 server 启动时候的 process ID , HOST 为进程主机的 IP、USERID 为登入者的账号、EXIT为离开的时候记录的项目、DURATION 为该用户使用此服务多久? |
进阶设定项目:环境、网络端口口与联机机制等 | |
env(额外变量设定) |
设定值:[变量名称=变量内容] 这一个项目可以让你设定环境变量 |
port(非正规端号) |
设定值:[一组数字(小于 65534)] 这里可以设定不同的服务与对应的 port ,但是请记住你的 port 与服务名称必须与/etc/services 内记载的相同才行!不过,若服务名称是你自定义的,那么这个 port就可以随你指定 |
redirect(服务转址) |
设定值:[IP port] 将 client 端对我们 server 的要求,转到另一部主机上去!呵呵!这个好玩呦! 例如当有人要使用你的 ftp 时,你可以将他转到另一部机器上面去!那个 IP_Address就代表另一部进程主机的 IP 啰! |
includedir(呼叫外部设定) |
设定值:[目录名称] 表示将某个目录底下的所有档案都给他塞进来 xinetd.conf 这个设定里头!这东西有用多了, 如此一来我们可以一个一个设定不同的项目!而不需要将所有的服务都写在xinetd.conf 当中!你可以在 /etc/xinetd.conf 发现这个设定呦! |
安全控管项目: | |
bind(服务接口锁定) |
设定值:[IP] 这个是设定『允许使用此一服务的适配卡』的意思!举个例子来说,你的 Linux 主机上面有两个 IP ,而你只想要让 IP1 可以使用此一服务,但 IP2 不能使用此服务,这里就可以将 IP1 写入即可!那么 IP2 就不可以使用此一 server 啰 |
interface |
设定值:[IP] 与 bind 相同 |
only_from(防火墙机制) |
设定值:[0.0.0.0, 192.168.1.0/24, hostname, domainname] 这东西用在安全机制上面,也就是管制『只有这里面规定的 IP 或者是主机名可以登入!』如果是 0.0.0.0 表示所有的 PC 皆可登入,如果是 192.168.1.0/24 则表示为 C class的网域!亦即由192.168.1.1 ~ 192.168.1.255 皆可登入!另外,也可以选择 domain name ,例如 .dic.ksu.edu.tw 就可以允讲昆山资传系网域的 IP 登入你的主机使用该 server ! |
no_access(防火墙机制) |
设定值:[0.0.0.0, 192.168.1.0/24, hostname, domainname] 跟 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。 |
umask |
设定值:[000, 777, 022] 可以设定用户建立目录或者是档案时候的属性!系统建议值是 022 。 |