tcp_wrappers是一个由Wieste Venema开发,旨在为Unix/Linux服务器提供防火墙服务的免费软件,它能够让系统管理员记录和控制 wrappers 支持的基于 TCP 的服务或守护进程的访问。
tcp_wrappers是用来辅助而非替代netfilter的,因tpc_wrappers工作在应用层,而netfilter工作在网络层
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 [email protected], vsftpd