inux访问控制的流程:
----------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防火墙,它会更加的强大的