Tcp Wrapper
 
    tcp wrapper是一种访问控制工具,基于tcpd进程实现对某些自身访问控制功能薄弱的能够支持tcpwrapper的基于tcp协议的服务提供访问控制服务。 
    tcp wrapper通过tcpd协议代为服务监听服务本身所监听的端口,当有连接请求的时候,根据自身制定的规则来进行过滤,如果请求通过,则转交给提供服务的本身,如果请求不通过则直接拒绝。
    tcp wrapper规则放在/etc/hosts.allow和/etc/hosts.deny文件中,一般情况前者放置被允许的规则,后者放置被拒绝的规则,两个文件一起来进行请求的过滤。
    
    ttcp wrapper的过滤请求的过程
    1、首先检查hosts.allow文件,看是否有相应匹配的规则,如果有就允许请求通过,如果没有匹配的规则就送给hosts.deny文件进行过滤。
    2、然后检查hosts.deny文件,看是否有匹配的规则,如果有就拒绝,如果还是没有匹配的规则就默认请求通过。

    tcp wrapper制定访问控制规则的时候是根据服务的二进制命令名来实施的,而不是服务本身的名字,所以我们在制定规则时应先查看服务的二进制命令名。

    并不是所有的服务都支持tcp wrappe,在为某个服务通过tcp wrappe制定访问控制服务之前,我们应该先查看这个服务是否支持tcp wrappe查看的方法有以下两种:
     1、通过查看服务在编译时动态连接的库来判断:
        如果显示的动态连接的库里有 libwrap.so.0 , 就表示可以被tcp wrappe支持
        使用命令:ldd  `which COMMAND`(服务的二进制命令),显示服务的动态连接库
     2、通过strings命令进行判断
        但有些服务编译的时候不使用共享动态连接库,而是使用静态库进行编译,所以使用上个面的判断方法就不准确了
        使用命令strings `which  COMMAND`   |  grep 'hosts'
        如果显示的有/etc/hosts.allow和/etc/hosts.deny则表示能够被tcp wrappe支持

    通过上面的了解我门基本上了解了tcp wrappe的基础理论支持,下面我们就来了解tcp wrappe规则的书写格式。
    tcp wrappe规则的书写格式:
    daemon_list:client_list [: options]
   【daemon_list:】需要tcp wrappe进行访问控制的服务的二进制命令的名字,可以有以下几种形式:
    1、单个的服务:如 vsftpd:
    2、多个服务:如 vsftpd,sshd,in,telnet:
    3、所有服务:用ALL:来代表
   【client_list】过滤的客户端列表,可以有以下几种形式:
    1、基于IP地址:如192.168.0.254
    2、基于网段:有两种表示方法
         network/mask: 此处网段的掩码不能使用CIDR格式,只能使用长掩码格式        
         省略式:对于172.16.0.0网段,可进行0省略,只写172.16. 即可
    3、基于主机HOSTNAME:也有两种表示方式
         完整域名:即主机的fqdn
         整个域的:如.a.org.表示针对a.org域内的所有主机
    4、ALL:针对所有的访问请求。
    5、EXCEPT : 除了什么,是可以嵌套多此使用的,如在/etc/hosts.deny中写入
       vsftpd:  ALL: EXCPT: 192.168.0. EXCPT: 192.168.0.1,表示拒绝针对vsftpd所有的请求中只允许192.168.0.0网段但不允许ip为192.168.0.1的主机。EXCEPT也能在/etc/hosts.allow文件中使用,这样的话,我们写一个规则就有多种方法了。
   【:options】ttcp wrapper规则所跟的选项,选项很多,但是我们几乎不怎么用到,这里只给大家介绍一个可能用到的选项
      spawn :发起执行启动,可以让用户在登录的时候启动一个另外的命令,例如我们可以在用户登录的 时候启动一个echo命令,给用户显示一条欢迎信息等。
    
    下面我们就做一个总体性的实验。
    【题目】:控制vsftpd的访问,允许172.16.0.0访问, 但拒绝172.16.100.100访问vsftpd,并在符合规则的用户登录后生成一个有关用户登录信息的日志/var/log/telnet.log记录信息。
     vim /etc/hosts.allow
     写入:vsftpd: 192.168.:EXCEPT 192.168.0.196: spawn /bin/echo Login attempt %c from %a access $A the daemon is %d >>/var/log/telnet.log
     大家可是实验一下我们的结果