如何着手配置调整xinetd

http://www.iselong.com/English/0000/915.htm

http://blog.chinaunix.net/space.php?uid=222583&do=blog&id=2654987

配置实例
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,登陆成功时记录HOSTPID,失败时仅记录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服务设置了资源限制,最多可用内存为8MCPU每秒处理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属性来区分。
4RPC类服务例子 

【范例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

}

 

March 01, 2001 by Jose Nazario 

翻译:冯大辉 
mailto:fdh@163.net
翻译稿版本:0.01
2001/11/27

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 
#include
#include
#include
#include
#include ”sio.h”

*****************
关于 xinetd
*****************

xinetd 用同样功能的,扩展了的语法取代了 inetd中的通用的行。 另外,还添加了日志功能和访问控制。 虽然 inetd 使用Venema的 tcp_wrappers 软件(tcpd)控制TCP的连接, 但是你不能控制 UDP连接。而且,inetd对 RPC (portmapper)类型的服务也处理不好。 另外, 虽然使用inetd你可以控制连接速度 ( 通过给wait或是 no wait 变量附加一个数, 例如nowait.1 每个 一秒钟一个实例),你不能控制实例的最大数。这能导致进程表攻击,例如,一个有效的拒绝服务攻击。通过使用 xinetd,我们可以防止这样。

我启动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 支持。对于大多数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 仍然被支持。

**************
配置文件
**************
The xinetd 配置文件,通常可以手工或是自动从 inetd.conf文件生成。 前者费时间且容易出错;后者可以通过 itox软件或者xconv.pl 脚本轻易完成。虽然 itox软件正在被取消而倾向于使用 xconv.pl 脚本,它仍然很有用。但是,要注意重复的运行它会覆盖原有的配置文件。itox 和 xconv都以同样的方式工作,我们用 itox来进行演示;

$ itox < /etc/inetd.conf > xinetd.conf

更新一些的软件,xconv,可以理解注释,并且比 itox对tcpd 用得更好,使用 itox,你不得不指定守护进程的路径 ,如 /usr/sbin。 你想要包含的第一段就是默认的段,就像名字的暗示的那样,默认的inetd服务。

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, 列出了从哪一个网络或是主机我们可以接受连接。这个规则可以被 no_access覆盖。 你可以使用网络号,如 10.0.0.0 或者 10,或者是网络名,包括 *.my.com 或者 .my.com 。主机名或者主机的 IP地址也可以在这里使用指示符0.0.0.0 t匹配所有的主机,监听所有的地址。通过使用 no_access一旦符合标准拒绝就会被解析。 再说一遍,网络和主机可以指定。

***********
服务配置
***********

让我们看一些基本的应用。我们要看的第一个基本的服务是echo,它是inetd 和 xinetd固有的服务。

service echo
{
socket_type = stream
protocol = tcp
wait = no
user = root
type = INTERNAL
id = echo-stream
}

echo 作为root运行, 是一个tcp 流 并在内部处理。echo-stream指示符将出现在日志中。如果没在only_from或者是 no_access 指示符中,对这个服务的访问不受限制。现在,让我们看一个正规的服务,daytime:

service daytime
{
socket_type = stream
protocol = tcp
wait = no
user = nobody
server = /usr/sbin/in.date
instances = 1
nice = 10
only_from = 0.0.0.0
}

再说一次,任何人都可以连接, 不过我们指明它以nobody的身份运行来返回信息。和前一个例子相比,这个并没有额外的什么。现在我们看另一个服务 secure shell version 1。 下面的设置可以防止sshd带来的资源枯竭。

service ssh1
{
socket_type = stream
protocol = tcp
instances = 10
nice = 10
wait = no
user = root
server = /usr/local/sbin/sshd1
server_args = -i
log_on_failure += USERID
only_from = 192.168.0.0
no_access = 192.168.54.0
no_access += 192.168.33.0
}

在这里,我们建立了前面我们所作的。当作为超级用户inetd或者 xinetd重新调用 sshd 需要用 -i 参数, 所以我们把它放在了 server_args 指示符后。 注意:把这个标记添加到server标识符出会导致失败。在任何时候只有十个人可以同时使用, 在这个服务器上这不是问题,这个例子我们从日志得到。另外作为默认信息, 如果不能连接的话,连接方的用户 ID在RFC 1413种描述。最后,我们有两个网络列表不能访问这个服务器。

