13.4. TCP Wrapper

Written by Tom Rhodes.

TCP Wrapper 是一种基于主机的访问控制系统, 它扩展了 第 29.2 节 “inetd超级服务器” 的能力。它可以配置为在inetd控制下为服务器守护进程提供日志记录支持、返回消息和连接限制。更多有关TCP Wrapper的功能信息,请参阅tcpd(8)

然而,TCP Wrapper不应被视为好的防火墙的替代品。TCP Wrapper 应结合防火墙或其他安全加强设施一并使用, 为系统多提供一层安全防护。

13.4.1. 初始设定初始配置

要在 FreeBSD 中启用 TCP Wrapper,添加下面这行到/etc/rc.conf

inetd_enable="YES"
inetd_flags="-Ww"

然后,正确配置/etc/hosts.allow

注意:

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

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

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

例如,为了允许POP3 连接通过mail/qpopper程序,将下面这行添加到hosts.allow最后一行:

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

每当编辑此文件时,请重新启动inetd

# service inetd restart

13.4.2. 高级配置

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. 返回给访问先前没有配置过允许访问的服务客户。 对于希望把消息反馈给连接发起者, 然后立即切断这样的需求来说, 这样的配置非常有用。 请注意所有反馈信息 必须 被引号 " 包围; 这一规则是没有例外的。

警告:

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

另一种可能是针对这种情况使用 spawn。 类似 twistspawn 选项也暗含拒绝连接, 并可以用来执行外部命令或服务。 与 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) 联机手册可以获得完整的列表。

要匹配守护程序,域或IP地址的每个实例,请使用ALL。 另一个通配符是PARANOID,可用于匹配任何提供伪造IP地址的主机,因为该IP地址与其解析的主机名不同。 在此示例中,到Sendmail的所有与其主机名不同的IP地址连接请求都将被拒绝:

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

小心:

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

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

注意:

添加新的配置行时,请确保在 hosts.allow 主机中注释该守护进程的任何不需要的条目。

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

如果对于FreeBSD有问题,请先阅读 文档,如不能解决再联系 <questions@FreeBSD.org>.

关于本文档的问题请发信联系 <doc@FreeBSD.org>.