之前的博文己说明[了ip、tcp封包格式](https://yq.aliyun.com/go/articleRenderRedirect?url=http%3A%2F%2Fessun.blog.51cto.com%2F721033%2F1385641),深入了解其报文格式,对于这次说明 iptables的原理将有很大帮助。
**前言**
如果你运行的是linux操作系统,那么很有可以遇到过iptables防火墙,因为iptables提供了一个有效的手断来控制谁可以且如何通过网络连接到linux系统。部署一个严格的iptables过滤策略是维护一个强大实体的第一步。
**一、iptables与netfilter**
如果一说iptables就表示防火墙,其实这样说并不准确;iptables防火墙由Netfilter项目开发,自2001年1月linux2.4内核发布以来,它就成了linux的一部分了。由linux提供的所有包过虑和包修改设施的官方项目名为Netfilter,但这个术语同时也指linux内核中的一个框架,它可以用于在不同的阶段将函数挂接进网络栈。另一个方面,iptables使用netfilter框架旨在将对数据包执行操作(如过虑)的函数挂进网络栈,你可以认为netfilter提供了一框架,iptables在它之上建立了防火墙功能。nterfilter本身并不对数据包进行过虑---------它只是允许可以过虑数据包的函数挂接到内核中适当的位置。netfilter项目还在内核中提供了一些基础设施,如连接跟踪和志记录,任何iptables策略都可以使用这些设施来执行对特定的数据包处理。
**二、iptables过滤**
iptables的策略是如何定义的?其实iptabels就是一个过滤器,它可根据数据来源和去向进定限定。ip过虑主要工作于tcp/ip的协议的第二层,当然iptables有工作在第三层的能力。iptables严格按照tcp/ip协议处理报文流,但iptables是基于逐包的原则上处理的,它跟踪的序列号,端口号等等,来确定了一个唯一的流,这个就是所谓的连接跟踪,在连接的跟踪的基础之上,我们就可以做一些其它的操作,例如NAT,或者是基于状态的包过虑。
**三、ip过滤的术语**
1、DROP
当一个报文被丢弃或者拒绝的时个,它是被简单的释放,没有更多的后续工作,不会发送一个回应告诉主机这个报文被丢弃了,接收主机也不会被告知这个报文丢弃了,这个报文从此消失。
2、REJECT
从根本上来说,这个动作和上面的 DROP一样,只是REJECT 还会发送一个应答给发送主机,通知他这个报文被丢弃了。
3、APPECT
接受一个报文并且让他从防火墙的规则里面透过,它和DROP/REJECT 是相对的。
4、 Policy
我们讲策略的时候,主要有两重含义。第一是假如报文通过防火墙规则链检查的时候,不匹配任何规则我们应该怎么做,这个是我们讲的主要关注点。另外一个策略的含义就是我们通常讲的宽泛的安全策略。
5、Rule
在 Iptables 的实现里面,一个规则就是一个基本匹配加上可能存在的几个扩展匹配以及唯一的一个动作。我们已经提供了很多的动作或者匹配,他们都可以被应用到规则里面。
6、Target
通常而言,在规则集合里面的每一条规则都有一个自己的目标,换句我们更容易理解的话就是动作。假如一个报文匹配这个规则,那么这个动作就要被执行。例如这个动作可能是丢弃或者接收报文,还有可能是地址转换,每一个规则的 Target 都是可选的。
7、State
一个报文的状态是相对于一组报文来说的。例如,一个报文是防火墙第一次见到或者是已知的,那么他们的状态分别就是新建或者稳定流。状态可以通过连接跟踪系统获取到,在连接跟踪系统里面保存了所有的会话。
8、Table
每一个表都有特定的目的,在 iptables 里面有四个表,分别是raw,mang,net,filter.例如,filter表专门用来完成报文过滤,nat表专门用来完成地址转化等等。
9、Chain
一个链其实就是一组规则集合,在iptables里有五条链,分别是PREROUTING,INPUT,OUTP POSTROUTING,FORWORD这个规则会被应用到所有经过这个链的报文。每一个链都有其特定的含义,例如它关联到哪个表,它能够做什么事情。
**四、表与链**
**1、规则表**
**注:表的优先级同下顺序**
(1)、raw表
属性说明相关链OUTPUT、PREROUTING作用raw表的一个主要用途就是为了一件事情,那就是对报文设置一个标志,决定数据包是否被状态跟踪机制处理内核模块iptable_raw
(2) 、mangle表
属性说明相关链PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD作用修改数据包的服务类型、TTL、并且可以配置路由实现QOS。内核模块iptable_mangle
(3)、nat表
属性说明相关链PREROUTING、POSTROUTING、OUTPUT作用只能用来完成源/目的地址的转换。需要注意的是,只有第一个报文会经过这个表,这个连接的其他报文会自动完成转换。这个表的 target 有: DNAT、SNAT、MASQUERADE、REDIRECT内核模块iptable_nat
(4)、filter表
属性说明相关链INPUT、FORWARD、OUTPUT作用报文过滤内核模块iptables_filter
**2、规则链**
链说明PREROUTING对数据包作路由选择前应用此链中的规则。(所有的数据包进来的时侯都先由这个链处理)INPUT进来的数据包应用此规则链中的策略OUTPUT外出的数据包应用此规则链中的策略FORWARD转发数据包时应用此规则链中的策略POSTROUTING对数据包作路由选择后应用此链中的规则。(所有的数据包出来的时侯都先由这个链处理)
**五、iptables传输数据包的过程**
![](https://img.kancloud.cn/2a/36/2a36bd5a357df45806be21d1576c8f86_749x459.png)
简单解释一下上面这个图,例如一个报文到了第一个需要做路由决定的点,如果它的目的不是本机,则会被转发到 FORWARD 链,反之,目的地址正是本机所监听的,那么就会通过 INPUT 链把报文送给本机。 还需要指出的是,报文的目的地址是本机,但是它的地址可能会在PREROUTING 链里被 NAT 修改。因为这个发生在第一次路由前,报文在修改后才能路由。请注意,所有报文都会经过上面的至少一条链。如果你把你一个报文做 DNAT,然后把它发回它原来来的网络,这样它就会沿着余下的链表,直到它被发送回原来的网络。
**数据包流向情况分析**
第一种情况:目标是本地主机
从外界到达防火墙的数据包,先被PREROUTING规则链处理(是否修改数据包地址等),路由决定,例如决定报文是发向本机还是转发或者其他地方,如果数据包的目标主机是本机(比如说Internet用户访问防火墙主机中的web服务器的数据包),那么内核将其传给INPUT链进行处理(所有送往本机的报文都会进行过滤,决定是否允许通过等),通过以后再交给系统上层的应用程序(比如Apache服务器)进行响应。
第二冲情况:转发报文
来自外界的数据包到达防火墙后,首先被PREROUTING规则链处理,之后会进行路由选择,如果数据包的目标地址是其它外部地址(比如局域网用户通过网关访问web站点的数据包),则内核将其传递给FORWARD链进行处理(是否转发或拦截),然后再交给POSTROUTING规则链(是否修改数据包的地址等)进行处理
第三种情况:本地主机发送报文
本地进程或者应用程序(例如服务器或者客户端程序)向外部地址发送的数据包(比如在防火墙主机中测试公网DNS服务器时),首先被OUTPUT规则链处理,之后进行路由选择,然后传递给POSTROUTING规则链(是否修改数据包的地址(SNAT)等)进行处理