iptables的基础知识-iptables包的转发过程

运维 系统运维
iptables包的转发过程:iptabels被认为是Linux中实现包过滤功能的第四代应用程序。iptables包含在Linux2.4以后的内核中,详细地来讲iptables包在转发时是怎样被送出呢?本文介绍的是iptables的基础知识-iptables包的转发过程。

iptables包的转发过程:包在IPTABLES中如何走?

  当一个包进入或者送出或者被转发的时候,是依据什么呢?都会经过哪些表和哪些链呢?

  iptabeles中内建有三个表,分别为MANGLE,NAT,FILTER,当为未指定规则表时,则默认为filter表,若要将rule加到其他表中,则要用-t来指明。

  其中有个表叫mangle,这个词难以表达,我只能把我理解的写出来。意思就是,会对数据包的一些传输特性进行修改,在mangle表中允许的操作是TOS、TTL、MARK。也就是说,今后只要我们见到这个词能理解它的作用就行了。

  强烈建议你不要在这个表里做任何过滤,不管是DANT,SNAT或者Masquerade。

  Nat表就是地址转换了,可以做DNAT,SNAT,可做一对一,一对多,多对对转换,该表有Prerouting 和 postrouting两条规则链。DNAT操作主要用在这样一种情况,你有一个合法的IP地址,要把对防火墙的访问重定向到其他的机子上(比如DMZ)。也就是说,我们改变的是目的地址,以使包能重路由到某台主机。SNAT改变包的源地址,这在极大程度上可以隐藏你的本地网络或者DMZ等。一个很好的例子是我们知道防火墙的外部地址,但必须用这个地址替换本地网络地址。有了这个操作,防火墙就能自动地对包做SNAT和De-SNAT(就是反向的SNAT),以使LAN能连接到Internet。如果使用类似192.168.0.0/24这样的地址,是不会从Internet得到任何回应的。因为IANA定义这些网络(还有其他的)为私有的,只能用于LAN内部。MASQUERADE的作用和SNAT完全一样,只是计算机的负荷稍微多一点。因为对每个匹配的包,MASQUERADE都要查找可用的IP地址,而不象SNAT用的IP地址是配置好的。当然,这也有好处,就是我们可以使用通过PPP、PPPOE、SLIP等拨号得到的地址,这些地址可是由ISP的DHCP随机分配的

  Filter表就是我们最常用的了,iptables包过滤就靠这个了,系统默认建有三个链,INPUT,OUTPUT还有FORWARD,这个表用来进行封包过滤的处理(如:DROP,ACCEPT,LOG,REJECT,ULOG等),基本规则都建在这个表中。

  注:所谓的链就是规则的集合,也可以自定义链

  当数据包到达防火墙时,如果MAC地址符合,就会由内核里相应的驱动程序接收,然后会经过一系列操作,从而决定是发送给本地的程序,还是转发给其他机子,还是其他的什么。

  以本地为目标的iptables包(就是我们自己的机子了)

  Step(步骤) Table(表) Chain(链) Comment(注释)

  1 在线路上传输(比如,Internet)

  2 进入接口 (比如,eth0)

  3 Mangle PREROUTING 这个链用来mangle数据包,比如改变TOS等

  4 Nat PREROUTING 这个链主要用来做DNAT。不要在这个链做过虑操作,因为某些情况下包会溜过去。

  5 路由判断,比如,iptables包是发往本地的,还是要转发的。

  6 Mangle INPUT 在路由之后,被送往本地程序之前,mangle数据包。

  7 Filter INPUT 所有以本地为目的的iptables包都要经过这个链,不管它们从哪儿来,对这些iptables包的过滤条件就设在这里。

  8 到达本地程序了(比如,服务程序或客户程序)

  现在我们来看看源地址是本地器的包要经过哪些步骤:

  以本地为源的iptables包

  Step Table Chain Comment

  1 本地程序(比如,服务程序或客户程序)

  2 路由判断,要使用源地址,外出接口,还有其他一些信息。

  3 mangle OUTPUT 在这儿可以mangle包。建议不要在这儿做过滤,可能有副作用哦。

  4 nat OUTPUT 这个链对从防火墙本身发出的包进行DNAT操作。

  5 filter OUTPUT 对本地发出的iptables包过滤。

  6 mangle POSTROUTING 这条链主要在包DNAT之后(译者注:作者把这一次DNAT称作实际的路由,虽然在前面有一次路由。对于本地的包,一旦它被生成,就必须经过路由代码的处理,但这个包具体到哪儿去,要由NAT代码处理之后才能确定。所以把这称作实际的路由。),离开本地之前,对iptables包 mangle。有两种包会经过这里,防火墙所在机子本身产生的包,还有被转发的包。

  7 nat POSTROUTING 在这里做SNAT。但不要在这里做过滤,因为有副作用,而且有些iptables包是会溜过去的,即使你用了DROP策略。

  8 离开接口(比如: eth0)

  9 在线路上传输(比如,Internet)

  在这个表中有个要注意的地方,从本机发出的包,要经过NAT 中的OUTPUT。

  在这个例子中,我们假设一个iptables包的目的是另一个网络中的一台机子。让我们来看看这个iptables包的旅程:

  转发iptables包

  Step Table Chain Comment

  1 在线路上传输(比如,Internet)

  2 进入接口(比如, eth0)

  3 mangle PREROUTING mangle数据包,,比如改变TOS等。

  4 nat PREROUTING 这个链主要用来做DNAT。不要在这个链做过虑操作,因为某些情况下包会溜过去。稍后会做SNAT。

  5 路由判断,比如,包是发往本地的,还是要转发的。

  6 mangle FORWARD 包继续被发送至mangle表的FORWARD链,这是非常特殊的情况才会用到的。在这里,包被mangle(还记得mangle的意思吗)。这次mangle发生在最初的路由判断之后,在***一次更改包的目的之前(译者注:就是下面的FORWARD链所做的,因其过滤功能,可能会改变一些包的目的地,如丢弃包)。

  7 filter FORWARD 包继续被发送至这条FORWARD链。只有需要转发的包才会走到这里,并且针对这些包的所有过滤也在这里进行。注意,所有要转发的包都要经过这里,不管是外网到内网的还是内网到外网的。在你自己书写规则时,要考虑到这一点。

  8 mangle POSTROUTING 这个链也是针对一些特殊类型的包(译者注:参考第6步,我们可以发现,在转发包时,mangle表的两个链都用在特殊的应用上)。这一步mangle是在所有更改包的目的地址的操作完成之后做的,但这时包还在本地上。

  9 nat POSTROUTING 这个链就是用来做SNAT的,当然也包括Masquerade(伪装)。但不要在这儿做过滤,因为某些包即使不满足条件也会通过。

  10 离开接口(比如: eth0)

  11 又在线路上传输了(比如,LAN)

  就如你所见的,包要经历很多步骤,而且它们可以被阻拦在任何一条链上,或者是任何有问题的地方。所有要经防火墙转发的包都要经过FORWARD链。

  由上边的表格和图可以看出,iptables 处理包的流动,分述如下:

  INPUT:只有要到本机的封包才会由 INPUT 处理,所以会让來自內部网络的封包无条件放行,而来自外部的封包則过滤,是否为回应包,若是則放行。

  PREROUTING:需要转送处理的封包由此处理,用来做目的地 IP 的翻译(DNAT)。

  FORWARD:源IP和目的IP都不是本机的,就要被转发,所有要转发的封包都在这里处理,这部分的过滤规则最为复杂。

  POSTROUTING:转发封包送出之前,先同过这个来进行源IP的翻译(SNAT)。

  OUTPUT:从本机发送出去的包都有此处理,通常放行所有封包。

  从上边看得出,对于iptables来说,是依据IP地址进行决策,也就是说包中的IP地址决定一个包的流向。

  进入FORWRAD的一定不会进入到INPUT和OUTPUT。

  在处理过程中如果符合某条规则将会进行处理,处理动作除有ACCEPT、REJECT、DROP、REDIRECT 和 MASQUERADE 外还有LOG、ULOG、DNAT、SNAT、MIRROR、QUEUE、RETURN、TOS、TTL、MARK 等。

  我们可以使用< iptables save file > 将结果保存到指定文件中,然后用< iptables restore file > 将指定文件的内容加载,或者写成脚本,然后执行脚本就可以了。我推荐使用脚本,因为可以使用shell编程,从而写出强大,灵活的脚本来。iptables包的转发过程就讲到这里啦。

上一节:iptables中的ICMP   下一节:iptables规则

【编辑推荐】

IPtables防火墙使用技巧(超实用)

Linux下Iptables端口转发功能的解决

四种NAT的iptables实现

责任编辑:zhaolei 来源: netren
相关推荐

2011-03-18 09:26:13

Iptables规则

2011-03-16 11:17:56

IptablesICMP

2011-03-16 11:12:06

Iptables

2011-03-18 09:26:14

iptableslimit

2011-03-16 11:15:12

2011-03-16 11:06:55

Iptables防火墙

2011-03-18 09:26:13

IptablesTOS

2011-03-17 14:26:45

iptables 端口

2021-11-05 15:31:01

UbuntuLinux

2011-03-16 10:12:27

LinuxIptables端口转发

2011-03-14 14:40:11

iptables编译

2023-07-04 07:31:06

MapReduce数据处理编程模型

2011-03-16 14:38:55

iptables命令

2011-03-16 14:55:36

关闭iptables

2011-03-15 09:59:54

2011-03-16 09:30:47

iptables过滤

2011-03-14 15:17:40

iptables设定

2011-03-15 09:59:54

2011-03-16 09:53:25

2023-05-12 09:40:53

ContextGolang
点赞
收藏

51CTO技术栈公众号