术语:
DNAT - Destination Network Address Translation 目的网络地址转换。DNAT是一种改变数据包目的ip地址的技术,经常和SNAT联用,以使多台服务器能共享一个ip地址连入Internet,并且继续服务。通过对同一个ip地址分配不同的端口,来决定数据的流向。
SNAT - Source Network Address Translation 源网络地址转换。这是一种改变数据包源ip地址的技术,经常使用多台计算机分享一个Internet地址。这只在IPv4中使用,因为IPv4的地址已快用完了。
2.表和链
2.1流程
2.1.1外网数据包进入本地程序(输入)
Step(步骤) | Table(表) | Chain(链) | Comment(注释) |
1 | 在线路上传输(比如:Internet) | ||
2 | 进入接口(比如:eth0) | ||
3 | mangle | PREROUTING | 这个链用来mangle数据包 |
4 | nat | PREROUTING | 这个链主要用来做DAT。不要在这个链过滤操作,因为某些情况下会溜包。 |
5 | 路由判断。比如:包是发往本地的、还是要转发的。 | ||
6 | mangle | INPUT | 在路由之后,被发往本地程序之前,mangle数据包。 |
7 | filter | INPUT | 所有以本地为目的的包都要经过此链,不管他们从哪儿来,对这些包的过滤条件就设定在这里。 |
8 | 到达本地程序。 |
2.1.2本地源包输出到外网(输出)
Step(步骤) | Table(表) | Chain(链) | Comment(注释) |
1 | 本地程序创建源数据包(比如:服务程序) | ||
2 | 路由判断,要使用源地址,外出接口;或是其他。 | ||
3 | mangle | OUTPUT | 在此链mangle数据包。建议不要在这儿做过滤,可能有副作用。 |
4 | nat | OUTPUT | 此链对从防火墙本身发出的包进行DNAT操作。 |
5 | filter | OUTPUT | 对本地发出的包过滤。 |
6 | mangle | POSTROUTING | 此链主要在包DNAT之后(虽然在前面有一次路由,但对于本地的包,一旦它被生成,就必须经过路由代码的处理,但这个包具体到哪儿去,要由NAT处理之后才能确定。),离开本地之前,对包mangle。有两种包会经过这里,防火墙所在本机产生的包,以及被转发的包。 |
7 | nat | POSTROUTING | 在此链做SNAT,但不要在这里做过滤,因为有副作用,而且也些包是会溜过去的,即使你用了DROP策略。 |
8 | 离开接口(比如:eth0) | ||
9 | 在线路上传输(比如:Internet) |
2.1.3转发包
Step(步骤) | Table(表) | Chain(链) | Comment(注释) |
1 | 在线路上传输(比如:Internet) | ||
2 | 进入接口(比如:eth0) | ||
3 | mangle | PREROUTING | 此链mangle数据包 |
4 | nat | PREROUTING | 此链主要用来做DNAT,不要在此链上进行过滤操作。稍后会做SNAT |
5 | 路由判断。比如:包发往本地或转发。 | ||
6 | mangle | FORWARD | 包继续被发送至mangle表的FORWARD链,这是非常特殊的情况才会用到的。在这里,包被mangle,而这次mangle发生在最初的路由判断之后,和最后一次更改包的目的之前。(就是下面的FORWARD链所做的,因其过滤功能,可能会改变一些包的目的地,如丢弃包。) |
7 | filter | FORWARD | 包继续被发送至这条FORWARD链。只有需要转发的包才会走到这里,并且针对这些包的所有过滤也在这里进行。注意,所有要转发的包都要经过这里,不管是内网的还是外网的。自己在书写规则时,需要考虑这点。 |
8 | mangle | POSTROUTING | 此链也是针对一些特殊类型的包。这一步mangle是在所有更改包的目的地址操作完成之后的,但包此时还是本地上。 |
9 | nat | POSTROUTING | 此链是用来做SNAT,当然也包括Masquerade(伪装)。但不要在这做过滤。 |
10 | 离开接口(比如:eth0) | ||
11 | 又在线路上传输了。 |
现在,我们来看看在以上三种情况下,用到了哪些不同的链。图示如下:
要弄清楚上面的图,可以这样考虑。在第一个路由判断处,不是发往本地的包,我们会发送它穿过FORWARD链。若包的目的地是本地监听的IP地址,我们就会发送这个包穿过INPUT链,最后到达本地。
值得注意的是,在做NAT的过程中,发往本机的包的目的地址可能会在PREROUTING链里被改变。这个操作发生在第一次路由之前,所以地址被改变之后,才能对包进行路由。
注意,所有的包都会经过上图中的某一条路径。如果你把一个包DNAT回它原来的网络,这个包会继续走完相应路径上剩下的链,直到它被发送回原来的网络。
igz
2.2概述
2.2.1 mangle表
这个表主要用来mangle包,你可以使用mangle匹配来改变包的TOS等特性。强烈建议你不要在这个表里做任何过滤,不管是DNAT,SNAT或Masquerade。
以下是mangle表中仅有的几种操作:
- TOS :此操作用来设置或改变数据包的服务类型域。这常用来设置网络上的数据包如何被路由等策略。注意这个操作并不完善,有时得不所愿。它在Internet上还不能使用,而且很多路由器不会注意到这个域值。换句话说,不要设置发往Internet的包,除非你打算依靠TOS来路由,比如用iproute2。
- TTL :此操作用来改变数据包的生存时间域,我们可以让所有数据包只有一个特殊的TTL。它的存在有一个很好的理由,那就是我们可以欺骗一些ISP(互联网提供商)。为什么要欺骗他们呢?因为他们不愿意让我们共享一个链接。那些ISP会查找一台单独的计算机是否使用不同的TTL,并且以此作为判断连接是否被共享的标志。
- MARK :此操作用来给包设置特殊的标记。iproute2能识别这些标记,并根据不同的标记(或没有标记)决定不同的路由。用这些标记我们可以做带宽限制和基于请求的分类。
2.2.2 nat表
此表仅用于NAT,也就是转换包的源或目标地址。注意,就像我们前面说过的,只有流的第一个包会被这个链匹配,其后的包会自动被做相同的处理。实际的操作分为以下几类:
- DNAT :此操作主要用在这样一种情况,你有一个合法的IP地址,要把对防火墙的访问重定向到其他的机子上(比如:DMZ)。也就是说,我们改变的是目的地址,以使包能重路由到某台主机。
- SNAT :此操作改变包的源地址,这在极大程度上可以隐藏你的本地网络或者DMZ等。一个很好的例子是我们知道防火墙的外部地址,但必须用这个地址替换本地网络地址。有了这个操作,防火墙就能自动地对包做SNAT或De-SNAT(反向的SNAT),以使LAN能连接到Internet,如果使用类似192.168.0.0/24这样的地址,是不会从Internet得到任何回应的。因为IANA定义这些网络为私有的,只能用于LAN内部。
- MASQUERADE :此操作对每个匹配的包,MASQUERADE都要查找可用的IP地址,而不像SNAT用的IP地址是配置好的。当然这也有好处,就是我们可以使用通过PPP、PPPOE、SLIP等拨号得到的地址,这些地址可是由ISP的DHCP随机分配的。
2.2.3 filter表
filter表用来过滤数据包,我们可以在任何时候匹配包并过滤他们。我们就是在这里根据包的内容对包做DROP或ACCEPT的。当然,我们也可以预先在其他地方做些过滤,但是这个表才是设计用来过滤的。几乎所有的target都可以在这儿使用。大量具体的介绍在后面,现在只要知道过滤工作主要是在这儿完成的就行。