tcp_wrappers

Linux访问控制的流程:


----------iptables----------tcp_wrappers----------服务本身的访问控制。


Iptables:          基于原IP,目的IP,原端口,目的端口来进行控制的。


Tcp_wrappers:对服务的本身来进行控制。


Service:           对行为做控制,更细致的控制。


 


今天我们来讨论第二层防火墙tcp_wrappers。


Tcp_wrappwes的访问控制主要是两个文件,


/etc/hosts.allow  


/etc/hosts.deny 


在/etc/hosts.allow是用来定义允许的访问,


在/etc/hosts.deny是用来定义拒绝的访问。


 


现在我们来了解一下tcp_wrappers的访问控制判断顺序,


首先查看/etc/hosts.allow,如果匹配到一个条目,将不在读取下面的。


如果在/etc/hosts.allow没有匹配到条目,则读取/etc/hosts.deny,如果匹配,则拒绝,如果不匹配,则默认允许所有。


举例说明:

allow     192.168.1.0/24


Deny     192.168.1.1


如果是这样的呢,192.168.1.1可以访问吗?


是可以的,在allow里面定义了允许192.168.1.0/24,这个网段里面就包含了192.168.1.1。它已经明确了指定了允许192.168.1.0/24的网络,那么192.168.1.1匹配到这个条目,就不在往下面读。


 


关于tcp_wrappers的语法


Daemon_list : client_list


还可以这样写,指定在那台主机上面的服务,


daemon@host :client_list


 


关于客户机的说明


IP地址   192.168.0.1


域名      .example.com


网段      192.168.0.0/255.255.255.0  192.168.0.


这里的表示方法不可以用/24。


 


现在我们来做个试验,


默认情况下,我们的tcp_wrappers防火墙的默认允许所有的,是因为在/etc/hosts.allow和/etc/hosts.deny这两个文件里面默认是任何策略也没有的。


现在我们在192.168.0.10这台主机上面去ssh到192.168.0.254。


[root@localhost ~]#


[root@localhost ~]# ssh 192.168.0.254


[email protected]'s password:


Last login: Thu Mar 11 21:56:54 2010 from 192.168.0.254


[root@localhost ~]#


OK,可以看到,我们没有做任何的策略,192.168.0.10的确是可以ssh到192.168.0.254这台主机上面去的。


下面我们开始做策略,在192.168.0.254这台主机上面拒绝192.168.0.10来ssh。


编辑/etc/hosts.deny文件,


Vim  /etc/hosts.deny


#


# hosts.deny    This file describes the names of the hosts which are


#               *not* allowed to use the local INET services, as decided


#               by the '/usr/sbin/tcpd' server.


#


# The portmap line is redundant, but it is left to remind you that


# the new secure portmap uses hosts.deny and hosts.allow.  In particular


# you should know that NFS uses portmap!


sshd: 192.168.0.10


~


/etc/hosts.deny文件就定义完成了,现在来测试下,


[root@localhost ~]#


[root@localhost ~]# ssh 192.168.0.254


ssh_exchange_identification: Connection closed by remote host


[root@localhost ~]#


可以看到,现在连接就被直接拒绝了。


当然,后面匹配的客户端的写法可以是192.168.0.0/255.255.255.0,也可以是192.168.0.这个也可以。用域的方式来表示也没有问题可以写成.example.com。但是不可以用192.168.0.0/24来表示一个网段。


 


关于主机的宏定义表示方式


宏定义表示某一种类型的主机


LOCAL             主机中不含.的主机(通常是指自己)


KNOWN           所有在DNS中可以解析到的主机


UNKNOWN     所有在DNS不可以解析到的主机


PARANOID      所有在DNS中正向解析与反向解析不匹配的主机


ALL                  代表匹配所有(这个主机和服务都可以定义)


还有一个非常有用的定义方式:


EXCEPT


这个就代表反向选择,


现在做一个试验来理解这个参数的意义,


先在192.168.0.254这台主机上面定义./etc/hosts.deny这个文件,


#


# hosts.deny    This file describes the names of the hosts which are


#               *not* allowed to use the local INET services, as decided


#               by the '/usr/sbin/tcpd' server.


#


# The portmap line is redundant, but it is left to remind you that


# the new secure portmap uses hosts.deny and hosts.allow.  In particular


# you should know that NFS uses portmap!


sshd: 192.168.0.0/255.255.255.0 EXCEPT 192.168.0.10


/etc/hosts.deny文件定义完成了,来测试下。


~


