xinetd配置实例
时间:2006-08-03 来源:lnycm
1. defaults配置
【范例1】/etc/xinetd.conf |
# 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 |
解读:RedHat 7.x建议的配置方法不是将所有服务项都写在一个文件里面,/etc/xinetd.conf是作为默认配置文件用的,/etc/xinetd.d目录下面的每个文件对应一个服务。前面说过,默认项的设置是作用于所有服务的,由此可以看出上面的对所有服务都是设置了60个实例、设置的日志方式为SYSLOG authpriv,登陆成功时记录HOST和PID,失败时仅记录HOST,
每秒最多处理25个连接,如果超过这个数目的连接则等待30秒后继续处理。Includedir指令指定了配置文件的目录是/etc/xinetd.d
2.telnet的配置
【范例1】/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 instances = 10 server = /usr/sbin/in.telnetd log_on_failure += USERID rlimit_as = 8M rlimit_cpu=20 } |
解读:
1、 instances的设置覆盖了defaults项的设置;
2、 log_on_failure属性在defaults项的基础上加上了USERID。
3、 对TELNET服务设置了资源限制,最多可用内存为8M,CPU每秒处理20个进程。
3 .echo的配置
【范例3.1】/etc/xinetd.d/echo |
# default: off # description: An echo server. This is the tcp \ # version. service echo { disable = yes type = INTERNAL id = echo-stream socket_type = stream protocol = tcp user = root wait = no } |
【范例3.2】/etc/xinetd.d/echo-udp |
# default: off # description: An echo server. This is the udp \ # version. service echo { disable = yes type = INTERNAL UNLISTED id = echo-dgram socket_type = dgram protocol = udp user = root wait = yes port = 7 } |
解读:由于它们的服务名相同,只是socket类型不同,所以,使用id属性来区分。
4. RPC类服务例子
【范例4】/etc/xinetd.d/rstatd |
service rstatd { type = RPC socket_type = dgram protocol = udp server = /usr/etc/rpc.rstatd wait = yes user = root rpc_version = 2-4 env =LD_LIBRARY_PATH=/etc/securelib } |
5. 自定义的服务配置范例
【范例4】/etc/xinetd.d/sample |
service sample { type = UNLISTED socket_type = stream protocol = tcp server = /usr/bin/sample port =20020 } |
xinetd进程
1 启动与中止:
如果你使用的是7.x 的默认安装:
/etc/rc.d/init.d/xinetd start
/etc/rc.d/init.d/xinetd stop
/etc/rc.d/init.d/xinetd restart
/etc/rc.d/init.d/xinetd reload
或者
/sbin/service xinetd start
/sbin/service xinetd stop
/sbin/service xinetd restart
/sbin/service xinetd reload
如果你使用的是6.x上的自行编译安装:
你需要自行建立xinetd启动脚本:
touch /var/run/xinetd.pid
touch /var/lock/subsys/xinetd
chmod 755 /etc/rc.d/init.d/xinetd
你可以用下面的命令来控制进程:
/etc/rc.d/init.d/xinetd start
/etc/rc.d/init.d/xinetd stop
/etc/rc.d/init.d/xinetd restart
/etc/rc.d/init.d/xinetd reload
vi /etc/rc.d/init.d/xinetd
##文件内容如下:
/etc/rc.d/init.d/xinetd文件内容 |
#!/bin/bash
#
# xinetd This starts and stops xinetd.
#
# chkconfig: 345 56 50
# description: xinetd is a powerful replacement for inetd. \
# xinetd has access control machanisms, extensive \
# logging capabilities, the ability to make services \
# available based on time, and can place \
# limits on the number of servers that can be started, \
# among other things.
#
# processname: /usr/sbin/xinetd
# config: /etc/sysconfig/network
# config: /etc/xinetd.conf
# pidfile: /var/run/xinetd.pid
prog="xinetd"
PATH=/sbin:/bin:/usr/bin:/usr/sbin
# Source function library.
. /etc/rc.d/init.d/functions
# Get config.
test -f /etc/sysconfig/network && . /etc/sysconfig/network
# Check that networking is up.
[ ${NETWORKING} = "yes" ] || exit 0
[ -f /usr/sbin/xinetd ] || exit 1
[ -f /etc/xinetd.conf ] || exit 1
RETVAL=0
start(){
echo -n $"Starting $prog: "
# Need to get rid of localization for external services -
# it doesn't make much sense to have i18n on the server side here
LANG=en_US
LC_TIME=en_US
LC_ALL=en_US
LC_MESSAGES=en_US
LC_NUMERIC=en_US
LC_MONETARY=en_US
LC_COLLATE=en_US
export LANG LC_TIME LC_ALL LC_MESSAGES LC_NUMERIC LC_MONETARY LC_COLLATE
unset HOME MAIL USER USERNAME
daemon xinetd -stayalive -reuse -pidfile /var/run/xinetd.pid
RETVAL=$?
echo
touch /var/lock/subsys/xinetd
return $RETVAL
}
stop(){
echo -n $"Stopping $prog: "
killproc xinetd
RETVAL=$?
echo
rm -f /var/lock/subsys/xinetd
return $RETVAL
}
reload(){
echo -n $"Reloading configuration: "
killproc xinetd -USR2
RETVAL=$?
echo
return $RETVAL
}
restart(){
stop
start
}
condrestart(){
[ -e /var/lock/subsys/xinetd ] && restart
return 0
}
# See how we were called.
case "$1" in
start) start ;;
stop) stop ;;
status) status xinetd ;;
restart) restart ;;
reload) reload ;; condrestart)
condrestart ;; *)
echo $"Usage: $0 {start|stop|status|restart|condrestart|reload}"
RETVAL=1
esac
exit $RETVAL |
etd自身的行为。例如,如果filelog标记指定为xinetd,那么将在那里登记所有状态转换消息,尽管 /etc/xinetd.conf文件中为和服务相关消息指定了其他登记位置。可用参数列在下表中。
应注意xinetd报告的所有状态信息,总是出现在-syslog或-filelog标记指定的登记文件中,不管设置如何,无论通过defaults还是在/etc/xinetd.conf中。如果要在一个文件中捕获xinetd的PID,可以用
xinetd –pid 2> /var/run.xinetd.pid
Xinetd 的命令参数 |
|
参数 |
描述 |
-d |
调试模式。输出可和调试器如gdb一起使用。 |
-syslog facility |
指定日志方式。可用的参数为daemon, auth, user和loca10-7其中之一,你可以使用man syslog.conf了解每个参数的含义。如果你使用调试模式,该参数无效,因为相应的信息已经被送到终端。 |
-filelog logfile |
指定日志信息到文件。文件必须指定全路径,如果该文件不存在,文件将被创建,产生的信息以追加的方式写入到文件。如果你使用调试模式,该参数无效,因为相应的信息已经被送到终端。 |
-f config_file |
指定配置文件。必须是全路径,默认配置文件为/etc/xinetd.conf |
-pidfile pid_file |
进程ID将被写入指定文件,在调试模式中该参数无效。 |
-stayalive |
即使没有服务被指定,也使得xinetd继续运行 |
-loop rate |
指定每秒钟分叉的进程数。缺省是10.对较快机器来说可能希望改变它 |
-reuse |
设置可重用的TCP socket, 这意味着以前的实例运行时也可启动其他进程。当和flags属性一起使用时,有更特殊的服务控制,参见xinetd的属性列表,注意这个选项对于RPC类型的服务无效。 |
-limit proc_limit |
指定由xinetd产生的并发进程总数的上限,以防止进程溢出。 |
-logprocs limit |
指定远程用户可以请求的并发服务总数上限 |
-shutdownprocs limit |
当log_on_failure属性中使用了RECORD值时,xinetd分叉称为shutdown的服务以收集服务终止时的信息。该选项限制同时运行的shutdown进程总数为limit |
-cc interval |
使xinetd每隔interval秒运行对其内部状态的一致性检查。用killall –IOT xinetd可手工实现 |
注意:syslog和filelog选项是互斥的。如果你什么也没有指定,默认采用的是syslog方式和daemon工具。请不要混淆xinetd的信息和在登陆某个服务时产生的信息。后者是在相关服务的配置文件中指定的。
3 控制信号
当xinetd收到某个信号时会执行相应的动作,这些信号可以通过修改config.h并重新编译来自定义。默认的可用信号如下:
xinetd 的控制信号 |
|
信号 |
描述 |
SIGUSR1 |
软性重配置。重读/etc/xinetd.conf并作相应调整 |
SIGUSR2 |
硬性重配置。重读配置文件并终止和新的配置规则不匹配的进程。它会对正在运行的进程重新进行远程访问者位置、访问次数、服务实例等方面的访问控制校验,如果检验的结果与新的规则不匹配,它会强制终止一些实例来匹配新的规则。举例来说,某个服务新的配置比原先的配置中的实例数目要少,它会杀死几个进程来满足新的数目。 |
SIGQUIT |
终止xinetd但不终止它分叉的任何进程 |
SIGTERM |
终止xinetd分叉的所有进程;然后终止xinetd |
SIGHUP |
把xinetd状态信息写到/tmp/xinetd.dump中 |
SIGIOT |
检查内部数据库毁坏情况并报告结果 |
xinetd日志
1 日志条目
当用户试图访问一个服务的时候,将产生一条访问的日志记录,格式如下(每一项都有一个时间戳作为前缀):entry:service-id data
data 依赖于entry,可用的entry类型包括:
xinetd 的日志条目类型(entry type) |
|
日志类型 |
引发条件 |
START |
连接开始 |
EXIT |
连接结束 |
FAIL |
连接失败 |
DATA |
对于启用了RECORD登陆选项的服务而言,当连接失败时产生 |
USERID |
连接启用了USERID登陆选项的服务时产生 |
NOID |
使用了USERID登陆选项和IDONLY标记(flag),不识别是谁正在试图访问此服务 |
2 日志格式
如果服务使用了appropriate登陆选项,将有某些信息附加日志条目里,具体描述如下:
xinetd 的日志格式 |
|
日志类型 |
格式 |
START |
START:service-id [pid=%d] [from=%d. %d. %d. %d] |
EXIT |
EXIT:service-id [type=%d] [pid=%d] [duration=%d(sec)] 说明:type是status或signal,数值是离开的状态或者引发进程终止的信号。 |
FAIL |
START:service-id reason [from=%d. %d. %d. %d] 说明:可能的reason包括:fork、time、address、service_limit、process_limit |
DATA |
DATA:service-id data 说明:data的值根据不同的服务有所不同 login:remote_user=%s local_user=%s tty=%s exec:remote_user=%s verify=status command=%s exec可用的status包括ok(密码正确)、failed(密码错误)、bad(无此用户) shell:remote_user=%s local_user=%s command=%s finger:其值为接收到的字符串或者一空行 |
USERID |
USERID:service-id text 说明:text是负责校验的后台进程的响应信息 |
NOID |
NOID:service-id IP-address reason |