每一个熟悉 inetd(8) 都应该听说过 TCP Wrappers, 但几乎没有人对它在网络环境中的作用有全面的理解。 几乎每个人都会安装防火墙来处理网络连接, 然而虽然防火墙有非常广泛的用途, 它却不是万能的, 例如它无法处理类似向连接发起者发送一些文本这样的任务。 而 TCP Wrappers 软件能够完成它以及更多的其他事情。 接下来的几段中将讨论许多 TCP Wrappers 提供的功能, 并且, 还给出了一些配置实例。
TCP Wrappers 软件扩展了 inetd 为受其控制的服务程序实施控制的能力。 通过使用这种方法, 它能够提供日志支持、 返回消息给联入的连接、 使得服务程序只接受内部连接, 等等。 尽管防火墙也能够完成其中的某些功能, 但这不仅增加了一层额外的保护, 也提供了防火墙无法提供的功能。
然而, 由 TCP Wrappers 提供的一些额外的安全功能, 不应被视为好的防火墙的替代品。 TCP Wrappers 应结合防火墙或其他安全加强设施一并使用, 为系统多提供一层安全防护。
由于这些配置是对于 inetd 的扩展, 因此, 读者应首先阅读 配置 inetd 这节。
尽管由 inetd(8) 运行的程序并不是真正的 “服务程序”, 但传统上也把它们称为服务程序。 下面仍将使用这一术语。
在 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 参数。
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
。
类似 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 地址与其主机名不符的主机都将被拒绝。
如果服务器和客户机有一方的
DNS 配置不正确,
使用 PARANOID
可能会严重地削弱服务。
在设置之前, 管理员应该谨慎地考虑。
要了解关于通配符和他们的功能, 请参考 hosts_access(5) 联机手册。
为了使设置能够生效, 应该首先把
hosts.allow
的第一行配置注释掉。
这节的开始部分已经说明了这一点。
本文档和其它文档可从这里下载: ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.
如果对于FreeBSD有问题,请先阅读
文档,如不能解决再联系
<[email protected]>.
关于本文档的问题请发信联系
<[email protected]>.