14.4.TCP Wrapper

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

TCP Wrapper 不应该被认为是正确配置的防火墙的替代品。相反,TCP Wrapper 应该与防火墙和其他安全改进措施一起使用,以便在实施安全策略时提供另一层保护。

14.4.1. 初始配置

要在 FreeBSD 中启用 TCP Wrapper,请将以下行添加到 /etc/rc.conf 中:

inetd_enable="YES"
inetd_flags="-Ww"

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

注意:

与 TCP Wrapper 的其他实现不同,在 FreeBSD 中 hosts.deny 的使用已被废弃。所有配置选项都应放在 /etc/hosts.allow 中。

在最简单的配置中,守护程序连接策略是设置为允许或阻止,具体取决于 /etc/hosts.allow 中的选项。FreeBSD 中的默认配置是允许所有与以 inetd 启动的守护程序的连接。

基本配置通常采用的形式为 daemon : address : action,其中 daemon 是 inetd 启动的守护程序,address 是有效的主机名、IP 地址或括在方括号([ ])中的 IPv6 地址,并且 actionallowdeny。TCP Wrapper 使用第一条规则匹配语义,即从头扫描配置文件以寻找匹配规则。当找到一个匹配规则时,该规则被应用,搜索过程停止。

例如,要允许通过 mail/qpopperopen in new window 守护程序进行 POP3 连接,应将以下行追加到 hosts.allow

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

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

# service inetd restart

14.4.2. 高级配置

TCP Wrapper 提供了高级选项,允许更好地控制连接的处理方式。在某些情况下,向某些主机或守护程序连接返回注释可能是合适的。在其他情况下,应记录日志条目或向管理员发送电子邮件。其他情况可能仅需要将服务用于本地连接。这一切都可以通过使用称为通配符、扩展字符和外部命令执行的配置选项来实现。

假设出现了这样一种情况:拒绝连接,但应向试图建立该连接的主机发送原因。twist 是可能的。当尝试连接时,twist 执行一个 shell 命令或脚本。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."

在此示例中,对于未在 hosts.allow 中配置的任何_守护程序_,将返回消息 “You are not allowed to use daemon name from hostname”。这对于在建立的连接断开后立即将答复发送回连接发起方非常有用。返回的任何消息 都必须 用引号(")字符括起来。

警告:

如果攻击者用连接请求淹没这些守护程序,则可能会在服务器上发起拒绝服务攻击。

另一种可能性是使用 spawn。和 twist 一样,spawn 隐式地拒绝连接,可以用于运行外部 shell 命令或脚本。与 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%h。有关完整列表,请参阅 hosts_access(5)open in new window

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

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

小心:

如果客户或服务器的 DNS 设置有问题,使用通配符将导致拒绝连接。

要了解有关通配符及其关联功能的更多信息,请参阅 hosts_access(5)open in new window

注意:

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