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 地址,并且 action
是 allow
或 deny
。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 中注释掉该守护进程的任何不需要的条目。