介绍
TCP Wrapper 是一个为基于 tcp 协议开发并提供服务的应用程序提供的一层访问控制工具,也是一个为 Unix 服务器提供防火墙(firewall)服务的公共领域计算机程序。该程序是由 Wietse Venema 开发的。
TCP Wrapper 程序监视发送进来的包。若外部计算机试图连接,TCP Wrapper就会查看该机器是否具有连接的权限。如果有,那么访问允许。若没有,访问拒绝。该程序可以根据个人用户或网络的需求进行更改。
iptables 与 TCP Wrapper 的对比
这里说到 TCP Wrapper 是一个提供防火墙服务的程序,但它相对 iptables 来说还是有很大不同的:
- iptables 可以基于 TCP/IP 协议栈中的请求报文进行很精细的控制;
- TCP Wrapper 是基于库调用实现功能,仅能对基于 tcp 协议开发并调用了相关库提供服务的应用程序提供访问控制;
使用
前面有说到 TCP Wrapper 仅能对调用了相关库并提供服务的应用程序提供访问控制,那么我们怎么判断一个服务程序是否调用了 TCP Wrapper 的相关库呢?
这里的相关库指的是 libwrap.so.0
。
所以对于动态编译的程序来说,我们可以直接通过 ldd
命令查看它链接的库文件,如果库文件中包含 libwrap.so.0
,那么就说明这个程序是可以被 TCP Wrapper 控制的。
而对于静态编译的程序来说,我们需要使用 strings
命令查看其应用程序文件,如果其结果中出现了 hosts.allow
和 hosts.deny
文件,那么就说明这个程序是可以被 TCP Wrapper 进行访问控制的。
因静态编译的程序很少见不好演示,下面我们仅演示一下判断一个动态编译的程序是否可以被 TCP Wrapper 进行访问控制:
$ ldd $(which sshd) | grep libwrap
libwrap.so.0 => /lib64/libwrap.so.0 (0x00007f6ca4954000)
$ ldd $(which httpd) | grep libwrap
$ ldd $(which vsftpd) | grep libwrap
libwrap.so.0 => /lib64/libwrap.so.0 (0x00007fd235ccf000)
$ ldd $(which xinetd) | grep libwrap
libwrap.so.0 => /lib64/libwrap.so.0 (0x00007f7822fc3000)
看如上示例,根据前文所述我们可以判断 sshd、vsftpd、xinetd 服务是可以被 TCP Wrapper 进行访问控制的,而 httpd 不可以。
配置文件
TCP Wrapper 可以在配置文件在为各服务分别定义访问控制规则实现访问控制,有如下两个配置文件:
/etc/hosts.allow
:定义允许访问的服务;/etc/hosts.deny
:定义拒绝访问的服务;
这两个配置文件使用匹配顺序的哦,如下图:
即先匹配 /etc/hosts.allow
文件,如果匹配到就放行,如果没匹配到就继续匹配 /etc/hosts.deny
文件,如果匹配到就拒绝,如果没匹配到就放行,即如果两个文件的规则都没有匹配到,那么默认就是放行的。
配置文件可有多行,每行定义一条规则语法如下:
daemon_list: client_list [EXCEPT exclude_client_list]... [:option]
daemon_list:
可以是应用程序的文件名称,而非服务名哦,如 sshd;
可以是应用程序文件名称列表,彼此间使用逗号分隔,如 sshd, vsftpd;
ALL 表示所有服务;
client_list:
IP地址;
主机名;
网络地址:必须使用完整格式的掩码,不使用前缀格式掩码,所以类似于 10.0.1.0/24 不合法;
简短格式的网络地址:例如 172.16. 表示 172.16.0.0/255.255.0.0;
ALL:所有主机;
KNOWN: 所有可以解析主机名的主机;
UNKNOWN:所有无法解析主机名的主机;
PARANOID:所有正反解后的主机名不匹配的主机;
[EXCEPT exclude_client_list]:
除了,匹配 client_list 中除 exclude_client_list 以外的主机,可有多个;
[:options]
deny:拒绝,用于= hosts.allow 文件,实现 deny 主机的功能;
allow:允许,用于 hosts.deny 文件,实现 allow 的功能
spawn command:匹配到访问主机时执行额外命令或启动额外应用程序:
command 中允许使用宏,常用宏如下:
%c: 客户端 ip;
%s: 服务端 ip;
%d: 应用程序文件名称;
示例
例 1:vsftpd 服务不允许 10.0.1.200
访问。
$ cat /etc/hosts.allow
$ cat /etc/hosts.deny
vsftpd: 10.0.1.200
例 2:vsftpd 服务仅允许 10.0.1.0/24
网络中主机访问。
$ cat /etc/hosts.allow
vsftpd: 10.0.1.
$ cat /etc/hosts.deny
vsftpd: ALL
例 3:vsftpd 服务允许除了 10.0.1.2
的 10.0.1.0/24
网络中所有主机访问。
$ cat /etc/hosts.allow
vsftpd: 10.0.1. EXCEPT 10.0.1.2
$ cat /etc/hosts.deny
vsftpd: ALL
例 4:vsftpd 服务仅允许 10.0.1.200
访问。
$ cat /etc/hosts.allow
vsftpd: 10.0.1. EXCEPT 10.0.1.0/24 EXCEPT 10.0.1.200
$ cat /etc/hosts.deny
vsftpd: ALL
EXCEPT
后的EXCEPT
会逻辑取反,如上本是不允许10.0.1.0/24
网络的主机访问,但是后面的一个操作又是对前面范围“除了”的意思,所以10.0.1.200
就允许访问了。
例 5:vsftpd 服务仅允许 10.0.1.0/24
网络中主机访问。
$ cat /etc/hosts.allow
$ cat /etc/hosts.deny
vsftpd: ALL EXCEPT 10.0.1.
例 6:vsftpd 服务仅拒绝 10.0.1.200
访问:
$ cat /etc/hosts.allow
vsftpd: 10.0.1.200:deny
$ cat /etc/hosts.deny
例 7:vsftpd 服务仅允许 10.0.1.200
访问:
$ cat /etc/hosts.allow
$ cat /etc/hosts.deny
vsftpd: 10.0.1.200:allow
vsftpd: ALL
例 8:vsftpd 服务拒绝所有主机访问,将试图访问的信息记录到 /var/log/vsftpd.deny.log
。
$ cat /etc/hosts.allow
$ cat /etc/hosts.deny
vsftpd: ALL:spawn /bin/echo `date` login attempt from %c to %s, %d >> /var/log/vsftpd.deny.log
# 访问后查看
$ cat /var/log/vsftpd.deny.log
Mon Mar 2 22:49:46 CST 2020 login attempt from 10.0.1.1 to vsftpd@10.0.1.201, vsftpd
评论区