什么是防火墙?
所谓防火墙指的是一个由软件和硬件设备组合而成、在内部网和外部网之间、专用网与公共网之间的界面上构造的保护屏障.是一种获取安全性方法的形象说法,它是一种计算机硬件和软件的结合,使Internet与Intranet之间建立起一个安全网关(Security Gateway),从而保护内部网免受非法用户的侵入,防火墙主要由服务访问规则、验证工具、包过滤和应用网关4个部分组成,防火墙就是一个位于计算机和它所连接的网络之间的软件或硬件。该计算机流入流出的所有网络通信和数据包均要经过此防火墙。
一般防火墙有网络层防火墙和应用层防火墙,网络层防火墙可视为一种 IP 封包过滤器,运作在底层的TCP/IP协议堆栈上。应用层防火墙是在 TCP/IP 堆栈的“应用层”上运作,显然我们这里讨论的是网络层防火墙。
什么是iptables和netfilter?
Linux的网络功能是在内核中实现的!但是用户不能直接调节内核中关于网络的参数,我们需要一个工具连接内核与用户,以便用户可以控制网络功能,这个工具就叫iptables。而netfilter就是在内核的TCPIP协议栈中利用规则过滤报文的架构(Framework),netfilter的架构是在整个网络流程的若干位置放置了一些检测点(HOOK),而在每个检测点上登记了一些处理函数进行处理。
注意:iptables本身不是防火墙,真正起到防火墙功能的是规则,这些规则只有放到netfilter上才能生效!!
上面提到了检测点,那么这些监测点都是在我们主机的那些位置呢?
如上图所示是5个钩子函数,
hook function: 钩子函数
4、prerouting (实现比如地址转换NAT)
1、input
2、output
3、forward
5、postrouting
注意:不是说每个钩子函数都能实现任意的功能,要做目标地址转换一定是在4、prerouting进行的。要做原地址转换一定是在5、postrouting进行的【因为如果用户请求的是内部主机,是不需要做原地址转换了。而假如原地址转换放在4口,则报文刚进来不管目的地址就做了地址转换。】
知道了钩子函数的位置,我们就可以在这些位置上编写规则对数据报文进行过滤。正如上文中所说的,真正起到防火墙功能的是一些规则,那么这些防火墙规则又是什么?
要了解这些规则,我们首先需要对网络协议报文有一定的了解。我们知道,常见的网络层协议有ICMP,传输层有TCP,UDP,应用层有HTTP,FTP。那么我们的规则就是针对这些协议中的一些字段做出限制,从而达到过滤报文的功能。
比如,我们可以限制TCP数据报文中的源地址为10.2.1.1,源port为8500的报文访问我们的主机。甚至,规则可以更细化,我们知道TCP有三次握手,四次断开,我们可以生成规则将TCP三次握手中的第二次握手进行转发。
在每一个钩子函数上都可以放很多规则,规则是至上而下依次检查的,就像一个链一样,因此叫做规则链。每一个钩子函数都有一个规则链。
规则链:
PREROUTING
INPUT
FORWARD
OUTPUT
POSTROUTING
我们知道,函数是为实现某些功能而存在的,钩子函数也不例外。那么五个钩子函数的功能是都一样还是有重叠,还是都不一样呢?
答案是他们是有重叠的,但又不完全一样。某些功能只能在特定位置(特定钩子函数处)实现。(比如filter功能只能在INPUT、OUTPUT、FORWARD位置实现,而每个位置上又是
一个规则链,这就是表的由来!)
IPTABLES一共有四个表:
filter(过滤):表
INPUT
OUTPUT
FORWARD
nat(地址转换):表
PREROUTING
OUTPUT
POSTROUTING
mangle(拆开、修改、封装):表
PREROUTING
INPUT
FORWARD
OUTPUT
POSTROUTING
raw():表
PREROUTING
OUTPUT
注意:比如Input口既可以实现filter也可以实现mangle,但是它们不能放在一起(就是说不能交叉存放一个mangle一个filter交替)!【但是它们可以按照类来存放,是有先后顺序的每个口不一样】
具体顺序如下表:
PREROUTING | INPUT | FORWARD | OUTPUT | POSTROUTING |
Raw | Mangle | Mangle | Raw | Mangle |
Mangle | Filter | Filter | Mangle | Nat |
Nat |
|
| Nat |
|
|
|
| Filter |
|
以上便是IPTABLES的4表5链。
那么除了以上的默认链,我们能否使用自定义链?
可以使用自定链,但只在被默认链调用时才能发挥作用,而且如果没有自定义链中的任何规则匹配,还应该有返回机制;
用户可以删除自定义的空链,但是默认链无法删除
那么为什么要自定义链?
当链上有大量的规则时,每个包进来都会检测一遍,消耗大量的时间,但是,我们有自定义链后,只有访问web服务的我们才调到自定义链去检测,不涉及web访问的服务就直接经过主链。
另外每个规则都有两个内置的计数器:
被匹配的报文个数
被匹配的报文大小之和(2K+8K=10K)