tcp_wrappers是一个由Wieste Venema开发,旨在为Unix/Linux服务器提供防火墙服务的免费软件,它能够让系统管理员记录和控制 wrappers 支持的基于 TCP 的服务或守护进程的访问。

  tcp_wrappers是用来辅助而非替代netfilter的,因tcp_wrappers工作在应用层,而netfilter工作在网络层

使用tcp_wrappers控制基于tcp的服务的访问_访问


1、判断某服务是否能够由tcp_wrappers控制

   ⑴动态编译的程序:使用ldd命令查看其所依赖库中是否有libwrap

   ⑵静态编译的程序:strings /path/to/program

      其显示结果中若有如下内容,则能够由tcp_wrappers控制:

        hosts.allow

        hosts.deny

[root@node2 ~]# rpm -q tcp_wrappers   #默认已安装
tcp_wrappers-7.6-57.el6.x86_64
[root@node2 ~]# rpm -ql tcp_wrappers
/usr/sbin/safe_finger
/usr/sbin/tcpd
/usr/sbin/try-from
/usr/share/doc/tcp_wrappers-7.6
...
[root@node2 ~]# ldd `which xinetd` | grep 'libwrap'
	libwrap.so.0 => /lib64/libwrap.so.0 (0x00007fc77be0e000)
#wrappers支持xinetd进程,因此所有由xinetd管理的瞬时守护进程都能够受tcp_wrappers控制


2、tcp_wrappers通过读取配置文件中的规则来判定某服务是否可被访问:

   /etc/hosts.allow/etc/hosts.deny

   文件中的规则是即时生效的;

   ⑴配置文件的语法:

      daemon_list: client_list [:options]  # man hosts_access

        ①daemon_list:应用程序程序名称列表,使用逗号分隔,例如 sshd, in.telnetd;可使用ALL,表示所有受控进程

        ②client_list可以是:

           ip,主机名

           域名,如.inception.com

           网络地址:可以是完整格式掩码或简短格式,如172.16.0.0/255.255.0.0或172.16. 但不能使用长度掩码,如172.16.0.0/16

           ALL:所有客户端地址

           KNOWN:能被解析的主机名

           UNKNOWN:无法解析的主机名

           PARANOID:主机名和IP地址的各自的正反解析结果不匹配

           EXCEPT:该参数还可嵌套使用

              例如 sshd: ALL EXCEPT 172.16. EXCEPT 172.16.100.71

        ③[:options]可以是:

           deny:通常用在hosts.allow文件中实现拒绝的规则;

           allow:通常用在hosts.deny文件中实现允许的规则;

           spawn:启动一个额外命令

              例如 in.telnetd: ALL : spawn /bin/echo Warning\:`date` login attempt from %c to %s, %d >> /var/log/telnet.log(若要用echo输出冒号,需要转义,因冒号在此有特殊意义)

              在记录日志中常用的shell变量有:

                %a:客户端 IP 地址

                %h:客户端主机名

                %c:Client information: user@host, user@address, a host name, or just an address

                %s:Server information: daemon@host, daemon@address, or just a daemon name

                %d:守护进程名称

   ⑵服务检查逻辑

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

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

                                          -->(N) --> ALLOW

3、示例

  控制vsftpd仅允许192.168.30.0网络中的主机访问,但192.168.30.13除外;对所有被拒绝的访问尝试都记录在/var/log/tcp_wrappers.log日志文件中;

[root@node3 ~]# ftp 192.168.30.20    #制定规则前node3可正常访问node2上的vsftpd服务
Connected to 192.168.30.20 (192.168.30.20).
220 (vsFTPd 2.2.2)
Name (192.168.30.20:root): ftp
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (192,168,30,20,137,142).
150 Here comes the directory listing.
drwxr-xr-x    2 0        0            4096 Jul 24  2015 pub
drwxrwxr-x    2 0        0            4096 Nov 22 16:21 upload
[root@node2 ~]# vim /etc/hosts.allow
...
vsftpd: 192.168.30. EXCEPT 192.168.30.13
[root@node2 ~]# vim /etc/hosts.deny
...
vsftpd: ALL : spawn /bin/echo Warning\:`date` login attempt from %c to %s, %d >> /var/log/tcp_wrappers.log
[root@node3 ~]# ftp 192.168.30.20
Connected to 192.168.30.20 (192.168.30.20).
421 Service not available.   #提示无法访问
[root@node1 ~]# ftp 192.168.30.20   #其它主机可正常访问
Connected to 192.168.30.20 (192.168.30.20).
220 (vsFTPd 2.2.2)
Name (192.168.30.20:root): ftp
331 Please specify the password.
Password:
230 Login successful.
[root@node2 ~]# tail /var/log/tcp_wrappers.log 
Warning:Thu Feb 18 15:26:05 CST 2016 login attempt from 192.168.30.13 to vsftpd@192.168.30.20, vsftpd