预计阅读本页时间:-
6.10 TCP_Wrappers应用级防火墙的介绍和应用
了解了iptables防火墙后,相信大家可能会对它强大的IP过滤功能感到惊叹。但是在日常工作中,有时仅仅过滤IP是满足不了我们的工作需求的,因此,这里再介绍一种基于应用级别的防火墙,那就是强大的TCP_Wrappers。
为什么我们总说Linux服务器安全呢?通过下面的流程可以看出,一个客户端想要访问Linux服务器的资源,其实也不是一件容易的事情,它需要突破层层封锁和权限控制。
广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元
Linux系统访问控制的流程如下:
客户端→iptables→TCP_Wrappers→服务本身的访问控制
具体说明如下:
·iptables:基于原IP、目的IP、原端口、目的端口来进行控制。
·TCP_Wrappers:对服务的本身进行控制。
·Service:对行为进行控制(它会结合文件和目录权限做更细致的控制)。
TCP_Wrappers是根据/etc/hosts.allow及/etc/hosts.deny这两个文件来判断用户是否能够访问服务器资源的。其实,/etc/hosts.allow与/etc/hosts.deny是/usr/sbin/tcpd的设定档,/usr/bin/tcpd则是用来分析进入系统的TCP封包的一个软件,它是由TCP Wrappers提供的。那为什么叫作TCP_Wrappers呢?其中Wrappers有包裹的意思,也就是说,这个软件本身的功能就是分析TCP网络封包资料的!前面提到网络的封包资料是以TCP封包为主的,这个TCP封包的档头至少记录了来源与目标主机的IP与端口号,因此,通过分析TCP封包,就可以判断是否让这个客户端访问服务器资源。
TCP_Wrappers的访问控制主要是通过以下两个文件来实现的:
/etc/hosts.allow
/etc/hosts.deny?
/etc/hosts.allow用来定义允许的访问,/etc/hosts.deny用来定义拒绝的访问。
注意
其实,在/etc/hosts.allow里是可以定义拒绝的访问的,/etc/hosts.deny也可以做相反的工作,但不推荐大家这样操作,为什么我们要将简单的问题复杂化呢?
现在来了解一下TCP_Wrappers的访问控制判断顺序,如果客户端IP通过了iptables防火墙后想访问我们的服务器资源,这时系统会查看此客户端请求IP是否存在于/etc/hosts.allow列表里,如果存在,则接受此IP请求;如果不存在,则继续比对/etc/hosts.deny列表,如果存在于hosts.deny列表里,则拒绝此IP请求;如果此IP在两个文件里都不存在,则接受此IP请求,其工作流程如图6-11所示。此流程图逻辑清晰,建议大家也以此流程图进行记忆。
图6-11 TCP_Wrappers工作流程图
TCP_Wrappers的语法格式如下:
::
其语法很简单,前面接服务名,中间是“:”,后面是IP或IP段,最后面的allow或deny可以省略。这里跟大家说一个小知识:在Linux系统里,点分十进制是除了iptables外,支持所有服务的语法,比如我们可以/etc/hosts.allow里写上如下内容:
sshd:192.168.1.0/255.255.255.0
表示此服务器接受来自192.168.1.0到255.255.255.0网段所有机器的SSH请求。下面请大家思考一个比较复杂的问题,如果一个IP既存在于/etc/hosts.allow里,又存在于/etc/hosts.deny里(例如192.168.1.102这个IP既存在于服务器192.168.1.104的/etc/hosts.allow里,也存在于/etc/hosts.deny里),那么这个IP会被服务器接受吗?其实用上面的流程图一判断,就可以得出结论,192.168.1.104是允许192.168.1.102的机器SSH登录的。
那么,我们该如何利用TCP_Wrappers呢(测试机器为CentOS 5.8 x86_64,CentOS 6.4 x86_64下面的portmap更改为rpcbind,这一点请大家注意区别)?
一些比较复杂的服务(例如NFS服务)在与客户端通信时会打开几个端口,如果不在配置文件里做修改,那么它通信的端口会与vsftpd服务的被动模式一样,也就是说端口都是随机的,这样我们用iptables来做安全策略时会非常麻烦,不过,如果通过TCP_Wrappers来设置相应的限制策略就会非常容易,例如通过配置/etc/hosts.deny文件来限制192.168.1.102的机器来访问本机的NFS资源,可以按如下方式编辑/etc/hosts.deny文件:
vim /etc/hosts.deny
portmap:192.168.1.102
如果要使用iptables防火墙的IP加端口的防护方法,至少先要通过抓包弄清楚NFS的端口问题才能够写出iptables的规则,但如果是利用TCP_Wrappers则可以很轻松地做好这个工作,可以说TCP_Wrappers是iptables最好的补充手段之一,所以很多朋友也称其为应用级防火墙。在做好服务器的防护工作时,我们还可以利用iptables+TCP_Wrappers的方法对服务器资源进行保护,这样其安全性也可以得到进一步增强。
到目前为止,我们已经知道了如何使用iptables+TCP_Wrappers建造及维护一个Linux系统IP级及应用级的防火墙,它在防范外部攻击时能取得非常好的效果,但是它们防范不了来自防火墙内部的攻击。这个时候可以利用SELinux来强化内核,使我们的计算机更加安全。