任何熟悉 inetd(8) 都应该听说过 TCP Wrappers, 但几乎没有人对它在网络环境中的作用有全面的理解。 几乎每个人都会安装防火墙来处理网络连接, 然而虽然防火墙有非常广泛的用途, 它却不是万能的, 例如它无法处理类似向连接发起者发送一些文本这样的任务。 而 TCP 软件能够完成它以及更多的其他事情。 接下来的几段中将讨论许多 TCP Wrappers 提供的功能, 并且, 还给出了一些配置实例。
TCP Wrappers 软件扩展了 inetd 为受其控制的服务程序实施控制的能力。 通过使用这种方法, 它能够提供日志支持、 返回消息给联入的连接、 使得服务程序只接受内部连接, 等等。 尽管防火墙也能够完成其中的某些功能, 但这不仅增加了一层额外的保护, 也提供了防火墙所不能提供的功能。
由 TCP Wrappers 所增加的功能不应被看作好的防火墙的替代品; 它应该与防火墙以及其他安全设施一道, 作为系统的一层额外的安全防护来看待。
由于这些配置是对于 inetd 配置的扩展, 因此读者应首先阅读 配置 inetd 一节。
在 FreeBSD 中使用 TCP Wrappers 的唯一要求是确保 inetd 在从 rc.conf 中启动时包含了 -Ww 选项; 这是默认的设置。 当然, 还需要对 /etc/hosts.allow 进行适当的配置, 但 syslogd(8) 在配置不当时会在系统日志中记录相关消息。
Note: 与其它的 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 参数。
TCP Wrappers 也有一些高级的配置选项; 它们能够用来对如何处理连接实施更多的控制。 一些时候, 返回一个说明到特定的主机或请求服务的连接可能是更好的办法。 其他情况下, 记录日志或者发送邮件给管理员可能更为适合。 另外, 一些服务可能只希望为本机提供。 这些需求都可以通过使用 通配符, 扩展字符以及外部命令来实现。 接下来的两节将介绍这些。
假设由于发生了某种状况, 而导致连接应该被拒绝掉, 而将其原因发送给发起连接的人。 如何完成这样的任务呢? 这样的动作可以通过使用 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.” 返回给访问先前没有配置过允许访问的服务客户。 对于希望把消息反馈给连接发起者, 然后立即切断这样的需求来说, 这样的配置非常有用。 请注意所有反馈信息 必须 被引号 " 包围; 这一规则是没有例外的。
Warning如果攻击者向服务程序发送大量的连接请求, 则可能发动一次成功的拒绝服务攻击。
另一种可能是针对这种情况使用 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) 联机手册可以获得完整的列表。
前面的例子都使用了 ALL。 其它选项能够将功能扩展到更远。 例如, ALL 可以被用来匹配每一个服务、 域,或 IP 地址。 另一些可用的通配符包括 PARANOID, 它可以用来匹配任何来自可能被伪造的 IP 地址的主机。 换言之, paranoid 可以被用来定义来自 IP 与其主机名不符的客户。 下面的例子将给您更多的感性认识:
# Block possibly spoofed requests to sendmail: sendmail : PARANOID : deny
在这个例子中, 所有连接 sendmail 的 IP 地址与其主机名不符的主机都将被拒绝。
Caution如果服务器和客户机有一方的 DNS 配置不正确, 使用 PARANOID 可能会严重地削弱服务。 在设置之前, 管理员应该谨慎地考虑。
要了解关于通配符和他们的功能, 请参考 hosts_access(5) 联机手册。
为了使设置能够生效, 应该首先把 hosts.allow 的第一行配置注释掉。 这节的开始部分已经说明了这一点。