第21章 其他文件系统
附录 D. OpenPGP 密钥
30.2.inetd 超级服务器
inetd(8) 守护进程有时被称为超级服务器,因为它管理许多服务的连接。只需启动 inetd 服务,而不是启动多个应用程序。当收到由 inetd 管理的服务的连接时,它会确定连接的目标程序,为该程序生成一个进程,并向该程序委派一个套接字。与在独立模式下单独运行每个守护程序相比,对未大量使用的服务使用 inetd 可以减少系统负载。
inetd 主要用于生成其他守护程序,但有几个简单的协议在内部处理,例如 chargen、auth、time、echo、discard 和 daytime。
本节介绍配置 inetd 的基础知识。

30.2.1. 配置文件

inetd 的配置是通过编辑 /etc/inetd.conf 来完成的。此配置文件的每一行都表示一个可由 inetd 启动的应用程序。默认情况下,每行都以注释 (#) 开头,这意味着 inetd 不侦听任何应用程序。要将 inetd 配置为侦听应用程序的连接,请删除该应用程序的行首处的 #
保存编辑后,通过编辑 /etc/rc.conf 将 inetd 配置为在系统启动时启动:
1
inetd_enable="YES"
Copied!
要立即启动 inetd,以便它侦听你配置的服务,请键入:
1
# service inetd start
Copied!
一旦 inetd 启动,每当对 /etc/inetd.conf 进行修改时,都需要通知它:
示例 1.重新加载 inetd 配置文件
1
# service inetd reload
Copied!
通常,除了删除 # 。在某些情况下,编辑默认条目可能是合适的。
例如,这是 ftpd(8) 在 IPv4 上的默认条目:
1
ftp stream tcp nowait root /usr/libexec/ftpd ftpd -l
Copied!
条目中的七列如下所示:
1
service-name
2
socket-type
3
protocol
4
{wait|nowait}[/max-child[/max-connections-per-ip-per-minute[/max-child-per-ip]]]
5
user[:group][/login-class]
6
server-program
7
server-program-arguments
Copied!
此处:
  • 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]]]
    在此字段中,waitnowait 必须指定。max-child max-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

30.2.2. 命令行选项

与大多数服务器守护程序一样,inetd 具有许多可用于修改其行为的选项。默认情况下,inetd 以 -wW -C 60 启动。这些选项为所有服务(包括内部服务)启用 TCP 包装器,并防止任何 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) 以获取完整的选项列表。

30.2.3. 安全注意事项

许多可以由 inetd 管理的守护程序都不具有安全意识。某些守护程序(如 fingerd)可以提供可能对攻击者有用的信息。仅启用所需的服务,并监控系统是否存在过多的连接尝试。max-connections-per-ip-per-minutemax-childmax-child-per-ip 可用于限制此类攻击。
默认情况下,TCP 包装器处于启用状态。请查阅 hosts_access(5) 以获取有关对各种 inetd 调用的守护程序设置 TCP 限制的更多信息。