Comment on page
32.2.inetd 超级服务器
守护进程 inetd(8) 有时被称为超级服务器,因为它管理了许多服务的连接。只需启动 inetd 服务,而无需启动多个应用程序。当收到由 inetd 管理的服务的连接时,它会确定连接的目标程序,为该程序生成一个进程,并向该程序委派一个套接字。与在独立模式下单独运行每个守护程序相比,对未大量使用的服务使用 inetd 可以减少系统负载。
inetd 主要用于生成其他守护程序,但有几个简单的协议在内部处理,例如 chargen、auth、time、echo、discard 和 daytime。
本节介绍配置 inetd 的基础知识。
inetd 的配置是通过编辑 /etc/inetd.conf 来完成的。此配置文件的每一行都表示一个可由 inetd 启动的应用程序。默认情况下,每行都以注释 (
#
) 开头,这意味着 inetd 不侦听任何应用程序。要将 inetd 配置为侦听应用程序的连接,请删除该应用程序的行首处的 #
。保存编辑后,通过编辑 /etc/rc.conf 将 inetd 配置为在系统启动时启动:
inetd_enable="YES"
要立即启动 inetd,以便它侦听你配置的服务,请键入:
# service inetd start
inetd 启动后,每当对 /etc/inetd.conf 进行修改时,都需要通知它:
例 44.重新加载 inetd 配置文件# service inetd reload
通常情况下,一个应用程序的默认条目除了删除
#
外,不需要其他编辑。在某些情况下,编辑默认条目可能是合适的。ftp stream tcp nowait root /usr/libexec/ftpd ftpd -l
条目中的七列如下所示:
service-name
socket-type
protocol
{wait|nowait}[/max-child[/max-connections-per-ip-per-minute[/max-child-per-ip]]]
user[:group][/login-class]
server-program
server-program-arguments
此处:
- service-name要启动的守护程序的服务名称。它必须与 /etc/services 中列出的服务相对应。这将确定 inetd 侦听与该服务的传入连接的端口。使用自定义服务时,必须首先将其添加到 /etc/services。
- socket-type无论
stream
、dgram
、raw
或seqpacket
。TCP 连接使用stream
,UDP 服务使用dgram
。 - protocol使用以下协议名称之一:协议名称解释tcp 或 tcp4TCP IPv4udp 或 udp4UDP IPv4tcp6TCP IPv6udp6UDP IPv6tcp46TCP IPv4 和 IPv6udp46UDP IPv4 和 IPv6
- {wait|nowait}[/max-child[/max-connections-per-ip-per-minute[/max-child-per-ip]]]在此字段中,必须指定
wait
或nowait
。max-child
、max-connections-per-ip-per-minute
和max-child-per-ip
是可选的。wait|nowait
指示服 务是否能够处理自己的套接字。dgram
socket 类型必须使用wait
而stream
守护程序(通常是多线程的)应使用nowait
。wait
通常将多个套接字交给单个守护程序,同时nowait
为每个新套接字生成一个子守护进程。由max-child
设置可生成的最大子守护程序数。例如,要限制守护程序的十个实例,请在nowait
之后放置一个/10
。指定/0
允许无限数量的子项。max-connections-per-ip-per-minute
限制每分钟来自任何特定 IP 地址的连接数。一旦达到限额,来自这个 IP 地址的进一步连接将被放弃,直到一分钟结束。例如,一个/10
的值将限制任何特定的 IP 地址每分钟 10 次连接尝试。max-child-per-ip
限制在任何时候可以代表任何单一 IP 地址启动的子进程的数量。这些选项可以限制过度的资源消耗,有助于防止拒绝服务攻击。finger stream tcp nowait/3/10 nobody /usr/libexec/fingerd fingerd -k -s
- user守护进程运行时使用的用户名。守护程序通常以
root
、daemon
或nobody
运行。 - server-program守护程序的完整路径。如果守护程序是 inetd 内部提供的服务,请使用
internal
。 - server-program-arguments用于指定在调用时要传递给守护程序的任何命令参数。如果守护程序是内部服务,请使用
internal
。
与大多数服务器守护程序一样,inetd 具有许多可用于修改其行为的选项。默认情况下,inetd 以
-wW -C 60
启动。这些选项为所有服务(包括内部服务)启用 TCP wrapper,并防止任何 IP 地址每分钟请求任何服务超过 60 次。要更改传递给 inetd 的默认选项,请在 /etc/rc.conf 中添加一个
inetd_flags
条目。如果 inetd 已在运行,请使用 service inetd restart
重新启动它。可用的速率限制选项包括:
- -c maximum指定每个服务的默认最大同时调用次数,其中默认值为无限制。可以使用 /etc/inetd.conf 的中
max-child
,在每个服务上覆盖。 - -C rate指定每分钟可以从单个 IP 地址调用服务的默认最大次数。可以使用 /etc/inetd.conf 中的
max-connections-per-ip-per-minute
,在每个服务上覆盖。 - -R rate指定一分钟内可以调用服务的最大次数,其中缺省值为
256
。rate
为0
允许无限数量。 - -s maximum指定在任何时候都可以从单个 IP 地址调用服务的最大次数,其中默认值为无限制。可以使用 /etc/inetd.conf 中的
max-child-per-ip
,在每个服务上覆盖。
许多可以由 inetd 管理的守护程序都不具有安全意识。某些守护程序(如 fingerd)可以提供可能对攻击者有用的信息。仅启用所需的服务,并监控系统是否存在过多的连接尝试。
max-connections-per-ip-per-minute
、max-child
和 max-child-per-ip
可用于限制此类攻击。