14.4.TCP Wrapper

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

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

14.4.1. 初始配置

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

  1. inetd_enable="YES"
  2. 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

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

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

  1. # service inetd restart

14.4.2. 高级配置

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

假设出现了这样一种情况:拒绝连接,但应向试图建立该连接的主机发送原因。twist 是可能的。当尝试连接时,twist 执行一个 shell 命令或脚本。 hosts.allow 中有一个示例:

  1. # The rest of the daemons are protected.
  2. ALL : ALL \
  3. : severity auth.info \
  4. : 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 不会向建立连接的主机发送回复。例如,考虑以下配置:

  1. # We do not allow connections from example.com:
  2. ALL : .example.com \
  3. : spawn (/bin/echo %a from %h attempted to access %d >> \
  4. /var/log/connections.log) \
  5. : deny

这将拒绝来自 *.example.com 的所有连接尝试,并将主机名、IP 地址和试图访问的守护进程记录到 /var/log/connections.log。这个例子使用了替换字符 %a%h。有关完整列表,请参阅 hosts_access(5)

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

  1. # Block possibly spoofed requests to sendmail:
  2. sendmail : PARANOID : deny
警慎
如果客户或服务器的 DNS 设置有问题,使用通配符将导致拒绝连接。

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

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