Linux iptables原理--数据包流向

 

IptableNetfilter

在上一篇文章 linux iptables常用命令--配置一个生产环境的iptables 我们知道iptables有好几个表,如raw,mangle,nat,filter,有好几条链,如PRE_ROUTING、INPUT、OUTPUT、FORWARD、POST_ROUTING,那么它们有什么关系,调用流程是怎样的。

 

其实Iptables只是一个应用层的程序,它属于用户空间,通过iptables配置规则后都会调用 Netfilter开放的接口来对存放在内核空间中的数据进行修改。

Netfilter是Linux操作系统核心层内部的一个数据包处理模块,它属于内核空间,有五个挂载点,当数据包到达这些位置的时候会调用这些函数,在这些位置上我们可以对数据包的内容进行修改,达到控制的目的,这5个挂载点分别是PRE_ROUTING、INPUT、OUTPUT、FORWARD、POST_ROUTING。也就是我们常说的五条链。

 

 

iptables四表五链

链是放在表中的,总共有四个表,每个表有不同的优化级:raw>mangle >nat> filter

一个表有若干个链,如下所示:

 

raw

mangle

nat

filter

prerouting

Y

Y

Y

 

input

 

Y

 

Y

output

Y

Y

Y

Y

forward

 

Y

 

Y

postrouting

 

Y

Y

 

 

加红的代表用得相对比较多的。

 

 

四张表的功能

raw

是自1.2.9以后版本的iptables新增的表,主要用于决定数据包是否被状态跟踪机制处理,一般在高并发时有可能会用到,来设置一些连接不跟踪状态,防止ip_conntrack文件被撑爆。

mangle

主要用于修改数据包的TOS(Type Of Service,服务类型)、TTL(Time To Live,生存周期)指以及为数据包设置Mark标记,以实现Qos(Quality Of Service,服务质量)调整以及策略路由等应用,由于需要相应的路由设备支持,应用并不广泛。

nat

主要用于修改数据包的IP地址、端口号等信息(网络地址转换,如SNAT、DNAT、MASQUERADE、REDIRECT),一般在作为网关服务器上会用到,如果有搭建过openvpn的话,一般也会用到。

filter

主要用于对数据包进行过滤,有DROP、ACCEPT、REJECT、LOG等,一般在input 和forward chain用得最多,也是出现频率最高的。

 

 

 

iptables数据包流向

一个数据包到达时,是怎么依次穿过各个链和表的,是得看看下面这张详细的流程图了:

 

 

我们结合上图举个例子:

 

假如有数据包从Network IN要通过iptables,数据包流向如下:

1.Network IN数据包到达服务器的网络接口

2.进入raw表的 PREROUTING 链,这个链的作用是决定数据包是否被状态跟踪。

  进入 mangle 表的 PREROUTING 链,在此可以修改数据包,比如 TOS 等。

  进入 nat 表的 PREROUTING 链,可以在此做DNAT(目标地址转换)

3.决定路由,查看目标地址是交给本地主机还是转发给其它主机。

 

4.到这里分两种情况,一种情况是数据包要转发给其它主机(一般情况下它是在担任网关服务器),数据包会依次经过:

5.进入 mangle 表的 FORWARD 链,

  进入 filter 表的 FORWARD 链,在这里我们可以对所有转发的数据包进行过滤。

6.进入 mangle 表的 POSTROUTING 链

  进入 nat 表的 POSTROUTING 链,在这里一般都是用来做 SNAT (源地址转换)

7.数据包流出网络接口,发往network out。

 

8.另一种情况,数据包的目标地址就是发给本地主机的,它会依次穿过:

9.进入 mangle 表的 INPUT 链,

  进入 filter 表的 INPUT 链,在这里我们可以对流入的所有数据包进行过滤,

  数据包交给本地主机的应用程序进行处理。

10.应用程序处理完毕后发送的数据包进行路由发送决定。

11.进入 raw 表的 OUTPUT 链。

   进入 mangle 表的 OUTPUT 链,

   进入 nat 表的 OUTPUT 链,

   进入 filter 表的 OUTPUT 链。

12.进入 mangle 表的 POSTROUTING 链,

   进入 nat 表的 POSTROUTING 链。

13.进入出去的网络接口,发送往network out。

 

 

所以,如果我们要过滤控制包的进出,只需要把input chain和forward chain这两个关口把控住就好了,这也是我们上篇文章把input chain和forward chain默认设置为drop的原因。

 

 

以上这张流程图值得反复仔细查看,这样以后制定规则就心里有数,通与不通也才能快速排错。

 

 

 

 

 

Save

Save

Save

Save

Save

Save

Save

Save

Save

Save

posted @ 2016-09-29 14:18  泽锦  阅读(8311)  评论(0编辑  收藏  举报