1、什么是防火墙
网络安全除了随时注意相关软件的漏洞以及网络上的安全通报之外,最好能够根据自己的环境来制定防火墙机制。这样对于网络环境,会比较有保障一点。那么什么是防火墙呢?其实防火墙就是通过制定一些有顺序的规则,并管制进入到我们网域内的主机(或者可以说是网域)数据封包的一种机制!更广义的来说,只要能够分析与过滤进出我们管理之网域的封包数据,就可以称为防火墙。
防火墙又可以分为硬件防火墙与本机的软件防火墙。硬件防火墙是由厂商设计好的主机硬件,这部硬件防火墙内的操作系统主要以提供封包数据的过滤机制为主,并将其他不必要的功能拿掉。因为单纯作为防火墙功能而已,因此封包过滤的效率较佳。至于软件防火墙呢?就是我们接下来要学习的。软件防火墙本身就是在保护系统网络安全的一套软件(或称为机制),例如Netfilter与TCP Wrappers都可以称为软件防火墙。
2、为什么需要防火墙
在介绍为什么需要防火墙之前,大家先来认识一下网络封包进入主机的流程,如下图1所示:
图1 网络封包进入主机的流程
从上图1可以看出,当封包进入本机时,会先通过防火墙、服务器软件程序、SELinux与文件系统等。所以基本上,如果你的系统:(1)已经关闭不需要而且危险的服务;(2)已经将整个系统的所有软件都保持在最新的状态;(3)权限设定妥当且定时进行备份工作;(4)已经教育用户具有良好的网络、系统操作习惯。那么你的系统实际上已经颇为安全了!要不要架设防火墙?那就见仁见智了哈!
但是,网络世界是很复杂的,而 Linux主机也不是一个简单的东西,说不定哪一天你在进行某个软件的测试时,主机突然间就启动了一个网络服务,如果你没有管制该服务的使用范围,那么该服务就等于对所有Internet开放,一旦被黑客抓住这个漏洞从而进行攻击你的主机,那就全完蛋了!由此可见,即使你觉得你的主机很安全,配置防火墙还是很有必要的,因为它能给我们规避
3、防火墙的功能
防火墙能干什么呢?防火墙最大的功能就是帮助你“限制某些服务的存取来源”。 举例来说:(1)你可以限制文件传输服务(FTP)只在局域网的主机才能够使用,而不对整个Internet开放;(2)你可以限制整部Linux主机仅可以接受客户端的WWW要求,其他的服务都关闭;(3)你还可以限制整部主机仅能主动对外联机。反过来说,若有客户端对我们主机发送主动联机的封包状态(TCP封包的SYN flag)就予以抵挡等等。这些就是防火墙主要的功能了。
所以,防火墙最主要的功能是规划出:
4、认识iptables
iptables其实就是Linux下的一个开源的信息过滤程序,包括地址转换和信息重定向等功能的,信息过滤功能十分强大,而所谓的硬件防火墙也就是一个Linux核心加页面操作程序做出来的,可以用于添加、编辑和移除规则。
不同Linux内核版本所使用的防火墙软件是不一样的,一下是Linux防火墙的演变过程:
因为不同的Linux内核版本使用的防火墙机制不同,且支持的软件指令与语法也不相同,所以在Linux上面设定属于你自己的防火墙规则时,要注意啊,先用 uname -r 查询一下你的核心版本再说!不过如果你是安装2004年以后推出的distributions,那就不需要担心了,因为这些distributions几乎都使用kernel 2.6版的内核。现在都是2016年了,估计大家使用的都是2.6版本的内核了,只是提及一下。
5、封包进入流程:规则顺序的重要性
前面一直谈到:“防火墙规则”,到底什么是规则?因为 iptables是利用封包过滤的机制,所以他会分析封包的首部信息。根据首部信息与定义的“规则”来决定该封包是否可以进入主机或者是被丢弃。意思就是说:根据封包的首部信息“比对”你预先设定的规则内容,若封包数据与规则内容相同则进行动作,否则就继续下一条规则的比对。重点在那个“比对与分析顺序”上。
举个简单的例子,假设我预先设定10条防火墙规则好了,那么当Internet来了一个封包想要进入我的主机,那么防火墙是如何分析这个封包的呢?我们以下图2说明好了:
图2 封包过滤的规则动作及分析流程
由上图2不难发现,当一个网络封包要进入到主机之前,会先经由NetFilter进行检查,那就是iptables的规则了。检查通过则接受(ACCEPT)进入本机取得资源,如果检查不通过,则可能予以丢弃(DROP)。上图中主要的目的是说明:“规则是有顺序的”。例如当网络封包进入Rule 1的比对时, 如果比对结果符合Rule 1,此时这个网络封包就会进行Action 1的动作,而不会理会后续的Rule 2,Rule 3.... 等规则的分析了。
而如果这个封包并不符合 Rule 1 的比对,那就会进入 Rule 2的比对了!如此一个一个规则去进行比对。那如果所有的规则都不符合怎办?此时就会通过预设动作(封包政策, Policy) 来决定这个封包的去向。所以啦,当你的规则顺序排列错误时,就会产生很严重的后果。为什么这么说呢?下面再举个简单的例子:
假设你的 Linux 主机提供了WWW 的服务,那么自然就要针对port 80 来启用通过的封包规则,但是你发现 IP来源为192.168.100.100老是恶意的尝试入侵你的系统,所以你想要将该 IP拒绝往来,最后,所有的非WWW的封包都给他丢弃,就这三个规则来说,你要如何设定防火墙检验顺序呢?
Rule 1 先抵挡 192.168.100.100;
Rule 2 再让要求 WWW服务的封包通过;
Rule 3 将所有的封包丢弃。
这样的排列顺序就能符合你的需求,不过,万一你的顺序排错了,变成:
Rule 1 先让要求 WWW服务的封包通过;
Rule 2 再抵挡 192.168.100.100 ;
Rule 3 将所有的封包丢弃。
此时,那个 192.168.100.100就可以使用你的WWW服务。只要他对你的主机送出WWW要求封包,就可以使用你的WWW功能了,因为你的规则顺序定义第一条就会让他通过,而不去考虑第二条规则!这样可以理解规则顺序的意义了吗?现在再来想一想,如果Rule 1变成了“将所有的封包丢弃”,Rule 2才设定“WWW服务封包通过”,请问,我的client可以使用我的WWW服务吗?答案是:NO。
6、iptables的表格 (table)与链 (chain)
事实上,上图2中所列出的规则仅是iptables众多表格当中的一个链(chain)而已。 什么是链呢?这得由iptables 的名称说起。为什么称为ip"tables"呢?因为这个防火墙软件里面有多个表格(table),每个表格都定义出自己的默认政策与规则,且每个表格的用途都不相同。通过下图3稍微了解下:
图3 iptables 的表格与相关链示意图
上图2的规则内容仅只是图3内的某个chain而已。而预设的情况下,咱们Linux的iptables至少就有三个表格,包括管理本机进出的filter、管理后端主机(防火墙内部的其他计算机)的nat、管理特殊旗标使用的mangle (较少使用)。我们甚至还可以自定义额外的链。每个表格与其中链的用途分别是这样的:
filter (过滤器):主要跟进入Linux本机的封包有关,这个是预设的table喔!
nat (地址转换):是Network Address Translation的缩写, 这个表格主要在进行来源与目的之 IP或port的转换,与Linux本机较无关,主要与Linux主机后的局域网络内计算机较有相关。
mangle (破坏者):这个表格主要是与特殊的封包的路由旗标有关,早期仅有PREROUTING及OUTPUT链,不过从kernel 2.4.18之后加入了 INPUT及 FORWARD链。 由于这个表格与特殊旗标相关性较高,所以像咱们这种单纯的环境当中,较少使用mangle 这个表格。
所以说,如果你的 Linux 是作为 www 服务,那么要开放客户端对你的 www要求有响应,就得要处理filter的INPUT链; 而如果你的Linux是作为局域网络的路由器,那么就得要分析nat的各个链以及filter的FORWARD链才行。也就是说,其实各个表格的链结之间是有关系的!简单的关系可以由下图4说明:
图4 iptables 内建各表格与链的相关性
上图4看起来有点复杂,不过基本上依旧可以看出来,我们的iptables可以控制三种封包的流向:
提示:有没有发现有两个“路由判断”呢?因为网络是双向的,所以进与出要分开来看。因此,进入的封包需要路由判断,送出的封包当然也要进行路由判断才能够发送出去。
由于 mangle 这个表格很少被使用,如果图4的mangle去掉的话,那就容易看的多了如图5:
图5 iptables 内建各表格与链的相关性(简图)
通过图5你就可以更轻松的了解到,事实上与本机最有关的其实是filter这个表格内的INPUT与OUTPUT这两条链,如果你的iptables只是用来保护Linux主机本身的话,那nat的规则根本就不需要理它,直接设定为开放即可。
不过,如果你的防火墙还要用来管制LAN(局域网)内的其他主机的话,那么你就必须要再针对filter的FORWARD这条链,还有nat的PREROUTING, POSTROUTING以及OUTPUT进行额外的配置才行。nat表格的使用需要对路由的概念理解得很深刻才能设置好,有兴趣的孩纸可以深入研究。