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
无论
stream
、dgram
、raw
或seqpacket
。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]]]
在此字段中,必须指定
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 地址启动的子进程的数量。这些选项可以限制过度的资源消耗,有助于防止拒绝服务攻击。在 fingerd(8) 的默认设置中可以看到一个示例:
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
。
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
指定一分钟内可以调用服务的最大次数,其中缺省值为
256
。rate
为0
允许无限数量。-s maximum
指定在任何时候都可以从单个 IP 地址调用服务的最大次数,其中默认值为无限制。可以使用 /etc/inetd.conf 中的
max-child-per-ip
,在每个服务上覆盖。
其他可用选项请参阅 inetd(8),以获取完整的选项列表。
32.2.3. 安全注意事项¶
许多可以由 inetd 管理的守护程序都不具有安全意识。某些守护程序(如 fingerd)可以提供可能对攻击者有用的信息。仅启用所需的服务,并监控系统是否存在过多的连接尝试。max-connections-per-ip-per-minute
、max-child
和 max-child-per-ip
可用于限制此类攻击。
默认情况下,TCP wrapper 处于启用状态。请查阅 hosts_access(5) 以获取有关对各种 inetd 调用的守护程序设置 TCP 限制的更多信息。