毕业设计(论文)-基于Linux的NAT服务器设计_第1页
毕业设计(论文)-基于Linux的NAT服务器设计_第2页
毕业设计(论文)-基于Linux的NAT服务器设计_第3页
毕业设计(论文)-基于Linux的NAT服务器设计_第4页
毕业设计(论文)-基于Linux的NAT服务器设计_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

PAGEPAGE17PAGE1 本科生毕业论文题目基于Linux的NAT服务器设计系别计算机与信息工程学院班级计算机科学与技术082姓名学号答辩时间2012年5月新疆农业大学计算机与信息工程学院目录TOC\o"1-3"\h\u2655摘要 114661NAT服务器的基本原理 384641.1NAT转换地址的基本原理 3267371.2NAT实现技术的分类 4253651.3NAT技术的应用 5271362Linux下的NAT服务器功能介绍 6299952.1硬件实现Linux下的NAT 698762.2Linux下iptable实现NAT 7167823基于Linux的NAT模块设计和实现分析 7110593.1基于Linux的NAT服务器功能模块设计 797223.2基于Linux的NAT地址转换的基本流程 861933.3NAT服务器实现采用的技术方案 9155753.3.1netfilter 9133623.3.2NAT实现的三条规则链 11227023.3.3基于Linux的NAT实现对操作系统的要求 11236184基于Linux的NAT服务器功能模块实现 1131584.1获取数据模块的实现 11250514.2检测NAT表模块的实现 12116434.3决定映射模块的实现 13117144.4修改地址模块的实现 14277544.5转发数据模块的实现 16305004.6测试 16131395结论 166242参考文献 1720559谢辞 18基于Linux的NAT服务器设计指导教师摘要:本文首先介绍了NAT服务器实现的基本原理,列出了NAT服务器实现的三种技术分类,即静态地址转换、动态地址转换和端口复用动态地址转换。而后举例说明NAT在地址转换、负荷均衡、节约资源等方面的应用,第二章节介绍了Linux下实现NAT的功能,引出本课题研究的主题,基于Linux的NAT服务器设计,介绍了本课题需要完成的任务是实现Linux下简单的NAT功能,第三章节就详细设计了系统实现的具体模块,以及各模块之间的关系。第四章节是本文重点研究的内容,文中介绍了设计的详细完成方法,以达到地址转换的功能。关键词:网络地址转换;IP地址;私有地址;数据报NATServerDesignBasedonLinuxLiuMingmingTutor:DaXinMinAbstract:ThispaperfirstintroducesthebasicprincipleoftherealizationoftheNATserver,liststheNATserveroftherealizationofthethreekindsoftechnicalclassification,staticaddresstranslation,dynamicaddresstranslationandportreusedynamicaddresstranslation.AndthenforexampleNATinaddresstranslation,loadbalance,conservationofresources,andotheraspectsoftheapplication,thesecondchapterintroducestheLinuxunderthefunctionoftherealizationoftheNAT,arousethethemeofsubjectresearch,basedonLinuxNATserverdesign,introducedthistopicneedtocompletethetaskistorealizethesimpleNATfunctionLinux,thethirdchapterisdetailedthesystemdesignofthespecificmodule,andtherelationshipbetweenthevariousmodules.Thefourthchaptertothisisthekeyresearchcontent,thispaperintroducesthemethodtofinishthedetaileddesign,inordertoachievethefunctionoftheaddresstranslation.Keywords:NAT;IPaddress;PrivateAddress;Datagram随着互联网时代技术的突飞猛进,世界的网民也越来越多,随之带来的问题便可想而知。最直接的一个问题,IPv4下的IP地址面临耗尽,虽然IPv6的提出让人们又看到了“希望”,但是从IPv4到IPv6的全面替换,还有些不太现实。这个时候恰恰促进了网络地址转换(NAT,NetworkAddressTranslation)技术的产生,NAT属接入广域网(WAN)技术,是一种将私有(保留)地址转化为合法IP地址的转换技术,它被广泛应用于各种类型Internet接入方式和各种类型的网络中。原因很简单,NAT不仅完美地解决了IP地址不足的问题,而且还能够有效地避免来自网络外部的攻击,隐藏并保护网络内部的计算机。[1]在本论文中将会详细的讲述NAT的基本原理及其应用,并且给出论文设计的具体过程。1NAT服务器的基本原理1.1NAT转换地址的基本原理NAT服务器主要完成的是地址转换的功能,当局域网内部的终端要访问外网时,该终端的内部IP地址(私有地址)经过NAT服务器时,服务器会将私有地址转换成一个可以进入互联网的合法IP地址,在这时,系统中会形成一张映射表,来记录私有地址与转换之后的合法地址的关系。当外部网络发送消息到这个终端,它只需要将刚才与它通信的合法IP地址作为发送目的地址发送消息,当此消息到达NAT服务器时,服务器会根据之前产生的映射表,找到与该IP对应的私有地址,再将信息发送到私有地址对应的终端。1)NAT转换地址的过程当IP数据报从内部的终端经过NAT向Internet服务器传送时,NAT会将数据报的源地址转换为一个可以在互联网上路由的合法IP地址,并且把这个转换前后的两个IP都记录到系统的一张映射表中。当外部网络发送数据报到这个终端,NAT会根据映射表中刚才记录的映射关系找到数据报要到达的终端的内部IP地址,然后修改接受来的数据报的首部的目的地址,最后将数据报发送给内部地址对应的终端。2)传输在网络间的数据报头的格式网络间传输数据的基本单元是数据报(Datagram),每个数据报都包含一个报头(header)和数据本身,其中报头描述了数据的目的地以及和其它数据之间的关系。IP数据报是TCP/IP协议定义在因特网上传输的一种数据报,首部的前部分是固定长度,共20字节,是所有IP数据报必须具有的,这里面有四位就是用来存放数据报源地址和目的地址的,源地址和目的地址都是IP地址,大概格式如图1-1所示:图1-1数据报格式NAT技术就是对IP数据报的这两个部分进行操作,以达到私有地址与公有地址的转换。1.2NAT实现技术的分类1)静态地址转换静态地址转换(StaticAddressTranslation,SAT)是把内部网络私有IP地址转换为公有IP地址,这种转换是一对一的,这种转换方式形成的是一张固定不变的映射表,某个私有IP地址只能转换为某个公有IP地址。借助于静态转换,可以实现外部网络对内部网络中某些特定设备的访问。2)动态地址转换动态地址转换(DynamicAddressTranslation,DAT)是NAT转换器具有一个公有地址池,在这个地址池中有多个公有地址,当一个私有地址主机要与外部通信时,动态NAT转换器从地址池中动态分配一个未使用的公有地址,在公有地址与私有地址间形成一种暂时的映射关系,并保存这种映射关系,然后进行地址转换,当通信结束时,NAT转换器将解除这种暂时的映射关系,释放出公有地址,以供下一个转换使用[3]。3)端口复用动态地址转换端口复用动态地址转换(PAT,PortAddressTranslation),用的是公有地址的一个端口对应一个私有地址,建立公有地址端口与私有地址之间的映射关系[2],这时内部网络的所有主机均可共享一个合法外部IP地址,这个方法可以有效的节省IP地址资源,同时又可以隐藏网络内部的所有主机。所以这种NAT技术是现在最为常用的技术。1.3NAT技术的应用1)NAT技术在地址转换方面的应用假如校园网中有两间计算机课室,每间计算机课室配备60台PC机,一栋办公楼,有几十台办公PC机,有1台Web服务器和1台E-mail服务器,计算机课室和办公楼都要求能够上互联网,两台服务器要求对内外开放。学校现有8个C类的IP地址(IP地址是01至08,掩码为),这显然是不够用,为了达到校园网的建设目标,采用了NAT技术的解决方案[2]。拓扑图如图1-2所示:图1-2学校局域网拓扑图2)NAT技术在负荷均衡方面的应用NAT负载均衡将一个外部地址映射为多个内部IP地址,对每次连接请求动态地转换为一个内部服务器的地址,将外部连接请求引到转换得到地址的那个服务器上,从而达到负载均衡的目的。NAT负载均衡可以通过软硬件方式来实现,通过软件方式来实现NAT负载均衡的设备往往受到带宽及系统本身处理能力的限制,由于NAT比较接近网络的低层,因此就可以将它集成在硬件设备中,通常这样的硬件设备是第四层交换机和专用负载均衡器,第四层交换机的一项重要功能就是NAT负载均衡。实例:现有一台有一个串行接口和一个Ethernet接口的路由器,Ethernet口连接到内部网络,内部网络上有三台web服务器,但都只是低端配置,为了处理好来自Internet上大量的web连接请求,因此需要在此路由器上做NAT负载均衡配置,把发送到web服务器合法InternetIP地址的报文转换成这三台服务器的内部本地地址。2Linux下的NAT服务器功能介绍2.1硬件实现Linux下的NAT在实际使用中,NAT服务器可以硬件实现,例如新疆农业大学的校园局域网,就是用这种技术实现的,具体使用的是端口复用动态地址转换方式,原理如图2-1所示:图2.1硬件实现NAT原理图2.2Linux下iptable实现NAT在Linux下使用iptables也可以实现NAT功能,包括静态地址转换、动态地址转换、端口复用动态地址转换,三种方式都可以实现网络地址转换功能。而这个课题研究的是利用软件程序来完成NAT的基本功能,是在Linux系统上实现的一个简单的可以实现地址转换的系统,利用Linux内核通用架构netfilter的特点来实现该系统主要功能,基于Linux的NAT实现的主要功能有:对内部终端发来的数据包进行处理,修改数据包头部的源IP地址,即是将私有地址转化为合法的公有地址,外部发送数据到内部终端,终端可以接收到数据。3基于Linux的NAT模块设计和实现分析3.1基于Linux的NAT服务器功能模块设计图3-1NAT服务器功能模块示意图NAT服务器功能模块设计如图3-1所示,内部主机发送数据,到达NAT服务器,经过第一模块——获取数据,获取数据模块获取到数据后,会将数据包的IP地址取出;结果会被数据结构存储,第二模块——检测NAT表模块会在系统的IP映射表里查找,如果查到该内部主机已经映射过IP,则直接用这个映射IP地址,这时不会进入决定映射这个模块,如果没有映射记录,进入决定映射模块,系统为其决定映射地址;系统进入第四模块——修改地址模块,该模块会修改数据包的源地址IP;数据到达转发数据模块,经该模块转发到Internet服务器。Internet服务器发送数据到内部主机的过程则是,修改地址模块修改数据包的目的地址即可,其他模块工作与上面的相同。3.2基于Linux的NAT地址转换的基本流程为了形象的说明流程,我用一个具体的例子来说明该系统设计的流程:当这台计算机向Internet上的服务器6发出请求,如图3-2所示:图3-2内部主机发送数据NAT流程图Internet服务器6接到该数据包,并以该包的源地址(3)作为数据包的目的地址,发送数据,流程如图3-3所示:图3-3Internet发送数据到内部主机流程分析图3.3NAT服务器实现采用的技术方案系统开发使用的基础环境是Linux-内核,Linux作为服务器端,也就是NAT运行端,编译工具是Gcc工具4.6.3的版本。3.3.1netfilternetfilter是Linux核心中一个通用架构,它提供了一系列的"表"(tables),每个表由若干"链"(chains)组成,而每条链中可以有一条或数条规则(rule)组成,在2.4/2.6内核的Linux中的防火墙代码netfilter中支持源NAT(SNAT)和目的NAT(DNAT)。netfilter的架构就是在整个网络流程的若干位置放置了一些检测点(HOOK),而在每个检测点上登记了一些处理函数进行处理(如包过滤,NAT等,甚至可以是用户自定义的功能)。NAT操作是以netfilter节点形式挂接在相应的处理点上的函数为基础,DNAT挂接在NF_IP_PRE_ROUTING点上,优先级高于FILTER低于MANGLE,表示在mangle表后处理,但在filter表前处理数据包;SNAT挂在NF_IP_POST_ROUTING点上,优先级低于FILTER,表示在filter表后面处理数据包。目的NAT的hook节点:/*Beforepacketfiltering,changedestination*/staticstructnf_hook_opsip_nat_in_ops={{NULL,NULL},ip_nat_fn,PF_INET,NF_IP_PRE_ROUTING,NF_IP_PRI_NAT_DST};源NAT的hook节点:/*Afterpacketfiltering,changesource*/staticstructnf_hook_opsip_nat_out_ops={{NULL,NULL},ip_nat_out,PF_INET,NF_IP_POST_ROUTING,NF_IP_PRI_NAT_SRC};netfilter的架构就是在整个网络流程的若干位置放置了一些检测点(HOOK),而在每个检测点上登记了一些处理函数进行处理[12]:IP层的五个HOOK点的位置如下:NF_IP_PRE_ROUTING:刚刚进入网络层的数据包通过此点(刚刚进行完版本号,校验和等检测),目的地址转换在此点进行;NF_IP_LOCAL_IN:经路由查找后,送往本机的通过此检查点,INPUT包过滤在此点进行;NF_IP_FORWARD:要转发的包通过此检测点,FORWORD包过滤在此点进行;NF_IP_POST_ROUTING:所有马上要通过网络设备出去的包通过此检测点,内置的源地址转换功能(包括地址伪装)在此点进行;NF_IP_LOCAL_OUT:本机进程发出的包通过此检测点,OUTPUT包过滤在此点进行。(6)netfilter的返回值有5种:返回值含义NF_DROP丢弃该数据包NF_ACCEPT保留该数据包NF_STOLEN忘掉该数据包NF_QUEUE将该数据包插入到用户空间NF_REPEAT再次调用该hook函数3.3.2NAT实现的三条规则链nat表有三条缺省的"链"(chains),这三条链也是规则的容器,它们分别是:PREROUTING:可以在这里定义进行目的NAT的规则,因为路由器进行路由时只检查数据包的目的ip地址,所以为了使数据包得以正确路由,我们必须在路由之前就进行目的NAT。POSTROUTING:可以在这里定义进行源NAT的规则,系统在决定了数据包的路由以后在执行该链中的规则。OUTPUT:定义对本地产生的数据包的目的NAT规则。3.3.3基于Linux的NAT实现对操作系统的要求要在Linux操作系统下完成简单的NAT系统,对Linux操作系统本身也有要求,其实Linux系统本身带有NAT功能,利用netfilter中的iptable设置来实现了地址转换功能,而这里是要自己来编写内核代码来实现NAT功能,代替掉Linux本身的。要实现自己的NAT功能,首先考虑直接用iptables是否可以配置出来,然后考虑通过开发应用程序来设置netfilter模块完成该功能;都不能实现的情况下再考虑修改Linux内核的netfilter模块以达成目标。我的设计主要是利用Linux下的netfilter通用架构,利用netfilter提供给的检测点,自己编写代码,编译到内核当中去,替代原来的NAT实现,netfilter架构包含的检测点可以实现对数据到来的检测和获取,综合运用NAT的三条规则链以实现功能。4基于Linux的NAT服务器功能模块实现在第三章中已经简单介绍了系统的五个功能模块和几个模块的关系,这一章中就要对每个模块是如何实现的做简单的介绍。4.1获取数据模块的实现当一个数据包经过Linux内核的网络堆栈时,它穿过了几个hook点,在这里,数据包可以被分析并且选择是保留还是丢弃,这些hook点就是netfilterfilter有五个钩子函数,其中就有可以截取数据的钩子函数。如果要注册一个钩子函数,就要先申明一个nf_hook_ops结构体,然后对其结构体里面的各个属性进行相应的赋值structnf_hook_ops

