一个有用的工具是 tcpd, 它被称为守护进程包装器。 对于您想要监控或保护的 TCP 服务,它会被调用来代替服务器程序。 tcpd 将请求记录到 syslog 守护进程,检查远程主机是否被允许使用该服务,并且只有当检查成功时,它才会执行真正的服务器程序。 请注意,这不适用于基于 UDP 的服务。
例如,要包装 finger 守护进程,您必须将 inetd.conf 中相应的行更改为
# wrap finger daemon finger stream tcp nowait root /usr/sbin/tcpd in.fingerd在不添加任何访问控制的情况下,这对客户端来说就像通常的 finger 设置一样,只是任何请求都会被记录到 syslog 的 auth facility 中。
访问控制是通过名为 /etc/hosts.allow 和 /etc/hosts.deny 的两个文件来实现的。 它们分别包含允许和拒绝访问特定服务和主机的条目。 当 tcpd 处理来自名为 biff.foobar.com 的客户端主机对 finger 等服务的请求时,它会按顺序扫描 hosts.allow 和 hosts.deny,以查找与服务和客户端主机都匹配的条目。 如果在 hosts.allow 中找到匹配的条目,则授予访问权限,而无需考虑 hosts.deny 中的任何条目。 如果在 hosts.deny 中找到匹配的条目,则通过关闭连接来拒绝请求。 如果根本没有找到匹配项,则接受请求。
访问文件中的条目看起来像这样
servicelist: hostlist [:shellcmd]servicelist 是来自 /etc/services 的服务名称列表,或关键字 ALL。 要匹配除 finger 和 tftp 之外的所有服务,请使用 ``ALL EXCEPT finger, tftp''。
hostlist 是主机名或 IP 地址列表,或关键字 ALL、LOCAL 或 UNKNOWN。 ALL 匹配任何主机,而 LOCAL 匹配不包含点的域名。 UNKNOWN 匹配任何名称或地址查找失败的主机。 以点开头的名称匹配所有域等于此名称的主机。 例如,.foobar.com 匹配 biff.foobar.com。 还有针对 IP 网络地址和子网号的规定。 详细信息请参阅 hosts_access(5) 手册页。
要拒绝除本地主机之外的所有主机访问 finger 和 tftp 服务,请将以下内容放入 /etc/hosts.deny 中,并保持 /etc/hosts.allow 为空
in.tftpd, in.fingerd: ALL EXCEPT LOCAL, .your.domain可选的 shellcmd 字段可能包含一个 shell 命令,当条目匹配时将被调用。 这对于设置可能暴露潜在攻击者的陷阱很有用
in.ftpd: ALL EXCEPT LOCAL, .vbrew.com : echo "request from %d@%h" >> /var/log/finger.log; if [ %h != "vlager.vbrew.com" ]; then finger -l @%h >> /var/log/finger.log fi%h 和 %d 参数分别由 tcpd 扩展为客户端主机名和服务名称。 详细信息请参阅 hosts_access(5) 手册页。