tcpwrapper:工作在第四层(传输层),能够对有状态连接的服务进行安全检测并实现访问控制的工具。部分功能上跟iptables重叠。

     对于进出本主机访问某特定服务的连接基于规则进行检查的一个访问控制工具,这个访问控制工具以库文件形式实现;某进程是否接受libwrap的控制取决于发起此进程的程序在编译时是否针对libwrap进行编译的。

        tcpwrapper的作用是对基于tcp的程序进行安全控制。它通过使用/usr/sbin/tcpd这样一个进程来代为监听任何一个使用了tcpwrapper的发起连接的tcp请求。假设sshd接受tcpwrapper的验证,当有一个连接发起ssh连接时先有tcpwrapper进行身份验证,如果通过了验证,则将连接转向sshd,否则直接拒绝连接。

        tcpwrapper只能为tcp的连接进行验证。它实际是通过库文件libwrap.so来实现控制的,并不是所有的tcp连接都接受其控制。其次,主要针对基于tcp并且在编译(两种编译方式:静态和动态)时链接到libwrap库上的程序才能生效。

所以tcpwrapper的功能并没有iptables强大。

一、如何判断一个程序是否可以tcpwrapper控制:

判断一个二进制程序是否接受tcpwrapper的控制,只需检查二进制程序在编译的时候是否依赖libwrap.so库

[root@station39 ~]# ldd `which sshd` | grep libwrap

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

某些二进制文件在编译时直接以静态的方式将对libwrap库的依赖性编译到文件中去,此时需要使用string来检查

[root@station39 ~]# strings `which sshd` | grep hosts

[root@station39 ~]# strings `which portmap` | grep hosts     //**提供RPC服务的进程

hosts_access_verbose

hosts_allow_table

hosts_deny_table

/etc/hosts.allow

/etc/hosts.deny

链接到libwrap.so的独立进程有:sendmail,slapd,sshd,stunnel,xinetd,gdm,gnome-session,vsftpd,

portmap等等。

二、配置文件介绍

   1.TCP Wrappers配置文件

   要决定一个客户是否被允许连接一项服务,TCP Wrappers会参考以下两个文件,这两个文件通常被称为主机访问文件:
                /etc/hosts.allow
                /etc/hosts.deny
   当一个TCP Wrappers接收到一个客户请求时,它会运行以下几个步骤:
       A.检查/etc/hosts.allow.TCP会绕服务会循序地解释/etc/hosts.allow文件并应用第一个为这个服务所指定的规则.如果找到了一个匹配的规则,则允许连接.如果找不到匹配的规则,就会进行下一个步骤.
       B.检查/etc/hosts.deny.TCP会绕的服务会循序地来解释/etc/hosts.deny文件.如果找到一个匹配的规则,则拒绝这个连接.如果找不到匹配的规则,则允许连接到这个服务.
     在使用TCP Wrappers保护网络服务时应该考虑以下几个要点:
       A.因为hosts.allow中的规则会首先被应用,所以比hosts.deny中指定的规则有优先权.因此,如果访问一项服务在hosts.allow中设置为允许,那么在hosts.deny中同一项服务的拒绝访问设置则被忽略.
       B.每个文件中的各项规则是由上到下被读取的,第一个匹配的规则是唯一被应用的规则.因此,规则的排列顺序极其重要.
       C.如果在这两个文件中都没有找到匹配的规则,或这两个文件都不存在,那么就授予访问这项服务的权限.
       D.TCP会绕的服务并不缓存主机访问文件中的规则,因此对hosts.allow或hosts.deny的配置改变都无需重新启动网络服务便会马上起作用.    2.格式化访问规则
   /etc/hosts.allow和/etc/hosts.deny文件的格式是完全相同的.每个规则都必须位于其正确的行位.空行或以井字号(#)开始的行会被忽略.
   每条规则都使用以下基本格式来对网络服务的访问进行控制:
         : [:

 

三、举例说明:

allow  : 允许访问
deny   : 拒绝访问
spwan  : 拒绝访问 并且在自己这边执行后面自定义的命令或脚本
twist  : 拒绝访问 并且在访问者那边执行后面自定义的命令或脚本
serverity : 将来访者的信息记录到日志中,然后继续和后面的规则做比对
banners : 显示指定文件中的信息给client端
例如:
vsftpd : 192.168.0. : swpan /bin/echo $(date) %c %d >> /var/log/tcpwrap.log
vsftpd : 192.168.1. : twist /bin/echo “421 Connection prohibited.”
vsftpd : 192.168.2. : banners /var/banners
第一条规则,是拒绝192.168.0的网段访问,并且将日期和来访者的信息记录到tcpwrap.log中
第二条规则,是拒绝192.168.1的网段访问,并且在来访者客户端的那边显示提示信息”421 Connection prohibited.”
第三条规则,当192.168.2的网段访问,在客户端那边显示提示信息,信息内容由 /var/banners文件来指定。

   (1). ALLOW/DENY: 可以在/etc/hosts.deny或/etc/hosts.allow 中被当做一个选项来使用。

例:编辑/etc/hosts.allow

in.telnetd: 192.168.1.

in.telnetd: ALL: DENY

   (2). spawn:在匹配到规则时重新发起一个额外的命令来执行其他的动作,可使用特殊展开。

在子进程中执行,并不影响当前进程。

in.telnetd: ALL : spawn echo "login  attempt  from  %c  to  %s"  | mail -s waring  root

   (3). twist:启动一个额外的命令来取代当前规则中定义的服务。

sshd: 192.168.0. twist /bin/echo "421 Connection prohibited."

     通过一个例子来说明二者区别:

     编辑/etc/hosts.allow

          in.telnetd: 192.168.0.: spawn /bin/echo `date`  %c accessd %d >> /var/log/tcpwrap.log

     可以正常访问,我们来查看下日志:

     [root@station39 xinetd.d]# cat /var/log/tcpwrap.log

           Wed Mar 23 12:26:29 CST 2011 192.168.0.1 accessd in.telnetd

     我们使用twist来试一下:/etc/hosts.allow

           in.telnetd: 192.168.0.: twist /bin/echo "421 connetcion deny!"

     使用物理机访问,被拒绝:

   (4). severity [facility.] priority

       定义访问某个服务时的日志级别,默认authpriv.info级别

                  in.telnetd:ALL: serverity local7.info

   (5). banners

       访问某个服务时返回的信息

                  in.telnetd: ALL: banners  /some/directory

       编辑/etc/hosts.allow

                  in.telnetd: ALL: banners /var/tcpwrap

       举例:

                  [root@station39 xinetd.d]# mkdir  /var/tcpwrap

                  [root@station39 xinetd.d]# vim /var/tcpwrap/in.telnetd

       "Welcome to 192.168.0.39"

       使用物理机访问一下: