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报文的流程:
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 [email protected] ,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