当前位置: > RedHat >

RHCE学习笔记-RHEL5.4配置tcp_wrappers

时间:2014-09-18 01:46来源:linux.it.net.cn 作者:it

本文介绍 inux下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
root@192.168.0.254'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
root@192.168.0.254'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
root@192.168.0.254'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下Tcp_wrappers防火墙的简单应用,就介绍这些,希望对大家有所帮助。

 
(责任编辑:IT)
------分隔线----------------------------
栏目列表
推荐内容