![]() |
英文作者: Jose Nazario
中文译者: Fenng Fdh@163.net
译稿历史: 2001/11/27 Version 0.01
2003/05/23 Version 1.00
Jose描述了如何着手配置调整xinetd。
xinetd取代了inetd,并且提供了访问控制、加强的日志和资源管理功能,已经成了Red Hat 7 和 Mandrake 7.2的Internet标准超级守护进程。这篇文章将引导你如何应用一些它的特性,这些特性基于xinetd 2.1.8.8pre3版本。
导言
xinetd的最初的作者(Panagoitis Tsirigotis panos@cs.colorado.edu)好像已经停止了这个项目。 Rob Braun (bbraun@synack.net)继续了该项目,现在负责维护这个软件包。为了能使 select()在我的老的libc5系统上也可以使用,我不得不给当前的包添加几对头文件,这是我注意到的问题。或许你需要它们,如下:
xinetd/internals.c.orig
Fri Jun 16 19:00:15 2000
+++ xinetd/internals.c
Fri Jun 16 19:00:53 2000
@@ -12,6 +12,8 @@
#include <time.h>
#include <fcntl.h>
#include <syslog.h>
#include <unistd.h>
#include <sys/time.h>
#include "sio.h"
关于 xinetd
xinetd 用括号括起的、扩展了的语法取代了inetd中的通用的行。另外,还添加了日志和访问控制功能。 虽然inetd可以使用Venema的tcp_wrappers 软件(tcpd)控制TCP的连接,但是你不能用它来控制 UDP连接。此外,inetd对RPC(portmapper)类型的服务也处理不好。另外,虽然使用inetd你可以控制连接速度 ( 通过给wait或是no wait 变量附加一个数值,例如nowait.1表示每隔一秒钟一个实例),你不能控制实例的最大数。这能导致进程表攻击(例如,一个有效的拒绝服务攻击)。通过使用xinetd,我们可以防止Dos。
我通常使用下面的命令启动xinetd,把它放在我的Internet服务启动脚本中:
/usr/sbin/xinetd -filelog /var/adm/xinetd.log -f /etc/xinetd.conf
这告诉 xinetd 对所有的服务都进行纪录,日志保存到文件 /var/adm/xinetd.log中,并且使用配置文件/etc/xinetd.conf。这篇文章中的大量篇幅都将用在这个配置文件上。
编译时选项
你应该注意3个编译时的选项:libwrap、 loadavg (用于监视负载均衡) 和 IPv6 support,它们提供了额外的访问控制。对于大多数libwrap"明白"的守护进程 (如portmapper 和sendmail),在配置脚本中的''with-libwrap''选项告诉xinetd支持tcp_wrappers文件/etc/hosts.allow和/etc/hosts.deny。这些选项对xinetd作用就如同它们之于 inetd那样,并且支持所有的 xinetd控制的守护进程。注意如果你从零开始做xinetd的话,就可以做访问控制,不再需要tcpd。不管怎样。对libwrap 的支持是有用的――如果你从inetd/tcpd迁移并且也不想改变你的访问文件的话 。
第二个有趣的设置选项是支持负载均衡监控,通过在./configure脚本中使用with-loadavg选项可以达到。sendmail支持在高负载的时候停止连接――假定它已经脱离了控制并且正在当掉机器。用这个选项可以激活max_load 选项以限制任何连接或是基于负载均衡机器的所有服务。
最后,添加 IPv6支持 可以通过在 ./configure 脚本中使用 with-inet6 capability选项来完成。 这使xinetd 支持IPv6地址和连接。注意要使其生效的话你的核心(和网络)必须支持 IPv6。当然IPv4 仍然被支持。
配置文件
xinetd 配置文件,通常可以手工或是自动从inetd.conf文件生成。前者费时间且容易出错;后者可以通过 itox软件或者xconv.pl 脚本轻易完成。虽然itox软件正在被取消而倾向于使用 xconv.pl 脚本,它仍是很有用的。但是,要注意重复的运行它会覆盖原有的配置文件。itox和
xconv都以同样的方式工作,我们用 itox来进行演示:
$ itox < /etc/inetd.conf > xinetd.conf
新一些的工具(xconv)可以理解注释,并且在对tcpd的使用上要比itox做得更好,使用itox,你不得不指定守护进程的路径 (如 /usr/sbin)。 你想要包含的第一段就是默认的段,就像名字暗示的那样,默认的xinetd服务。
defaults
{
instances = 25
log_type = FILE /var/adm/servicelog
log_on_success = PID HOST EXIT
flags = NORETRY
log_on_failure = HOST RECORD ATTEMPT
only_from = 129.22.0.0
no_access = 129.22.210.61
disabled = nntp uucp tftp bootps who
shell login exec
disabled += finger
}
马上, 我们可以了解 xinetd 设置参数的语法:<指示(directive)> <操作符(operator)> <值(value)>。Xinetd所能理解的指示列在表一中,在这里我们将忽略 flags、type、env 和passenv指示符。 我对将对 only_from 和 no_access以及额外的日志选项加以更多的讨论
表 1. xinetd的指示符
-------------------------------------------------------------
指示符 描述
socket_type 网络套接字类型, 流或者数据包
protocol IP 协议, 通常是TCP或者 UDP
wait yes/no, 等同于inetd的wait/nowait
user 运行进程的用户 ID
server 执行的完整路径
server_args 传递给server的变量,或者是值
instances 可以启动的实例的最大的值
start max_load 负载均衡
log_on_success 成功启动的登记选项
log_on_failure 联机失败的时候的日志信息
only_from 接受的网络或是主机
no_access 拒绝访问的网络或是主机
disabled 用在默认的 {} 中 禁止服务
log_type 日志的类型和路径 FILE /SYSLOG
nice 运行服务的优先级
id 日志中使用的服务名
---------------------------------------------------------------
操作符非常简单, = 或者+=。用 =,右边给定的值传给左边的指示符。+=也是非常直接的,用于给一个已经指定的指示符添加一个值。没有它,原先的指示符就会被覆盖,这样可以用来展开访问列表,或者跨越多行。
用如下的格式描述服务:
服务名
{
指示符 = 值
指示符 += 值
}
服务名一定要在 /etc/services列出 ,并且要使用合适的socket和协议。
关于访问控制
关于访问控制的有几句话。 首先,xinetd控制连接而不是控制数据分组,它只是个用户方的守护进程,如同inetd 一样。同样的,可以打断一个被服务器禁止的主机的SYN或是connect()。但不能中止象FIN [端口扫描使用带有FIN 标志位的TCP包,通常是nmap这样的工具运行产生的]这样的"秘密" 扫描。不要把 xinetd 当作一个firewall 用以阻止端口扫描。一个有经验的入侵者能够用这些信息收集你的不同服务的访问控制列表。幸运的是, 这些可以被xinetd纪录。当你看到日志的时候你的疑虑会消除的。
第二, xinetd(2.1.8.8pre3版本),当一个系统试图连接的时候进行名字查找。以前,它在启动的时候进行查找, 但是现在已经改变。
使用访问控制真的很简单。第一个指示符是 only_from, 列出了我们可