服务器 频道

Linux下的NAT服务器架设实战(上)

二、 Linux下NAT的工作原理

1. netfilter/iptables 系统是如何工作的?

    netfilter/iptables IP 信息包过滤系统是一种功能强大的工具,可用于添加、编辑和除去规则,这些规则是在做信息包过滤决定时,防火墙所遵循和组成的规则。这些规则存储在专用的信息包过滤表中,而这些表集成在 Linux 内核中。在信息包过滤表中,规则被分组放在我们所谓的 链(chain)中。虽然 netfilter/iptables IP 信息包过滤系统被称为单个实体,但它实际上由两个组件 netfilter和 iptables 组成。 netfilter 组件也称为 内核空间(kernelspace),是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。 iptables 组件是一种工具,也称为 用户空间(userspace),它使插入、修改和除去信息包过滤表中的规则变得容易。通过使用用户空间,可以构建自己的定制规则,这些规则存储在内核空间的信息包过滤表中。这些规则具有 目标,它们告诉内核对来自某些源、前往某些目的地或具有某些协议类型的信息包做些什么。如果某个信息包与规则匹配,那么使用目标 ACCEPT 允许该信息包通过。还可以使用目标 DROP 或 REJECT 来阻塞并杀死信息包。对于可对信息包执行的其它操作,还有许多其它目标。图2 用图形说明了这个信息包过滤过程。
 

图 2 信息包过滤过程

2. 基于netfilter/iptables的NAT如何工作

    Linux下的NAT 是基于netfilter/iptables的。表1 是 netfilter/iptables 内核空间默认的表和链说明:filter 表用来过滤数据包,我们可以在任何时候匹配包并过滤它们。Mangle不经常使用还在开发当中。我们下面主要介绍Nat表来实现NAT功能。


    (1)用户使用iptables命令在用户空间设置NAT规则,通过使用用户空间iptables命令,可以构建用户自己的定制NAT规则。所有规则存储在内核空间的nat表中。根据规则所处理的信息包类型,将规则分组在链中。要做SNAT的信息包被添加到POSTROUTING链中。要做DNAT的信息包被添加到PREROUTING链中。直接从本地出站的信息包的规则被添加到OUTPUT 链中。

   (2)内核空间接管NAT工作

   图 3是 数据包穿越nat表的流程图

图 3 数据包穿越nat表的流程图

    做过NAT操作的数据包的地址就被改变了,当然这种改变是根据我们的规则进行的。属于一个流的包只会经过这个表一次。如果第一个包被允许做NAT或Masqueraded,那么余下的包都会自动地被做相同的操作。也就是说,余下的包不会再通过这个表,一个一个的被NAT,而是自动地完成。这就是我们为什么不应该在这个表中做任何过滤的主要原因。PREROUTING 链的作用是在包刚刚到达防火墙时改变它的目的地址,如果需要的话。OUTPUT链改变本地产生的包的目的地址。图4 是数据包穿越整个netfilter/iptables的流程图。
 
                    
图4 数据包穿越整个netfilter/iptables的流程图
 
   图5 是netfilter钩子函数在NAT模式(module)下的使用情况示意图。
 
图5 netfilter钩子函数在NAT模式(module)下的使用情况示意图

    (3)NAT工作步骤:

 DNAT:若包是被送往PREROUTING链的,并且匹配了规则, 则执行DNAT或REDIRECT目标。为了使数据包得到正确路由, 必须在路由之前进行DNAT。
 路由:内核检查信息包的头信息,尤其是信息包的目的地。
 处理本地进程产生的包:对nat表OUTPUT链中的规则实施规则检查, 对匹配的包执行目标动作。
 SNAT:若包是被送往POSTROUTING链的,并且匹配了规则, 则执行SNAT或MASQUERADE目标。 系统在决定了数据包的路由之后才执行该链中的规则。

0
相关文章