TCP  Wrappers

在之前的文章中我们介绍过iptables,iptables也是一种访问控制机制。由于iptables中的参数过多,对于初学者要想完全掌握iptables有一定的难度。因此,在这里我们介绍另一种简单的访问控制机制,就是TCP Wrappers。

TCP Wrappers的工作原理主要是分析TCP的报头信息,并与/etc/hosts.allow和/etc/hosts.deny中的规则进行匹配,从而决定哪些主机可以访问系统服务或资源。



TCP Wrappers虽然能对TCP协议的报文做过滤动作,但是并不是所有的TCP协议报文TCP Wrappers都可以过滤掉。只有某个服务链接到TCP Wrappers的函式库(这个函式库叫做libwrap.so)才可以使用TCP Wrappers进行报文过滤。

查看某个服务是否链接到libwrap.so这个动态函式库,使用如下命令查看即可:

ldd  $(which 服务名称)或ldd  `which 服务名称`

例如:查看sshd这个服务是否链接到了libwrap.so这个服务,可以使用如下命令:

ldd $(which sshd) | grep 'libwrap'


当然有些服务没有链接到这个动态函式库,TCP Wrappers也可以对它们进行匹配处理。原因是TCP Wrappers的这个函式库被直接编译到这个服务或程序里面去了。所以有些服务也支持TCP Wrappers。

要查看TCP Wrappers的函式库是否被直接编译进某个程序,使用如下命令即可:

string `which 服务名称` | grep  hosts

如果出现如下两行,表示TCP Wrappers函式库被直接编译进某个程序里了。

/etc/hosts.allow

/etc/hosts.deny

这两个文件就是TCP Wrappers匹配规则时用到的文件,出现这两个文件表示该服务支持TCP  Wrappers。


TCP Wrappers匹配TCP报文的流程:

wKiom1RY4obRoSVTAACk3a_uX-g580.jpg

1、当客户端访问服务器端的某个服务时,TCP Wrappers会将该请求报文与/etc/hosts.allow中定义的规则进行匹配;匹配成功,则允许访问服务器的某个服务;

2、如果匹配不成功,在与/etc/hosts.deny中定义的规则进行匹配;如果匹配成功,则拒绝访问某服务。

3、如果匹配没有成功,则执行默认策略,就是允许该客户端访问某服务



/etc/hosts.allow和/etc/hosts.deny的语法格式:

这两个文件的语法格式是一样的,语法格式为:

daemon_list: client_list [:options] 

这里的daemon_list可以是某一个服务的可执行程序的二进制文件名称或其服务列表,或者使用ALL也可以。

其中ALL是一个宏变量,表示所有的服务或进程


client_list:可以是单个IP,NETWORK/MASK、HOSTNAME、宏变量

IP:表示某一个具体的地址

NETWORK/MASK中的掩码必须不能使用长度的格式,例如10.0.0.0/8是不正确的,必须是10.0.0.0/255.0.0.0

如果某个网段是标准的A,B,C类网段,可以这么写,以B类地址为例:172.16.

HOSTNAME:可以是符合FQDN格式的主机名,也可以是domain,域名前面要加'.',例如:.baidu.com

宏变量:

        ALL:表示所有的ip或主机

        LOCAL:表示与本机IP在同一个网段内的主机

        UNKOWN:表示FQDN格式的主机不能被正向解析

        KNOWN:表示FQDN格式的主机名可以被正向解析

        PARANOID:表示主机名正向解析和反向解析无法匹配

        EXCEPT:除了,不包含的意思。


options:这个字段可以省略,options的选项有如下几个:

    allow:表示允许,如果这个选项出现在/etc/host.deny文件中也表示允许的意思

    deny:表示拒绝,如果这个选项出现在/etc/hosts.allow文件中,也表示是拒绝的意思。

    spawn:表示立即执行其后的语句,通常用来记录某个客户端访问某服务的信息


这些规则如果写入到/etc/hosts.allow表示允许访问的意思;写在/etc/hosts.deny中的表示拒绝访问的意思。默认策略为允许访问。


实例一:仅允许sshd这个服务被192.168.108.251访问,并将访问的信息记录下来

解决方法:

#vim  /etc/hosts.allow

sshd: 192.168.108.251: spawn echo "%c want to access to %s,`date`" >> /var/log/tcp_wrappers.log    


在编辑/etc/hosts.deny

#vim /etc/hosts.deny

sshd:ALL


###当192,168.108.251使用sshd服务时,日志信息如下:

[root@mail ~]# tail /var/log/tcp_wrappers.log 

192.168.108.15 want to access sshd@192.168.108.251 ,Wed Nov  5 07:24:43 CST 2014


实例二:除了192.168.108.251不使用telnet服务外,其他主机都可以访问

解决方法:

#vim  /etc/hosts.allow

in.telnetd: EXCEPT 192.168.108.251: spawn echo "%h want to access to %p ,`date`"


#vim /etc/hosts.deny

in.telnetd: ALL


在这里注意的是这里的服务名称是该服务的二进制文件名称,telnet-server的二进制可执行文件为/usr/sbin/in.telnetd,因此这里的服务名称为in.telnetd

在这里还要说明一点:in.telnetd这个服务是瞬时守护进程,瞬时守护进程是由超级守护进程(xinetd)代为管理的,由于超级守护进程接受TCP Wrappers的控制,因此瞬时守护进程也接受TCP Wrappers的控制。


在这里介绍几个TCP Wrappers中的宏变量:

%c和%h:显示客户端的ip地址

%s:显示服务名称和ip,以daemon@IP的形式显示

%p:显示daemon的PID


更多的TCP Wrappers宏变量可以使用如下命令查看:

#man 5  hosts_access