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 配置为在系统启动时启动: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session inetd_enable="YES" 要立即启动 inetd,以便它侦听你配置的服务,请键入: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # service inetd start inetd 启动后,每当对 **/etc/inetd.conf** 进行修改时,都需要通知它: **例 44.重新加载 inetd 配置文件** .. code:: shell-session # service inetd reload 通常情况下,一个应用程序的默认条目除了删除 ``#`` 外,不需要其他编辑。在某些情况下,编辑默认条目可能是合适的。 例如,这是 `ftpd(8) `__ 在 IPv4 上的默认条目: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session ftp stream tcp nowait root /usr/libexec/ftpd ftpd -l 条目中的七列如下所示: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session 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 限制的更多信息。