16.3.TCP Wrapper

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

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

16.3.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/qpopper 守护程序进行 POP3 连接,应将以下行追加到 hosts.allow

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

每次编辑此文件后,请重新启动 inetd:

# service inetd restart

16.3.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)

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

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

当心

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

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

注意

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