通过网络提供应用程序服务的程序被称为网络守护进程。守护进程是一个程序,它打开一个端口,最常见的是一个知名的服务端口,并等待其上的传入连接。如果发生连接,守护进程会创建一个子进程来接受连接,而父进程继续监听进一步的请求。这种机制运作良好,但有一些缺点;您希望提供的每个可能的服务都必须始终在内存中至少有一个实例处于活动状态。此外,执行监听和端口处理的软件例程必须在每个网络守护进程中复制。
为了克服这些低效率,大多数 Unix 安装运行一个特殊的网络守护进程,您可以将其视为“超级服务器”。此守护进程代表许多服务创建套接字,并同时监听所有这些套接字。当在任何这些套接字上接收到传入连接时,超级服务器接受连接并派生为此端口指定的服务器,将套接字传递给子进程进行管理。然后服务器返回监听状态。
最常见的超级服务器称为 inetd,即 Internet 守护进程。它在系统启动时启动,并从名为/etc/inetd.conf的启动文件中获取要管理的服务列表。除了这些服务器之外,inetd 本身还执行许多简单的服务,称为内部服务。它们包括 chargen(它只是生成一个字符串)和 daytime(它返回系统对当前时间的理解)。
此文件中的条目由单行组成,该行由以下字段组成
service type protocol wait user server cmdline |
每个字段在以下列表中描述
给出服务名称。服务名称必须通过在/etc/services文件中查找来转换为端口号。该文件将在本章后面的 12.3 节 中描述。”
指定套接字类型,可以是 stream(用于面向连接的协议)或 dgram(用于数据报协议)。因此,基于 TCP 的服务应始终使用 stream,而基于 UDP 的服务应始终使用 dgram。
命名服务使用的传输协议。这必须是在protocols文件中找到的有效协议名称,稍后会解释。
此选项仅适用于 dgram 套接字。它可以是 wait 或 nowait。如果指定了 wait,则 inetd 在任何时候都只为指定的端口执行一个服务器。否则,它会在执行服务器后立即继续监听端口。
这对于“单线程”服务器很有用,这些服务器会读取所有传入的数据报,直到没有更多数据报到达,然后退出。大多数 RPC 服务器都是这种类型,因此应指定 wait。相反的类型,“多线程”服务器,允许无限数量的实例同时运行。这些服务器应指定 nowait。
stream 套接字应始终使用 nowait。
这是将在进程执行时拥有该进程的用户的登录 ID。这通常是 root 用户,但某些服务可能会使用不同的帐户。在这里应用最小权限原则是一个非常好的主意,该原则指出,如果程序不需要特权帐户才能正常运行,则不应在该帐户下运行命令。例如,NNTP 新闻服务器以 news 身份运行,而可能构成安全风险的服务(例如 tftp 或 finger)通常以 nobody 身份运行。
给出要执行的服务器程序的完整路径名。内部服务用关键字 internal 标记。
这是要传递给服务器的命令行。它以要执行的服务器的名称开头,并且可以包含任何需要传递给它的参数。如果您正在使用 TCP wrapper,请在此处指定服务器的完整路径名。如果不是,那么您只需指定您希望它在进程列表中显示的服务器名称。我们稍后将讨论 TCP wrapper。
此字段对于内部服务为空。
一个示例inetd.conf文件显示在示例 12-1中。finger 服务被注释掉,因此不可用。这通常是出于安全原因而完成的,因为它可能被攻击者用来获取您系统上用户的姓名和其他详细信息。
示例 12-1. /etc/inetd.conf 文件的示例
# # inetd services ftp stream tcp nowait root /usr/sbin/ftpd in.ftpd -l telnet stream tcp nowait root /usr/sbin/telnetd in.telnetd -b/etc/issue #finger stream tcp nowait bin /usr/sbin/fingerd in.fingerd #tftp dgram udp wait nobody /usr/sbin/tftpd in.tftpd #tftp dgram udp wait nobody /usr/sbin/tftpd in.tftpd /boot/diskless #login stream tcp nowait root /usr/sbin/rlogind in.rlogind #shell stream tcp nowait root /usr/sbin/rshd in.rshd #exec stream tcp nowait root /usr/sbin/rexecd in.rexecd # # inetd internal services # daytime stream tcp nowait root internal daytime dgram udp nowait root internal time stream tcp nowait root internal time dgram udp nowait root internal echo stream tcp nowait root internal echo dgram udp nowait root internal discard stream tcp nowait root internal discard dgram udp nowait root internal chargen stream tcp nowait root internal chargen dgram udp nowait root internal |
tftp 守护进程也显示为已注释掉。tftp 实现了简单文件传输协议 (TFTP),它允许某人从您的系统中传输任何世界可读的文件,而无需密码检查。这对于/etc/passwd文件尤其有害,当您不使用影子密码时更是如此。
TFTP 通常由无盘客户端和 X 终端用于从引导服务器下载其代码。如果您需要为此原因运行 tftpd,请确保将其范围限制为客户端将从中检索文件的那些目录;您需要将这些目录名称添加到 tftpd 的命令行中。这在示例中的第二个 tftp 行中显示。