16.1 tcp_wrappers简介

  tcp wrappers:Transmission Control Protocol Wrappers为由inetd生成的服务提供了增强的安全性。TCP Wrappers是一种对使用/etc/inetd.sec的替换方法。

  TCP Wrappers提供防止主机名和主机地址欺骗的保护。欺骗是一种伪装成有效用户或主机以获得对系统进行未经授权的访问的方法。


  tcp_wrapper是一种对基于TCP协议开发并提供服务的应用程序提供的一层访问控制工具。

  tcp_wrapper一般翻译为tcp包装器,能够实现监听在某一tcp服务上,对于进出某本主机区访问某一套接字的应用做检查且能够实现授权访问。


16.2 tcp_wrappers工作模式

  TCP Wrappers使用访问控制列表(ACL)来防止欺骗。ACL是/etc/hosts.allow和/etc/hosts.deny文件中的系统列表。

  在配置为验证主机名到IP地址映射,以及拒绝使用IP源路由的软件包时,TCP Wrappers提供某些防止IP欺骗的保护。


16.3 tcp_wrappers工作原理

  在服务器向外提供的tcp服务上包装一层安全检测机制。外来连接请求首先通过这个安全检测,获得安全认证后才可被系统服务接受。


  TCP Wrapper作为客户服务器模型的一部分,依赖/etc/hosts.allow和/etc/hosts.deny文件作为简单访问控制语言的基础,可用于任何包含了libwrap.so的daemon程序使用。访问控制语言限定的规则是:基于客户端地址和客户端试图访问的daemon程序,选择性地允许客户端访问服务器在本地系统上的daemon程序。


  简单来说,tcp_wrapper本身是一个守护进程,工作于tcp协议上。iptables工作于内核的tcp/ip协议栈上,而tcp_wrapper工作于内核的tcp/ip协议栈的tcp协议上,且是在tcp的入口处启动一个进程,监视每一个tcp服务的相关请求,同时把这个报文本身跟tcp_wrapper的配置文件中的放行规则或拒绝规则中的规则进行对比。匹配后进行相应的操作(放行或拒绝访问)。


  tcp_wrapper工作在tcp包文所要经过的位置上,有且只有一个位置。工作于tcp协议层,比工作在网络层的iptables更高一层,因此可以和iptables结合使用。但tcp_wrapper的控制完成之后,iptables就无需控制了,同理,iptables控制完成之后,tcp_wrapper也无需控制了。

  那么既然iptables也可以进行控制,为什么还要用tcp_wrapper呢?其一是因为tcp_wrapper配置非常简单,tcp_wrapper是一个用户空间的工具;其二是因为tcp_wrapper只能对基于TCP协议开发并调用了libwrap库的应用程序进行访问控制,而iptables则无此限制。


  tcp_wrapper基于库调用实现其功能:调用libwrap库

  只有基于TCP协议开发并调用了libwrap库的应用程序才能使用tcp_wrapper对其进行访问控制。

  判断服务是否能够由tcp_wrapper进行访问控制的方法有以下两个方向:

  a) 动态编译的程序:使用ldd命令,其如果调用了libwrap库则表示支持tcp_wrapper控制

  b) 静态编译的程序:使用string命令(string /path/to/program)查看应用程序文件,其结果如果出现以下内容则表示支持tcp_wrapper控制

    hosts.allow

    hosts.deny


16.4 tcp_wrapper配置

16.4.1 tcp_wrapper配置文件

  tcp_wrapper的配置文件有两个:/etc/hosts.allow和/etc/hosts.deny


16.4.2 tcp_wrapper配置

  在配置文件中为各服务分别定义访问控制规则实现访问控制,文件中的规则是即时生效的。


  配置文件语法:

daemon_list: client_list[:options]

  常用的daemon_list格式:

    应用程序的文件名称,而非服务名

    应用程序的文件名称列表,彼此间使用逗号分隔,例如:sshd,vsftpd

    ALL:表示所有服务

  常用的client_list格式:

    IP地址

    主机名

    网络地址:必须使用完整格式的掩码(如255.255.255.0),不能使用前缀格式掩码(如/24)

    简短格式的网络地址:如172.16. 表示172.16.0.0/255.255.0.0

    ALL:所有主机

    KNOWN:所有可以解析主机名的主机

    UNKNOW:所有无法解析主机名的主机

    PARANOID:主机名的正反解结果不匹配

  EXCEPT:除了。如在hosts.allow文件中如下定义:

vsftpd: 172.16. EXCEPT 172.16.100.1     #表示允许172.16网段的主机(除了172.16.100.1)访问vsftpd
vsftpd: 172.16. EXCEPT 172.16.100.0/255.255.255.0 EXCEPT 172.16.100.1     #表示允许172.16网段的主机(除了172.16.100.0子网)和172.16.100.1这台主机访问vsftpd

  常用的[options]:

    deny:拒绝,主要用于hosts.allow文件中,实现deny功能

    allow:允许,主要用于hosts.deny文件中,实现allow功能

    spawn:启动额外应用程序,常用于实现记录日志。如在hosts.deny文件中如下定义:

vsftpd: ALL :spawn /bin/echo `date` login attempt from %c to %s, %d >> /var/log/vsftpd.deny.log     #表示拒绝所有人访问vsftpd,若有人来访问记录至/var/log/vsftpd.deny.log文件中

      %c:client ip

      %s:server ip

      %d:daemon name


  tcp_wrapper规则检查逻辑:

    client --> /etc/hosts.allow --> (Y) --> ALLOW

    client --> /etc/hosts.allow --> (N) --> /etc/hosts.deny --> (Y) --> DENY

    client --> /etc/hosts.allow --> (N) --> /etc/hosts.deny --> (N) --> ALLOW


  下图是tcp_wrapper的工作流程:

wKioL1lUchnhc4K2AABzVk_0Kvw324.png