FreeBSD下也有“看门人”--浅谈tcpwrapper的基本使用方法

曾几何时 , 不知道你是否与笔者小神一样 , 有在FreeBSD下实现与WIN2000中的IPSec安全策略实现访问控制的一样功能的想法呢?也许这对刚刚接触FreeBSD的朋友来说是一种奢望 , 不仅是因为FreeBSD与Windows系统的配置方式截然不同(特别是像小神这种喜欢跑shell的人) 。不过不用失望 , 只要阁下用几分钟的时间专心看完下面的这篇文章的话 , 相信会有意外的收获的:) 。

首先我要为大家讲解一下什么是tcpwrapper 。tcpwrapper是传统Unix系统的主要安全组件之一 , 通过使用它我们能够监控大多数的网络服务进程 , 从而达到网络服务访问控制(形象点说它的功能就像一个看门人 , 当有请求进入时 , 它就会将请求内容分解 , 并与相应的设置规则进行配对 , 一旦找到相应的规则时就会自动调入相应的操作了) 。在现在主流的FreeBSD4.x中它已经成为了内核中的基本“设施” , 且使用的方法也有了一定的改变 。今天我们就以telnetd为实验对象来完成一次网络服务访问控制操作吧 。

实验环境:
一台普通的586 , 跑FreeBSD4.7 , 使用PPPoE并做成ADSL网关 , 开了telnetd服务进行客户端管理(外网内网都可以访问) 。

实验目的:
使用tcpwrapper监控telnetd服务 , 使外网无法登陆telnetd 。

操作基本过程:

首先需要配置一下tcpwrapper的访问控制规则文件hosts.allow(需要注意 , 以前的传统的tcpwrapper都是用两个配置文件的 , hosts.allow与hosts.deny , 通过使用它们进行交配式的规则管理 。这样非常烦琐也不够直观 , 在FREEBSD3.2以后这个问题得到了新的改良 , 现在系统默认只需要使用hosts.allow一个文件就可以了 , 当然 , hosts.deny你也可以自行建立 , 这是很自由的) 。打开hosts.allow的配置来看看吧:
alex# cat /etc/hosts.allow
看出规则的基本配置语法了吗?最基本的语法就是: 服务对象 : 客户端对象地址 : 行为
当然 , 除此之外还有多种的语法演变方式 , 大家可以在默认存在的/etc/hosts.allow的注释文本中找到相关的资料 。

现在我们要做的就是编写自己的规则 。在修改规则文件前还是先备份原来的规则文件吧 。
alex# cp hosts.allow hosts.allow.bak
用ee打开hosts.allow:
alex# ee /etc/hosts.allow
在文档的开始部分找到ALL : ALL : allow这句规则(这句规则是允许所有的服务与客户端地址的) , 在它的前面加上#符号 , 也就是改成:
#ALL : ALL : allow

在hosts.allow中默认是没有针对telnetd服务的配对规则的 , 所以这里我们需要自行加上 。找到下面的语句段:
# The rest of the daemons are protected.
ALL : ALL
: severity auth.info
: twist /bin/echo "You are not welcome to use %d from %h."
这个是整个规则群中最后的“保险”规则(当tcpwrapper在规则群中找不到相关的配对规则时就会根据这个规则进行处理了) 。
---------------------------------------------------------------------------------------------
小提示:
也许有人会问:如果我把这个“保险”规则给停了(删除了该规则语句或在前面加“#”号) , 而tcpwrapper又找不到相应的规则 , 那tcpwrapper会如何处理呢?这样的话inetd(超级网络服务进程)会跳过tcpwrapper功能而直接把执行权交给相应的网络服务进程的 。
---------------------------------------------------------------------------------------------

在这个规则的上方加上下列的规则语句:
telnetd : 192.168.1.0/255.255.255.0 : allow #192.168.1.0/255.255.255.0是小神家中其他机器所
#使用的IP段
telnetd : ALL : deny #禁止其他所有的客户端地址访问本机的telnetd服务

有一点是需要注意的:hosts.allow中的规则群使用的方法与我们通常所使用的防火墙规则群的原理都是一样的 , 都是上下之分 , 越处于上方的规则它的优先执行权就越高 。所以这里我们必须把:

推荐阅读