FreeBSD 使用手册
上一页 | 第14章 　安全 | 下一页

# 14.6 TCP Wrappers

作者Tom Rhodes.

每一个熟悉 inetd(8) 都应该听说过 TCP Wrappers， 但几乎没有人对它在网络环境中的作用有全面的理解。 几乎每个人都会安装防火墙来处理网络连接， 然而虽然防火墙有非常广泛的用途， 它却不是万能的， 例如它无法处理类似向连接发起者发送一些文本这样的任务。 而 TCP Wrappers 软件能够完成它以及更多的其他事情。 接下来的几段中将讨论许多 TCP Wrappers 提供的功能， 并且， 还给出了一些配置实例。

TCP Wrappers 软件扩展了 inetd 为受其控制的服务程序实施控制的能力。 通过使用这种方法， 它能够提供日志支持、 返回消息给联入的连接、 使得服务程序只接受内部连接， 等等。 尽管防火墙也能够完成其中的某些功能， 但这不仅增加了一层额外的保护， 也提供了防火墙无法提供的功能。

然而， 由 TCP Wrappers 提供的一些额外的安全功能， 不应被视为好的防火墙的替代品。 TCP Wrappers 应结合防火墙或其他安全加强设施一并使用， 为系统多提供一层安全防护。

由于这些配置是对于 inetd 的扩展， 因此， 读者应首先阅读 配置 inetd 这节。

> 注意: 尽管由 inetd(8) 运行的程序并不是真正的 “服务程序”， 但传统上也把它们称为服务程序。 下面仍将使用这一术语。

## 14.6.1 初始配置

在 FreeBSD 中使用 TCP Wrappers 的唯一要求是确保 inetd 在从 `rc.conf` 中启动时包含了 `-Ww` 选项； 这是默认的设置。 当然， 还需要对 `/etc/hosts.allow` 进行适当的配置， 但 syslogd(8) 在配置不当时会在系统日志中记录相关消息。

> 注意: 与其它的 TCP Wrappers 实现不同， 使用 `hosts.deny` 在这里被认为是不推荐和过时的做法。 所有的配置选项应放到 `/etc/hosts.allow` 中。

在最简单的配置中， 服务程序的连接策略是根据 `/etc/hosts.allow` 允许或阻止。 FreeBSD 中的默认配置是允许一切发到由 inetd 所启动的服务的连接请求。 在基本配置之后将讨论更复杂的情况。

基本配置的形式通常是 `服务 : 地址 : 动作`。 这里 `服务` 是从 `inetd` 启动的服务程序的名字。 而 `地址` 可以是任何有效的主机名、 一个 IP 或由方括号 ([ ]) 括起来的 IPv6 地址。 `动作` 字段可以使 `allow` 或 `deny`， 分别用于允许和禁止相应的访问。 在配置时您需要注意所有的配置都是按照第一个匹配的规则运转的， 这表示配置文件将按照顺序查找匹配规则， 而一旦找到匹配， 则搜索也就停止了。

另外也有许多其他选项， 这些将在后面介绍。 简单的配置行从上面这些描述之中可以很容易得出。 例如， 允许 POP3 连接通过 `mail/qpopper` 服务， 应把下面的行添加到 `hosts.allow`：

    # This line is required for POP3 connections:
    qpopper : ALL : allow

增加这样之后， 需要重新启动 inetd。 可以通过使用 kill(1) 命令来完成这项工作， 或使用 `/etc/rc.d/inetd` 的 `restart` parameter 参数。

## 14.6.2 高级配置

TCP Wrappers 也有一些高级的配置选项； 它们能够用来对如何处理连接实施更多的控制。 一些时候， 返回一个说明到特定的主机或请求服务的连接可能是更好的办法。 其他情况下， 记录日志或者发送邮件给管理员可能更为适合。 另外， 一些服务可能只希望为本机提供。 这些需求都可以通过使用 `通配符`， 扩展字符以及外部命令来实现。 接下来的两节将介绍这些。

### 14.6.2.1 外部命令

假设由于发生了某种状况， 而导致连接应该被拒绝掉， 而将其原因发送给发起连接的人。 如何完成这样的任务呢？ 这样的动作可以通过使用 `twist` 选项来实现。 当发起了连接请求时， `twist` 将调用一个命令或脚本。 在 `hosts.allow` 文件中已经给出了一个例子：

    # The rest of the daemons are protected.
    ALL : ALL \
            : severity auth.info \
            : twist /bin/echo "You are not welcome to use %d from %h."

这个例子将把消息 “You are not allowed to use `daemon` from `hostname`.” 返回给访问先前没有配置过允许访问的服务客户。 对于希望把消息反馈给连接发起者， 然后立即切断这样的需求来说， 这样的配置非常有用。 请注意所有反馈信息 必须 被引号 `"` 包围； 这一规则是没有例外的。

> 警告: 如果攻击者向服务程序发送大量的连接请求， 则可能发动一次成功的拒绝服务攻击。

另一种可能是针对这种情况使用 `spawn`。 类似 `twist`， `spawn` 选项也暗含拒绝连接， 并可以用来执行外部命令或服务。 与 `twist` 不同的是， `spawn` 不会向连接发起者发送回应。 考虑下面的配置：

    # We do not allow connections from example.com:
    ALL : .example.com \
        : spawn (/bin/echo %a from %h attempted to access %d >> \
          /var/log/connections.log) \
        : deny

这将拒绝来自 `*.example.com` 域的所有连接； 同时还将记录主机名， IP 地址， 以及对方所尝试连接的服务名字到 `/var/log/connections.log` 文件中。

除了前面已经介绍过的转义字符， 例如 `%a` 之外， 还有一些其它的转义符。 参考 hosts_access(5) 联机手册可以获得完整的列表。

### 14.6.2.2 通配符选项

前面的例子都使用了 `ALL`。 其它选项能够将功能扩展到更远。 例如， `ALL` 可以被用来匹配每一个服务、 域，或 IP 地址。 另一些可用的通配符包括 `PARANOID`， 它可以用来匹配任何来自可能被伪造的 IP 地址的主机。 换言之， `paranoid` 可以被用来定义来自 IP 与其主机名不符的客户。 下面的例子将给您更多的感性认识：

    # Block possibly spoofed requests to sendmail:
    sendmail : PARANOID : deny

在这个例子中， 所有连接 `sendmail` 的 IP 地址与其主机名不符的主机都将被拒绝。

> 小心: 如果服务器和客户机有一方的 DNS 配置不正确， 使用 `PARANOID` 可能会严重地削弱服务。 在设置之前， 管理员应该谨慎地考虑。

要了解关于通配符和他们的功能， 请参考 hosts_access(5) 联机手册。

为了使设置能够生效， 应该首先把 `hosts.allow` 的第一行配置注释掉。 这节的开始部分已经说明了这一点。

上一页 | 起始页 | 下一页
一次性口令 | 上一级 | KerberosIV

本文档和其它文档可从这里下载：ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

如果对于FreeBSD有问题，请先阅读文档，如不能解决再联系<questions@FreeBSD.org>.
关于本文档的问题请发信联系 <doc@FreeBSD.org>.