32.2. inetd 超级服务器

守护进程 inetd(8) 有时被称为超级服务器,因为它管理了许多服务的连接。只需启动 inetd 服务,而无需启动多个应用程序。当收到由 inetd 管理的服务的连接时,它会确定连接的目标程序,为该程序生成一个进程,并向该程序委派一个套接字。与在独立模式下单独运行每个守护程序相比,对未大量使用的服务使用 inetd 可以减少系统负载。

inetd 主要用于生成其他守护程序,但有几个简单的协议在内部处理,例如 chargen、auth、time、echo、discard 和 daytime。

本节介绍配置 inetd 的基础知识。

32.2.1. 配置文件

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

通常情况下,一个应用程序的默认条目除了删除 # 外,不需要其他编辑。在某些情况下,编辑默认条目可能是合适的。

例如,这是 ftpd(8) 在 IPv4 上的默认条目:

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

    无论 streamdgramrawseqpacket。TCP 连接使用 stream,UDP 服务使用 dgram

  • protocol

    使用以下协议名称之一:

    协议名称

    解释

    tcp 或 tcp4

    TCP IPv4

    udp 或 udp4

    UDP IPv4

    tcp6

    TCP IPv6

    udp6

    UDP IPv6

    tcp46

    TCP IPv4 和 IPv6

    udp46

    UDP IPv4 和 IPv6

  • {wait|nowait}[/max-child[/max-connections-per-ip-per-minute[/max-child-per-ip]]]

    在此字段中,必须指定 waitnowaitmax-childmax-connections-per-ip-per-minutemax-child-per-ip 是可选的。

    wait|nowait 指示服务是否能够处理自己的套接字。dgram socket 类型必须使用 waitstream 守护程序(通常是多线程的)应使用 nowaitwait 通常将多个套接字交给单个守护程序,同时 nowait 为每个新套接字生成一个子守护进程。

    max-child 设置可生成的最大子守护程序数。例如,要限制守护程序的十个实例,请在 nowait 之后放置一个 /10。指定 /0 允许无限数量的子项。

    max-connections-per-ip-per-minute 限制每分钟来自任何特定 IP 地址的连接数。一旦达到限额,来自这个 IP 地址的进一步连接将被放弃,直到一分钟结束。例如,一个 /10 的值将限制任何特定的 IP 地址每分钟 10 次连接尝试。 max-child-per-ip 限制在任何时候可以代表任何单一 IP 地址启动的子进程的数量。这些选项可以限制过度的资源消耗,有助于防止拒绝服务攻击。

    fingerd(8) 的默认设置中可以看到一个示例:

    finger stream tcp nowait/3/10 nobody /usr/libexec/fingerd fingerd -k -s

  • user

    守护进程运行时使用的用户名。守护程序通常以 rootdaemonnobody 运行。

  • server-program

    守护程序的完整路径。如果守护程序是 inetd 内部提供的服务,请使用 internal

  • server-program-arguments

    用于指定在调用时要传递给守护程序的任何命令参数。如果守护程序是内部服务,请使用 internal

32.2.2. 命令行选项

与大多数服务器守护程序一样,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

    指定一分钟内可以调用服务的最大次数,其中缺省值为 256rate0 允许无限数量。

  • -s maximum

    指定在任何时候都可以从单个 IP 地址调用服务的最大次数,其中默认值为无限制。可以使用 /etc/inetd.conf 中的 max-child-per-ip,在每个服务上覆盖。

其他可用选项请参阅 inetd(8),以获取完整的选项列表。

32.2.3. 安全注意事项

许多可以由 inetd 管理的守护程序都不具有安全意识。某些守护程序(如 fingerd)可以提供可能对攻击者有用的信息。仅启用所需的服务,并监控系统是否存在过多的连接尝试。max-connections-per-ip-per-minutemax-childmax-child-per-ip 可用于限制此类攻击。

默认情况下,TCP wrapper 处于启用状态。请查阅 hosts_access(5) 以获取有关对各种 inetd 调用的守护程序设置 TCP 限制的更多信息。