现在我们在192.168.0.10上面去ssh到192.168.0.254上,看下能否成功。


[root@localhost ~]#


[root@localhost ~]# ssh 192.168.0.254


[email protected]'s password:


Last login: Thu Mar 11 22:25:04 2010 from 192.168.0.10


[root@localhost ~]#


OK,192.168.0.10是可以ssh到192.168.0.254上面去的。


现在我们在来利用192.168.0.20来ssh到192.168.0.254,看下能否成功。


[root@localhost ~]#


[root@localhost ~]# ssh 192.168.0.254


ssh_exchange_identification: Connection closed by remote host


[root@localhost ~]#


可以看到,现在连接就被拒绝了。


为什么192.168.0.10可以ssh到192.168.0.254上面,而192.168.0.20不可以ssh到192.168.0.254上面去呢,这个就是刚才EXCEPT的作用。我们在/etc/hosts.deny文件里面定义了拒绝192.168.0.0/255.255.255.0这个网络中的所有主机,但是,除了192.168.0.10以外。就是这个原因。


我们刚才是将EXCEPT写在了/etc/hosts.deny文件中,如果写在/etc/hosts.allow里面呢,那么就和写在deny里面就又不一样了。


现在将hosts.deny给清空掉,然后编辑hosts.allow文件。


#


# hosts.allow   This file describes the names of the hosts which are


#               allowed to use the local INET services, as decided


#               by the '/usr/sbin/tcpd' server.


#


sshd: 192.168.0.0/255.255.255.0 EXCEPT 192.168.0.10


~


/etc/hosts.allow文件就编辑完成了,这个时候,192.168.0.10可以ssh到192.168.0.254吗,测试下。


[root@localhost ~]#


[root@localhost ~]# ssh 192.168.0.254


[email protected]'s password:


Last login: Thu Mar 11 22:31:42 2010 from 192.168.0.20


[root@localhost ~]#


可以看到,是允许的,这个又是为什么呢,当192.168.0.10想要去ssh到192.168.0.254这台主机的时候,先读取/etc/hosts.allow文件,在hosts.allow文件中定义了允许192.168.0.0/255.255.255.0这个网络,除了192.168.0.10这台主机,但是并没有明确给192.168.0.10这台主机一个允许或拒绝的定义,是先读取hosts.allow文件,而这个文件只是将192.168.0.10这台主机排除在外,最终还是要看hosts.deny文件中的定义是怎么样的。


 


查询那些服务是支持tcp_wrappers


可以先查询这个服务的脚本在哪里,用which命令,


[root@localhost ~]#


[root@localhost ~]# which sshd


/usr/sbin/sshd


[root@localhost ~]#


在使用ldd命令来查询


查询这个脚本在允许的时候调用了那些动态链接库文件,


[root@localhost ~]#


[root@localhost ~]# ldd /usr/sbin/sshd |grep libwrap


        libwrap.so.0 => /lib/libwrap.so.0 (0x00b92000)


[root@localhost ~]#


如果服务调用了libwrap.so这个动态链接库文件就代表这个服务支持tcp_wrappers。


当然也可以这样来直接查询,


[root@localhost ~]#


[root@localhost ~]# ldd `which vsftpd` |grep libwrap


        libwrap.so.0 => /lib/libwrap.so.0 (0x00825000)


[root@localhost ~]#


可以看到,vsftpd也是可以支持tcp_wrappers的。


还有一种方式也可以来查询那些服务可以支持tcp_wrappers。


[root@localhost ~]#


[root@localhost ~]# strings `which portmap` |grep hosts


hosts_access_verbose


hosts_allow_table


hosts_deny_table


/etc/hosts.allow


/etc/hosts.deny


[root@localhost ~]#


只要查询出来有/etc/hosts.allow和/etc/hosts.deny这两个文件就代表这个服务支持tcp_wrappers。


那么我们的xinetd服务是否支持tcp_wrappers呢?


[root@localhost ~]#


[root@localhost ~]# ldd `which xinetd` |grep libwrap


        libwrap.so.0 => /lib/libwrap.so.0 (0x0035a000)


[root@localhost ~]#


可以看到,xinetd服务是支持tcp_wrappers的,也就是说由xinetd管理的所有服务都是支持tcp_wrapers的。


使用ldd和strings工具来查询,只要满足其中一种方式就可以支持tcp_wrappers。


当然,也有很多服务是不支持tcp_wrappers的,


比如说named,httpd等等。


这也是为什么还要有iptables防火墙,它会更加的强大的


你可能感兴趣的:(linux,防火墙)