***************
日志和 xinetd
***************

日志中有几个值可以用于得到你的服务器的信息

表2 不同的日志指示值

值 成功/失败 描述

PID success 当一个连接成功时登记产生的进程的 pid

HOST both 登记远程主机地址

USERID both 登记远程用户的RFC 1413 ID

EXIT success 登记产生的进程的完成

DURATION success 登记任务持续的时间

ATTEMPT failure 登记连接失败的原因

RECORD failure 关于连接失败的额外的信息

这样,可以添加一些标准的行指明日志,就像下面的样子。对一个成功连接的服务, 我们通常想登记服务产生的进程id, 连接的主机和退出的时间:

log_on_success = PID HOST EXIT

这可以给我们有用的信息用来排错, 并明白服务器连接. 针对失败, 我们可以记录我们想要的:

log_on_failure = HOST RECORD ATTEMPT

Here we log the host that connected, 拒绝连接的原因和关于连接主机的额外的信息(由的时候是那些试图连接的用户的 ID)。推荐你这样做,可以对你的服务器有一个好的把握。 还看上面,在我们的默认段中,我们的日志写在 /var/adm/servicelog中。我们指定所有信息,成功和失败的都要被 xinetd记录。我们的大多数信息看起来像这样:

00/9/13@16:05:07: START: pop3 pid=25679 from=192.168.152.133
00/9/13@16:05:09: EXIT: pop3 status=0 pid=25679
00/10/3@19:28:18: USERID: telnet OTHER :www

使用这个信息, 可以轻易对 xinetd 排错和进行和正常操作。也可以容易发现安全问题 ,如你试图阻止的连接企图, 在日志中简单的用 grep 作 “FAIL‘‘ 过滤, 这些项显示如下:

00/10/4@17:04:58: FAIL: telnet address from=216.237.57.154
00/10/8@22:25:09: FAIL: pop2 address from=202.112.14.184

真正的安全问题需要另外的文章,但是,这足以说明,既然地址可以伪造,不要把地址报告看作固定的信息。 xinetd.log文件,包含了从 xinetd得到的信息. 连接出错的时候作为排错信息很有用。

00/10/25@21:10:48 xinetd[50]: ERROR: service echo-stream,
accept:
Connection reset by peer

**********************
重新配置 xinetd
**********************

在xinetd.conf运行的时候,你可以编辑 xinetd.conf 文件。 要重新配置,发送一个信号l SIGUSR1 给 xinetd 进程:

# ps -ax | grep xinetd
50 ? S 5:47 /usr/sbin/xinetd -filelog /var/adm/xinetd.log -f /etc/xinetd.conf
# kill -SIGUSR1 50

察看日志文件的尾部确保你的配置和改动已经生效。如果你是个远程用户的话要确保你退出后还可以重新登陆进来。

注意使用-HUP,对xinetd重新配置,会实际导致 xinetd 停止操作。 从设计的角度看,这可以阻止黑客重新配置你的 xinetd并且无需理解文档就可以重新载入它。

*********************
何时使用 xinetd
*********************

以我个人而言,对所有的服务我都使用 xinetd; 唯一一个对性能有影响的服务是我的web 守护进程 Apache。不得不启动太多的进程,太快了时间的效率是个问题。DNS 服务也不应该用 xinetd; 性能消耗太大。

sendmail 服务我也使用了 xinetd,对于允许连接的客户,我能够进行完美的控制。针对 sendmail我的设置如下:

service smtp
{
socket_type = stream
protocol = tcp
wait = no
user = root
server = /usr/sbin/sendmail
server_args = -bs
instances = 20
nice = 10
only_from += 0.0.0.0
no_access += 129.22.122.84 204.0.224.254
}

即使是在一个高流量的邮件服务器上,对性能的影响也是可以忽略不计的。 我还把sshd 载入到xinetd 以便阻止对它的进程表攻击。

********
结论
********

我希望这篇文章对你配置或者是根据需要调整inetd很有帮助。正如你所看到的,它提供的特性要比inetd甚至tcp_wrappers强大的多。Solar Designer (http://www.openwall.com/) 有一个补丁是针对稍旧一点的xinetd的版本的,2.2.1版本,允许基于IP 的实例控制,这有助于阻止简单的进程表攻击。注意,不管怎样,简单的伪造可以绕过它。我不知导致否这个包对以后的 xinetd是否也适用。

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>