TCP Wrappers 的注意事项

通常情况下,可以在 hosts.deny 里面建立一条 ALL:ALL 的规则,再到 hosts.allow 里面定义允许放行的服务。该做法理论可行,但实际操作中会遇到不少问题:任何一个有权限的人都可以通过 hosts.allow 添加权限,或者干脆将 hosts.deny 删除,因此比较好的方式是在 hosts.allow 的最后追加:
ALL:ALL:DENY

或者再追加一条:

ALL:DENY
这样即使 hosts.deny 被删除,对系统也没有影响。

另外在使用:
service : ALL : allow
service : ALL : deny
这两条规则时要注意,一旦匹配到该行,接下来的所有规则将被忽略,因此,上面这两条规则需要放在所有规则的最后,如果按下面的写法则无效:
sshd : ALL : allow
sshd : bad.host : deny
sshd : 88.4.2. : deny

正确的写法如下:
sshd : bad.host : deny
sshd : 8.8.4.2. : deny
sshd : ALL : allow

除了上面一般规则,还可以使用 spawn 或者 twist 选项。前者用来执行一个 shell 命令;后者用特定的命令来替代请求的服务,并且 twist 需要写在规则的最后:
sshd : 220.181.111.86 : spawn echo `/bin/date` access denied from %h >> /var/log/syslog : deny

其实上面的记录在 auth.log 里面都有类似的记录:
Aug  8 10:48:17 jaseywang sshd[26680]: refused connect from 220.181.111.86(220.181.111.86)

更详细的用法请看这里,这里(1, 2)。还有一点需要注意的是,类似 sshd:192.168.1.0/24 的写法在某些发行版本(CentOS 5.5)上是识别不出的,必须写成 192.168.1.0/255.255.255.0 的形式。