{structlist_headlist;//链表头,用来把各个处理函数组织成一个表,初始化为{NULL,NULL};nf_hookfn*hook;//我们定义的处理函数的指针,它的返回值必须为前面所说的几个常量之一;intpf;//协议族,表示这个HOOK属于哪个协议族;inthooknum;//我们想要注册的钩子,取值为五个钩子之一;intpriority;//优先级

};用于注册我们的函数的数据结构:staticstructnf_hook_opsnfho;注册的hook函数的实现注意细节:

nfho.priority=NF_IP_PRI_FIRST;/*让我们的函数首先执行*/

nf_register_hook(&nfho);//将用户自己定义的钩子注册到内核中4.2检测NAT表模块的实现对于非初始化连接的数据包,即后续的数据包,一旦确定它属于某个连接,则可以直接利用连接状态里的nat信息来进行地址转换;而对于初始数据包,必须在nat表里查找相应的规则,确定了地址转换的内容后,将这些信息放到连接跟踪结构的nat参量里面,供后续的数据包使用。所以在NAT获得数据包之后,要进行检测NAT表模块的检测。/*循环,尝试mr参数所指定的地址/端口范围,直到能满足其tuple是唯一的*/while((rptr=find_best_ips_proto_fast(tuple,mr,conntrack,hooknum))!=NULL)(1)当内部主机发送数据包经过NAT时,该模块检测的是这个内部主机之前有没有映射记录,如果有记录,数据包会直接进入修改地址模块,修改地址模块修改数据包的源地址IP,再将数据转发到Internet服务器:returndo_bindings(ct,ctinfo,info,hooknum,pskb);这句把数据包要做的修改信息返回给系统。当Internet服务器发送数据包经过NAT到内部主机,检测NAT表模块会在IP映射表中是否有与数据包目的IP地址相映射的内部主机IP,没有找到,系统会丢弃数据包://返回值不是接受就直接返回,数据包将被丢弃if(ret!=NF_ACCEPT){WRITE_UNLOCK(&ip_nat_lock);returnret;}如果找到了映射,NAT会将数据包的目的地址IP修改掉,然后把数据包信息返回给修改地址模块://根据NATinfo信息对数据包的相应部分进行修改returndo_bindings(ct,ctinfo,info,hooknum,pskb);4.3决定映射模块的实现决定映射模块会自动为内部主机分配其可以映射的IP地址,在将数据包发送给下一个模块之前将映射关系记录到映射表中。/*将所做的地址转换的数据结构加入到全局hash表bysource和byipsproto中,如果该地址转换是某地址转换基础上的再次转换,则用replace_in_hashes替换,反之则用place_in_hashes*/if(in_hashes){ IP_NF_ASSERT(info->bysource.conntrack); replace_in_hashes(conntrack,info);}else{ place_in_hashes(conntrack,info);}4.4修改地址模块的实现检测NAT表模块会将数据包信息传给该模块,信息中包含着是否修改数据包的源、目的地址,存放在ip_nat_info结构中。/*根据所在的hook点判断转换类型是源地址转换还是目的地址转换,为0(IP_NAT_MANIP_SRC)表示源地址转换,为1(IP_NAT_MANIP_DST)表示目的地址转换*/ enumip_nat_manip_typemaniptype=HOOK2MANIP(hooknum); /*因为地址转换会修改数据包,所以这里先初始化将其设置为“未修改”标志,后面进行数据包修改时再来重置这个标志*/ (*pskb)->nfcache|=NFC_UNKNOWN;修改地址函数:unsignedintip_nat_setup_info(structip_conntrack*conntrack,/*数据包的连接状态*/conststructip_nat_multi_range*mr,/*转换后的地址池*/unsignedinthooknum)/*hook点*/函数中进行地址转换的部分:do{ /*进行地址转换,new_tuple为转换后的地址的tuple*/if(!get_unique_tuple(&new_tuple,&orig_tp,mr,conntrack,hooknum)){ DEBUGP("ip_nat_setup_info:Can'tgetuniquefor%p.\n",conntrack); returnNF_DROP;} /*对new_tuple取反,得到经过转换后的应答方向的tuple*/ invert_tuplepr(&reply,&new_tuple); /*修改conntrack中的应答方向的replytuple,在这之前还要检查如果该replytuple已经在hash表里存在,即被其它连接占用(存在初始方向tuple不同,应答方向tuple相同的连接),则还要回头继续修改*/}while(!ip_conntrack_alter_reply(conntrack,&reply)); /*对orig_tp取反,实际上又得到了原conntrack的reply_tuple*/ invert_tuplepr(&inv_tuple,&orig_tp); /*将所作转换的相关信息保存到连接状态conntrack里,这样该连接的后续数据包就可以直接利用这些信息进行地址转换,不用重新查找nat表了*//*如果是源地址改变(SNAT)*/ if(!ip_ct_tuple_src_equal(&new_tuple,&orig_tp)){ /*Inthisdirection,asourcemanip.*/ info->manips[info->num_manips++]= ((structip_nat_info_manip) {IP_CT_DIR_ORIGINAL,hooknum, IP_NAT_MANIP_SRC,new_tuple.src}); IP_NF_ASSERT(info->num_manips<IP_NAT_MAX_MANIPS); /*在相对的hook点上必然有对应的目的地址改变(DNAT)*/ info->manips[info->num_manips++]=((structip_nat_info_manip) {IP_CT_DIR_REPLY,opposite_hook[hooknum],IP_NAT_MANIP_DST,orig_tp.src});/*opposite_hook是求当前hook点的对应hook点*/ IP_NF_ASSERT(info->num_manips<=IP_NAT_MAX_MANIPS); }/*如果是目的地址改变(DNAT)*/if(!ip_ct_tuple_dst_equal(&new_tuple,&orig_tp)){info->manips[info->num_manips++]=((structip_nat_info_manip){IP_CT_DIR_ORIGINAL,hooknum,IP_NAT_MANIP_DST,reply.src});IP_NF_ASSERT(info->num_manips<IP_NAT_MAX_MANIPS);info->manips[info->num_manips++]=((structip_nat_info_manip){IP_CT_DIR_REPLY,opposite_hook[hooknum],IP_NAT_MANIP_SRC,inv_tuple.src});IP_NF_ASSERT(info->num_manips<=IP_NAT_MAX_MANIPS);}转换后,标记一下: info->initialized|=(1<<HOOK2MANIP(hooknum));4.5转发数据模块的实现一个系统只有一个网卡的时候,要么它完成接收数据功能,要么实现发送数据功能,而完成一个数据转发,需要双网卡才能实现,所以我在设计的时候,开启两个虚拟机来模拟双网卡的服务器,一个用于接收,一个用于发送,这个思想也体现在系统测试中。具体使用的技术,还是netfilter架构的检测点NF_IP_LOCAL_OUT,在该检测点处可以注册自己的钩子函数,也可以使用它本身提供给我们的函数。4.6测试使用Fedora系统做为服务器端,本机Windows可以做为局域网内部的一个终端(也可以称为客户端),当内部终端有上网需求时,数据包通过NAT服务器后,源地址发生改变,当外界网络发送数据到内部终端时,NAT服务器会根据IP映射表找到数据包要去的地方的真正的IP地址。验证数据是通过NAT服务器到达外网的方法——抓包。可以使用抓包工具,也可以手动抓包。5结论设计主要完成了简单的基于Linux的NAT服务器,系统基本可以实现私有地址和公有地址(即合法地址的转换)。NAT服务器可以解决IP地址匮乏问题、负载均衡问题、伪IP问题、隐藏内部终端等。但是使用NAT也会带来一些负面影响,例如使得很多主机使用同一个IP地址、使internet变的脆弱、对高层协议和安全性造成了影响等等。所以在使用NAT技术的同时应该适当采用恰当的方式来避免它的弊端,在最合适的环境和需求下使用NAT,会使NAT的功能充分的被利用。

参考文献:[1]nat_百度百科[EB/OL]./view/16102.htm,2012-04-12.[2]谢志强.基于NAT技术在校园网中的应用研究[J].电脑知识与技术,2010,(8):24-27.[3]吴祖民等.Linux下网络Socket编程技术[J].通信与广播电视,2005,(2):12-16.[4]高翼飞,黄海军.一种基于linux环境下NAT技术的实现[J].电脑知识与技术,2007,(4):43-45.[5]林

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论