您好,欢迎访问三七文档
NAT技术的分析与测试1.NAT概述NAT,英文全称为NetworkAddressTranslation,即网络地址转换。通过该技术手段,可使得局域网内部网络中使用内部地址,并利用在网关处的特定设置,将内部地址替换成公用地址,从而保证内网主机可以正常的上网。NAT可以使多台计算机共享Internet连接,这一功能很好地解决了IPv4地址枯竭的问题。PREROUTINGSNATPOSTROUTINGFORWARDCONNTRACKCONNTRACK图1NAT工作原理NAT服务需要依赖于iptables来进行网络包的转发,其中iptables是一个类似于防火墙的软件,能进行网络报的过滤和转发。若内网某机器需要使用NAT服务发送网络包的时,网络包通过“Prerouting”–”Forward”-”Postrouting”将网络包转发出网卡。其中,Prerouting过程无操作,Forward过程进行包的转发,Postrouting过程更改网络包的源地址为NAT服务主机的ip地址。2.Netfilter/iptables技术分析Netfilter/iptables是实现NAT的基础。它可以为内核防火墙模块提供有状态或无状态的包过滤服务,从而实现NAT、IP伪装等,也可以因高级路由或连接状态管理的需要而修改IP头信息。故首先介绍Netfilter/iptables。说明:本文与内核相关的全部代码都是基于2.6.36版,iptables相关的源代码部分则是基于1.4.10版本。本文的流程图中有两种类型的箭头,表示函数调用关系,表示执行流程。2.1Netfilter/iptables简介Netfilter/iptables的IP信息包过滤系统由两个组件Netfilter和iptables组成。Netfilter是内核中的一组提供网络协议栈控制的程序框架,它通过在钩子hook注册回调函数,使得每个经过该hook的数据包都会调用这些函数,完成一定的控制功能。iptables是2.2.x的ipchains的后继工具,是用户空间中用于管理包过滤及NAT等的工具。它设置防火墙的过滤规则,并将规则添加到内核空间的特定信息包过滤表内的链中,通过Netfilter框架hook点的回调函数完成对数据报进行过滤、地址转换、处理等操作。而NAT正是通过在用户态设置的iptables过滤规则,使得从内网流出的包在通过hook点时被捕获,修改其包头信息,以转发到外网。2.2Netfilter/iptables-IPv4体系结构(1)Netfilter的HOOK机制:Netfilter通用框架不依赖具体的协议,不同的网络协议在IP协议栈建立了5个HOOK点,在每个HOOK点对数据包进行有选择的处理。内核任何模块可对一个或多个钩子函数进行注册,实现挂接,这样当某个数据包传递给Netfilter时,内核检测是否有模块对该协议和钩子函数进行注册。若注册了,则调用内核模块注册时的回调函数,模块便有机会检查并且在数据报经过这些钩子函数时被调用,从而模块可以修改、丢弃这些数据报及指示Netfilter将该数据报传入用户空间,并向Netfilter返回相应的值,以确定是否正常传输数据包,还是丢弃数据包。PREROUTINGROUTELOCAL_OUTLOCAL_INPOSTROUTINGFORWARDLOCAL_PROCESSROUTE图1IPV4中的处理点表1Netfilter框架中各个hook作用hook序号内容作用HOOK1NF_INET_PRE_ROUTING当进入系统的数据包在进行路由选择之前进行的防火墙检测处理HOOK2NF_INET_LOCAL_IN经由路由选择后的数据包,在传给本地进程处理之前所进行的防火墙检测处理HOOK3NF_INET_FORWARD在经由路由转发后的数据包处理HOOK4NF_INET_LOCAL_OUT本地进程产生的数据包在进行路由选择之前进行的防火墙检测处理HOOK5NF_INET_POST_ROUTING该处理点对应于进入防火墙的数据包和由防火墙本地进程产生的数据包,这些数据包在出防火墙时进行的控制处理第一个ROUTE针对收到的包做路由检查并判断这个包是需要转发还是发往上层的包,第二个ROUTE是针对发出包进行的路由。NF_INET_PRE_ROUTING点对所有传入IP层的数据包进行检查,在这之前,有关数据包的版本、长度、校验和等正确性检查已经完成;NF_INET_LOCAL_IN对发往上层的数据包进行检查;NF_INET_FORWARD检查需要转发的数据包;NF_INET_POST_ROUTING则对所有向链路层传递的数据包进行检查,在此处数据包的路由已经确定。NF_INET_LOCAL_OUT对本机发出的包进行检查,此处的路由还没有确定,所以可以做目的地址转换。(2)iptables基础模块Netfilter框架需要在内核模块注册table,要求数据报流经指定的规则表table,这种数据报选择用于实现数据报过滤(filter表),网络地址转换(nat表)及数据报处理(mangle表)。这三者是相互独立的模块,都是基于Netfilter的HOOK函数和一系列的表、若干链和规则实现各自的功能。Iptables可在用户态被设置成若干规则,这些规则可被导入到内核的Netfilter框架中进行匹配和处理。iptables命令主要有四个部分组成,即:作用在哪个表上、执行的命令(如在链上插入或删除一条规则)、条件(各种匹配)、目标操作(target)。iptables命令中各参数说明如下:规则表和规则链关系如图1-1所示,iptables命令使用选项-ttable选择规则表。规则表包含处理特定类型信息包的规则和链的信息。有三种可用的规则表选项:filter、nat和mangle,缺省值为filter表。filter表用于一般的信息包过滤,它包含INPUT、OUTPUT和FORWARD规则链。nat表用于要转发的信息包,它包含PREROUTING、OUTPUT和POSTROUTING规则链。mangle规则表包含PREROUTING和OUTPUT链。每条规则链上有许多规则,通过规则表和hook点规则链可以找到规则。内核规则按表链规则进行组织,如图2所示,规则表的不同HOOK点确定了的规则链,规则链中含有许多规则。iptables过滤器输入网络地址转换包处理输出转发前路由输出后路由前路由输出表链规则图2iptables规则链组织结构图iptables命令的规则包括匹配和目标,匹配指匹配于包的特征的选项,如源和目的地址、协议等。匹配包括标准的匹配选项和扩展的匹配模块。目标指对匹配的包进行的操作,它包括内建的一般目标(如:ACCEPT等)和扩展的目标模块。3.NAT源码分析NAT,英文全称为NetworkAddressTranslation,即网络地址转换。NAT有三种类型:静态地址转换NAT(StaticNAT)、动态地址转换NAT(PooledNAT)、网络地址端口转换NAPT(Port-LevelNAT)。为何引入NAT?简单地说,NAT就是在局域网内部网络中使用内部地址,而当内部电脑节点要与外部网络进行通讯时,就在网关处(可以理解为出口,打个比方就像院子的门一样),将内部地址替换成公用地址,从而保证内网主机可以正常的上网,NAT可以使多台计算机共享Internet连接,这一功能很好地解决了IPv4地址枯竭的问题。通过这种方法,您可以只申请一个合法IP地址,但却可以把整个局域网中的计算机通过这一个合法IP接入Internet中。这时,NAT屏蔽了内部网络,所有内网计算机对于公共网络来说是不可见的,而内网计算机用户通常不会意识到NAT的存在。NAT是一种在IP数据包通过路由器或防火墙时重写源IP地址或目的IP地址的技术,当然,它也让主机之间的通信变得复杂,在某种程度上导致通信效率的降低。上面提到的内部地址,是指在内部网络中分配给节点的私有IP地址,这个地址只能在内部网络中使用,不能被用作路由。虽然内部地址可以随机挑选,但是通常使用的是下面的地址:10.0.0.0~10.255.255.255,172.16.0.0~172.16.255.255,192.168.0.0~192.168.255.255。NAT将这些无法在互联网上使用的保留IP地址翻译成可以在互联网上使用的合法IP地址。NAT功能通常被集成到路由器、防火墙、ISDN路由器或者单独的NAT设备中。比如Cisco路由器中已经加入这一功能,网络管理员只需在路由器的IOS中设置NAT功能,就可以实现对内部网络的屏蔽。再比如防火墙将WEBServer的内部地址192.168.1.1映射为外部地址202.96.23.11,通过202.96.23.11访问外网。3.1NAT分类静态地址NAT:静态NAT设置起来最为简单和最容易实现的一种,内部网络中的每个主机都被永久映射成外部网络中的某个合法的地址。而动态地址NAT则是在外部网络中定义了一系列的合法地址,采用动态分配的方法映射到内部网络。NAPT则是把内部地址映射到外部网络的一个IP地址的不同端口上。动态地址NAT:动态地址NAT只是转换IP地址,它为每一个内部的IP地址分配一个临时的外部IP地址,主要应用于拨号,对于频繁的远程联接也可以采用动态NAT。当远程用户联接上之后,动态地址NAT就会分配给他一个IP地址,用户断开时,这个IP地址就会被释放而留待以后使用。网络地址端口转换NAPT:网络地址端口转换NAPT(NetworkAddressPortTranslation)是人们比较熟悉的一种转换方式。NAPT普遍应用于接入设备中,它可以将中小型的网络隐藏在一个合法的IP地址后面。NAPT与动态地址NAT不同,它将内部连接映射到外部网络中的一个单独的IP地址上,同时在该地址上加上一个由NAT设备选定的TCP端口号。3.2NAT原理NAT服务需要依赖于ip_tables来进行网络包的转发,其中ip_tables是一个类似于防火墙的软件,能进行网络报的过滤和转发。在一般情况下,网络包从网卡驱动程序中接收后通过“prerouting”-”input”向上层应用发送;当上层应用需要发送网络包时,通过”Output”-”Postrouting”发送到网卡驱动程序。若内网某机器需要使用NAT服务发送网络包的时,网络包通过“prerouting”–”Forward”-”Postrouting”将网络包转发出网卡。其中,prerouting过程无操作,Forward过程进行包的转发,Postrouting过程更改网络包的源地址为NAT服务主机的ip地址。当内网某机器需要使用NAT服务接收网络包时,网络包在被驱动程序接收后,仍从“prerouting”–”Forward”-”Postrouting”。与发送过程不同的是,Postrouting过程无操作,Prerouting过程中,更改网络包的目的地址为内网机器的ip地址。最后NAT主机收到的网络包会被转发给内网的某台机器。网卡驱动程序OutputForwardInputPostroutingPrerouting上层应用程序TCP/IP层驱动程序图3NAT工作原理图3.3NAT结构体分析在内核中,规则表存在全局的结构xt_af数组xt中,数组xt是以协议族编号为下标。从结构体中可以看出,这是一个存放所有规则信息的数据结构。不同协议族的规则表存在数组xt的不同元素中。对于规则表、匹配和目标都使用独立的内核模块进行描述。match和target的扩展都对应一个内核模块,内核模块的功能函数地址都存在匹配结构xt_match和目标结构xt_target的函数指针中。netfilter框架分别给它们提供了注册和注销函数,用于增加或删除规则表、匹配和目标。match链表是结构xt_match实例的链表,目标链表是结构xt_target实例的链表。table链表存储着规则表的结构,规则表通过结构xt_ta
本文标题:NAT机制分析
链接地址:https://www.777doc.com/doc-2889419 .html