分类: LINUX
2009-06-01 23:34:15
2001 年 11 月 01 日
每个 UNIX 管理员都熟悉 inetd,inetd 是一个守护程序,通过一个集中的配置文件(inetd.conf)来管理大多数入网连接。xinetd 守护程序是 inetd 的替代,它提供许多改进的或新的特性,以及更容易的配置。Ted 解释了 inetd 背后的概念,并且给出了在您自己的站点上设置 xinetd 的示例。
经典的 inetd 守护程序已经存在很久了。有几种替换 inetd 的功能的方法,但是最灵活、最简便的方法似乎是 xinetd。inetd 能做的,xinetd 也能做,并且 xinetd 还能做更多的事情。譬如,TCP 封装、模块化配置、连接重定向和入站连接的负载限制,而这些只是使得 xinetd 成为系统管理员良好选择的部分特性。
本文是为从初学者到中级系统管理员这样的读者而准备的,并且文中的说明和示例并不尝试假设您已经熟悉 inetd。在本文中,我们将研究 xinetd 的一些简单用法,从安装到安全性策略的实现。
为实现本文的目的,您的系统最好安装了最近的主流(2000 或更新)UNIX(Linux、Solaris、BSD)。这些示例在 Perl 和 UNIX(以及其它操作系统)的早期版本上也可以运行,但是它们功能方面的障碍应该由读者作为练习来解决。给定的特定示例是用于 Red Hat Linux 的,但是它们在其它系统上应该也可以运行(除 chkconfig 以外)。
|
对于 UNIX 系统管理员,inetd 和 cp/rm/mv 命令一样基本。它总是存在,并准备着处理入站连接。 但它到底是什么?它用来做什么?
首先从 TCP/IP (它也包括 UDP,但我们目前还不考虑)开始回答。当您建立与一台主机的连接时,实际上是创建了一个 TCP/IP 连接(通常是一个套接字) ― 这好象是在您和主机之间打了一个电话。TCP/IP 连接由起始主机和接收主机唯一地定义,但还有其它标识。如果我们都连接到一台服务器,它如何区分 webserver、telnet、SSH、FTP 和其它连接呢?套接字也通过建立连接所使用的端口来定义。例如,端口 21 是入站 FTP、端口 22 是 SSH、端口 23 是 TELNET(有关其它大多数端口,可以查看 UNIX 系统上的 /etc/services)。
一旦建立了连接,某人就在另一端拿起了电话。这可以是接线员或直线。直线表示您直接连接到了服务器,而接线员是涉及 inetd 的方法。接线员实际上处理一组入站直线(主机上的端口),并亲自将它们交给负责的程序(服务器)。
UDP 是另一种连接方法。象 TCP 一样,UDP 基本上是和某人的对话,但是不保证它是可靠的。UDP(继续使用电话的比喻)就象将消息扔到传送带上,让接收者站到另一端。 您可以从传送带得到许多消息,但是如果消息太多(网络流量高)或者读取消息费时太久(服务器忙),则接收者可能会丢失一些消息。
如果使用 inetd,在执行一些检查后,您被重定向到特定服务器。只有一个配置文件 ― inetd.conf,管理所有入站连接。因而在系统上添加、删除、更改或复查服务变得更为简单。例如,在 Solaris 系统上使用 TCP 封装器将 ftp 定义如下:
ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd |
这些是创建一个 FTP 连接所需的全部参数。 简单地说,我们以面向流(stream)的方式使用 TCP/IP(tcp)时,同时允许多个 FTP 连接(nowait)、作为 root 运行以及调用 FTP(接下来,TCP 封装器将调用 FTP 守护程序)。
用一上午的时间解析很困难吗?绝对困难。有必要这么复杂吗?不。xinetd 继承了 inetd 的设计并将它模块化,这意味着每个服务都可以存在于它自己的配置文件中。xinetd 还添加了一些象 TCP 封装器之类的功能部件,使得配置更加简单。
xinetd 保持了中央配置(接线员)方法,将所有配置文件存储到单一位置,通常是 /etc/xinetd.conf 和 /etc/xinetd.d/*,使系统管理员可以更容易地获得。模块化配置意味着,您可以通过将服务复制到 xinetd.d 目录来向多台机器上分发该服务,也可以用同类的手段除去它。甚至可以指定额外的包含目录。
最后,xinetd FAQ(请参阅本文后面的 参考资料)声明了 RPC 程序在 xinetd 下运行得不太好。不过没问题,对 RPC 使用 inetd,并对其它所有服务使用 xinetd。这就象雇了两个接线员,一个说西班牙语,另一个说所有其它语言。
|
那么 xinetd 是什么?一句话,它就是个程序。处理入站网络连接没什么神奇。可以使用 Perl、Python 或 Java 来处理。Xinetd 是用 C 编写的,而且它和它的前辈 inetd 一样快,如果不是更快的话(例如,TCP 封装器不必为每个入站连接而执行;它们在启动时装入内存)。
xinetd 正在开发中。(您的版本可能过时了,所以请务必到主页上查找最新的版本;请参阅 参考资料。)因为它正在开发中,所以 xinetd 的安全漏洞得以迅速弥补,而不象 inetd 那样薄弱,通常要很长时间才能弥补。当然,xinetd 是随源代码一起交付的,所以您可以复查源代码并自己找到可能存在弱点的地方。
如何使用 xinetd 定义服务呢?编写一个服务文件,它除了指定 /etc/xinetd.conf 中所指定的一般参数之外,还指定特定配置。所以,如果 /etc/xinetd.conf 是这样的:
defaults |
您放到 /etc/xinetd.d 中的每个服务文件都会继承这些缺省值,并指定它自己的参数。这里,telnet 服务在顶级定义,而不是在子目录中定义。这太棒了,这种模块性允许复杂的配置。
要使 xinetd 重新读取配置文件,不必重新启动它。只要向它发送 USR2 信号即可。
那些参数表示什么意思?让我们通读整个清单。您也可以在命令行下使用
man xinetd.conf
来查看列表(如果那个帮助页面正确安装的话),但这个概述试图用更简单的术语来解释参数,并不假定您已经知道关于套接字和服务的所有信息。一些参数(rpc_version、rpc_number)被跳过。
|
经典的 TCP 封装器软件包是个非常有用的工具。通过一个集中式的文件(通常是 /etc/hosts.allow 和 /etc/hosts.deny),针对每个服务,根据需要来允许或拒绝对任何主机的访问。 不幸的是,TCP 封装器库不太了解系统负载、资源限制、多重攻击之类的情况。xinetd 合并了 TCP 封装器功能性(通过 libwrap 库),所以您可以顺利地迁移到 xinted,并继续使用和以前相同的配置文件。
这差不多就是迁移所要做的全部工作了。保持旧的 hosts.deny 和 hosts.allow 文件,xinetd 将乐意遵循它们。但是,请牢记,xinetd 有许多在 TCP 封装器基础上改进的连接控制选项。例如,限制每秒连接数或过载时的连接数,可以成为对服务器管理极有价值的帮助。
确保您是使用 libwrap 选项编译 xinetd 的,否则,它将不知道 TCP 封装器。如果 xinetd 来自于 Red Hat Linux 上的 RPM,确保您在开放机器“之前”,测试 TCP 封装器文件是否正常运行。
|
尽管可以有多种方法使用 xinetd,redirect 参数为我们提供了最有趣的使用方法。众所周知,故障转移很难实现,并且硬件故障转移很昂贵。 这里所描述的方法(通过简单的软件)既便宜又有效。它具有单故障点 ― 重定向点,所以您应该考虑该方式是否可接受。如果不能接受,那么,硬件故障转移就贵得有道理了。
首先,确定一种方法从两台或者更多的机器中选出一台“活动的”机器。 假设您通过一个脚本 set_active.pl 来完成(我们将为 telnet 服务完成该步,但是它对任何其他服务也有效,只要能保持服务切换到其他服务器而不带来不良影响)。脚本将采用我们用来设置新故障转移的机器名,以及给我们适当的用于编辑的 /etc/xinetd.d/SERVICE 文件的服务名。请随意定制脚本以编辑不同文件,或使用不同参数。可以用一行“perl -p -i -e”脚本执行这个作业,但您可以在将来对这种方法作许多扩展,并可以对参数执行错误检查。
这太简单了。现在只要决定调用这个脚本的过程即可 ― 可以是手工、通过一个 cron 作业、或者由另一个程序触发。此时,它成为体系结构决策。别忘了在这时向 xinetd 发送 USR2 信号,如果愿意,也可以重新启动它。在 Red Hat Linux 上可以用“pkill -USR2 xinetd”完成信号的自动化,而重新启动 xinetd 只要使用“/etc/rc.d/init.d/xinetd restart”(在 Linux 上)或者其它类似命令(在大多数 UNIX 系统上)。
这种故障转移将“不会”对数据库连通性生效,除非在数据库端做许多额外工作。建议您最好将它用于诸如 rsync、ssh、ftp 和 telnet 之类的协议,其中,故障转移机器彼此没有相互依赖性。
|
很清楚,xinetd 所提供的众多特性是选择它的一个好理由。但是,请不要忘记 xinetd 的其它好处:错误一经报告就得到修正、源代码免费可用以及从现有的 inetd 配置进行迁移(当您使用随 xinetd 一起交付的 itox 助手程序时)非常容易。
为什么不使用 xinetd?向后兼容性将成为您最好的理由,还有与您的特定平台的非兼容性。xinetd 软件在 Solaris 和 Linux 服务器上最流行,所以在您的特定平台上可能会有尚未解决的问题。