Linux下的简单网络管理控制系统的设计方案与开发设计方案与实现_第1页
Linux下的简单网络管理控制系统的设计方案与开发设计方案与实现_第2页
Linux下的简单网络管理控制系统的设计方案与开发设计方案与实现_第3页
Linux下的简单网络管理控制系统的设计方案与开发设计方案与实现_第4页
Linux下的简单网络管理控制系统的设计方案与开发设计方案与实现_第5页
已阅读5页,还剩24页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

PAGELinux下的简洁网络管理掌握系统的设计与开发摘要随着网络的逐步普及,网络的管理和掌握的重要性已经越来越突出,它关系着网络的进一步进展和普及,甚至关系着网络的生存。为了促进网络的进展,在现有的技术条件下,可以开发出成熟的网络掌握系统对网络进行管理和掌握。可以通过对网络的管理和掌握为本地网络和外部网络之间建立一道屏障,从而掌握和管理进出网络的数据。网络管理掌握系统的核心是制定一套完整的网络掌握指令集和设计掌握管理的功能模块.本系统在Linux-2.4.20—8内核下完成网络管理掌握系统的设计,使用掌握管理命令实现对网络数据的管理。掌握和管理模块的设计使用了netfilter数据掌握过滤机制来实现对网络的管理。模块可以实现对固定端口,网页访问以及不同数据协议类型的数据进行管理和掌握.从实际应用中可以得出结论在Linux—2。4。20-8的内核下可以成功的使用netfilter网络数据掌握机制过滤和管理进出系统的网络数据。本文首先介绍网络管理掌握系统的一些基本概念以及一些在Linux下的C语言编译环境,其次介绍Linuxnetfilter掌握模块在内核中的实现,在此着重介绍了netfilter在IPv4中的结构以及在Linux2.4。x内核中实现,最后介绍了网络数据管理的策略、模块编程以及如何设计网络管理掌握的功能模块。在了解这些技术的基础之上,成功的在Linux-2.4.20-8内核下开发出一套简洁的网络管理掌握模块.这些模块通过程序发出的掌握指令进行动态的插入和卸载。这些模块分别实现了对ICMP网络数据,HTTP站点,FTP服务器的管理掌握。关键词:内核模块;数据包;netfilterDesignandDevelopmentofSimpleInternetManagementandControllingSystemunderLinuxAbstractWiththepermeationofInternet,theimportanceofInternetmanagementandcontrollingbecomesmoreprominent,ItisrelatedtothefurtherdevelopmentandpermeationeventheexistenceofInternet。TopromotethedevelopmentofInternet,itispossibletodevelopamatureInternetcontrollingsystemwhichcanbemanagedandcontrolledunderthecurrenttechnicalconditions.ItcanbuildanaturaldefensebetweeninternalandexternalnetworkthroughmanagingandcontrollingthedataofInternet。ItisthecoreofthissystemthatbuildsanoverallInternetcontrollingagreementandrealizesthemodelfunctionofcontrollingandmanagement。ThissystemrealizesthemanagementandcontrollingofInternetdatasuccessfullybydoingitsdesignwhosemodulesmainlybasedonthedatacontrollingandfilteringmechanismofNetfilter,underLinux.Themoduleshavesuccessinrealizingthedatamanagements.Frompractice,itconcludesthatdatacontrollingmechanismofNetfiltercansucceedinmanagingandfilteringthewholedataunderLinux.ThisthesisintroducessomebasicconceptsofMCSandeditionenvironmentofClanguageunderLinux,firstly。ThenitintroducedrealizationofcontrollingmoduleofLinux,NetfilterinKernel,whichhighlightthestructureofNetfilterinIPv4andrealizationofLinux。LastlyitmentionedthestrategyofMCSmoduleseditionandhowtodesignthefunctionmodulesofMCS。SoonesimplemodulesofMCSofwhichdoingdynamicinsertionandsuddenlyunloadingthroughcontrollingagreementsentbyprogramsisdesignedsuccessfullyunderLinux,followingtheseskills.ThesemodulesalsorealizethemanagementandcontrollingofICMPdata,HTTPwebsitesandFTPServers,respectively.Keywords:KernelModule;Packet;Netfilterﻩ目录论文总页数:29页TOC\o”1—3"\h\z\uHYPERLINK\l”_Toc169182447”1 引言ﻩPAGEREF_Toc169182447\h1HYPERLINK\l"_Toc169182448"1。1ﻩ课题背景ﻩPAGEREF_Toc169182448\h1HYPERLINK\l"_Toc169182449”1.2ﻩ国内外讨论现状 PAGEREF_Toc169182449\h1HYPERLINK\l"_Toc169182450"1。3ﻩ课题意义ﻩPAGEREF_Toc169182450\h1HYPERLINK\l”_Toc169182451"1。4 本课题讨论方法ﻩPAGEREF_Toc169182451\h1HYPERLINK\l”_Toc169182452"2ﻩLinux开发环境介绍ﻩPAGEREF_Toc169182452\h2HYPERLINK2.2 Linux下的C语言开发环境 PAGEREF_Toc169182454\h2HYPERLINK\l”_Toc169182455"2.3 常用的网络数据掌握工具介绍ﻩPAGEREF_Toc169182455\h3HYPERLINK\l"_Toc169182456"3ﻩLinux网络管理掌握核心技术ﻩPAGEREF_Toc169182456\h5HYPERLINK\l"_Toc169182457"3.1ﻩSOCKET网络编程ﻩPAGEREF_Toc169182457\h5HYPERLINK\l"_Toc169182458”3.1.1Linux网络编程 PAGEREF_Toc169182458\h5HYPERLINK\l"_Toc169182459"3.1.2基本套接字函数ﻩPAGEREF_Toc169182459\h5HYPERLINK\l”_Toc169182460"3.2ﻩ基于TCP协议的通讯ﻩPAGEREF_Toc169182460\h7HYPERLINK\l"_Toc169182461"3.2.1TCP传输协议简介ﻩPAGEREF_Toc169182461\h7HYPERLINK\l”_Toc169182462"3.2.2掌握字符的制定ﻩPAGEREF_Toc169182462\h7HYPERLINK\l"_Toc169182463"4ﻩNETFILTER-网络掌握模块设计基础ﻩPAGEREF_Toc169182463\h8HYPERLINK\l"_Toc169182464”4。1ﻩnetfilter介绍 182464\h8HYPERLINK\l"_Toc169182465”4.2 netfilter中的重要返回值ﻩPAGEREF_Toc169182465\h8HYPERLINK\l"_Toc169182466"4。3ﻩnetfilter在IPv4中的框架 PAGEREF_Toc169182466\h9HYPERLINK\l"_Toc169182467"4.4ﻩnetfilter核心模块ﻩPAGEREF_Toc169182467\h10HYPERLINK4.5 netfilter可以实现的基本掌握功能ﻩPAGEREF_Toc169182468\h11HYPERLINK\l”_Toc169182469"5ﻩ测试Linux网络管理系统的设计实现ﻩPAGEREF_Toc169182469\h13HYPERLINK\l"_Toc169182470"5。1ﻩ系统设计整体框架ﻩPAGEREF_Toc169182470\h13HYPERLINK\l”_Toc169182471”5。2ﻩ用SOCKET实现掌握端和管理端的通讯ﻩPAGEREF_Toc169182471\h14HYPERLINK\l”_Toc169182472"5.2.1管理端的设计与实现ﻩPAGEREF_Toc169182472\h15HYPERLINK\l"_Toc169182473"5。2。2掌握端的设计与实现ﻩPAGEREF_Toc169182473\h16HYPERLINK\l"_Toc169182474”5。3ﻩ用netfilter设计掌握功能模块 PAGEREF_Toc169182474\h18HYPERLINK\l”_Toc169182475"5.3。1设计掌握ICMP数据报的模块ﻩPAGEREF_Toc169182475\h18HYPERLINK\l"_Toc169182476"5.3.2用netflter设计管理掌握FTP服务器的模块ﻩPAGEREF_Toc169182476\h20HYPERLINK\l"_Toc169182477”5.3。3设计掌握HTTP网站访问的模块 PAGEREF_Toc169182477\h22HYPERLINK\l"_Toc169182478"5.4ﻩ用GCC编译生成模块ﻩPAGEREF_Toc169182478\h23HYPERLINK5.5ﻩ管理掌握系统测试ﻩPAGEREF_Toc169182479\h23HYPERLINK\l"_Toc169182480”5。6ﻩ程序设计中遇到的问题和解决方法ﻩPAGEREF_Toc169182480\h24HYPERLINK\l"_Toc169182481"5.6。1解决模块编译的环境问题ﻩPAGEREF_Toc169182481\h24HYPERLINK\l"_Toc169182482”5.6。2解决程序特别退出问题ﻩPAGEREF_Toc169182482\h25HYPERLINK\l”_Toc169182483"5.6.3解决模块自动加载问题 PAGEREF_Toc169182483\h26HYPERLINK\l"_Toc169182484”结论ﻩPAGEREF_Toc169182484\h26HYPERLINK\l"_Toc169182485"参考文献ﻩPAGEREF_Toc169182485\h27HYPERLINK\l"_Toc169182486"致谢 PAGEREF_Toc169182486\h28HYPERLINK声明ﻩPAGEREF_Toc169182487\h29第23页共29页引言课题背景Linux做为当今使用最为广泛的操作系统,在各个领域都具有格外重要的用途,随着网络技术的飞速进展,网络数据管理和掌握系统方面设计人才的需求不断增加。格外是随着我国经济的不断进展,网络管理掌握系统开发方面的人才的需求也越来越大。通过这个课题可以使我们熟识Linux下的netfilter网络数据掌握过滤机制,可以使我们学会指定网络掌握协议和开发网络管理掌握模块的方法.通过Linux下的简洁网络管理掌握系统的设计和开发,可以提高实际的编程能力,格外是网络数据通讯管理这部分的编程能力。国内外讨论现状Linux作为一种开源的操作系统,在国内外享有较高的声誉,其重要地位是其他操作系统所不行取代的.正是由于Linux操作系统的开源性,在国内外各大讨论机构对其进行了不断的开发和完善,逐步形成了今日的Linux操作系统,其功能格外强大,运行格外稳定.国内外均成立了专门的讨论机构对其进行开发和讨论。而近年来由于网络技术的兴起,Linux系统也进展为一种可以进行资源共享和交互的网络平台。在资源共享的同时,网络的平安已经成为科研机构讨论的重点,并且推出了一系列的网络管理掌握系统,格外是实现对网络数据的管理和掌握。其中以网络数据管理和掌握过滤器IPTABLES最为出名.可以说就目前国内外讨论的情况来看Liunx方面的网络管理掌握系统的开发技术已经相当成熟,并且正在不断的进行完善。课题意义随着网络技术的飞速进展,在越来越多的领域要用到网络掌握管理。Linux操作系统是一个开源操作系统,对网络管理掌握程序的设计供应了良好的实验开发平台,同时市场对Linux下的研发人员需求也很大.通过对Linux网络通讯管理掌握系统的开发,可以提高同学对网络通讯知识的了解和实际网络编程的能力,同时通过网络管理掌握模块功能的设计,可以熟识Linux下的网络数据的过滤机制,学会运用netfilter实现对网络数据的管理和掌握。因此,该课题具有较好的有用价值。本课题讨论方法在Linux—2。4.20-8操作系统平台下使用C语言开发环境。通过使用netfilter网络数据包管理掌握机制进行网络掌握模块功能的开发和编译,并且运用C语言编程开发出可以发出掌握协议的管理掌握平台进行相应的管理和掌握模块的运行。其次讨论网络通讯中的传输协议,以及数据报的传输过程,以及一些可以掌握和管理网络数据的传输端口,制定出一套网络管理掌握协议,即一套完整的掌握字节.最终在Linux操作系统环境下实现完成该网络管理掌握程序,并且用netfilter实现掌握功能模块的设计。Linux开发环境介绍Linux简介Linux是开源的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多HYPERLINK"http://product。it168。com/list/b/0217_1.shtml"\t"_blank"CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议.它支持32位和64位HYPERLINK"http://diy.it168.com/"\t"_blank"硬件。Linux继承了Unix以网络为核心的设计思想,是一共性能稳定的多用户网络操作系统。它主要用于基于Intelx86系列CPU的计算机上。这个系统是由全世界各地的成千上万的程序员设计和实现的。其目的是建立不受任何商品化软件的版权制约的、全世界都能自由使用的Unix兼容产品。同时Linux以高效性和灵敏性著称。Linux模块化的设计结构,使得它既能在价格昂贵的工作站上运行,也能够在廉价的HYPERLINK"http://pc.it168。com/"\t"_blank"PC机上实现全部的Unix特性,具有多任务、多用户的能力。Linux是在GNU公共许可权限下免费获得的,是一个符合POSIX标准的操作系统。Linux操作系统软件包不仅包括完整的Linux操作系统,而且还包括了文本编辑器、高级语言编译器等应用软件。它还包括带有多个窗口管理器的X—Windows图形用户界面,如同使用WindowsNT一样,允许使用窗口、图标和菜单对系统进行操作。Linux具有:稳定、牢靠、平安的优点,并且有强大的网络功能.在相关软件的支持下,可实现WWW、FTP、DNS、DHCP、E-mail等服务,还可作为HYPERLINK"http://product.it168。com/files/0409search.shtml”\t”_blank"路由器使用,利用IPCHAINS/IPTABLE网络管理工具可构建NAT及功能全面的HYPERLINK"http://product。it168.com/files/0418search。shtml"\t”_blank"防火墙。Linux下的C语言开发环境C语言是一种成功的系统描述语言,同时C语言又是一种通用的程序设计语言,在国际上广泛流行。它主要有以下一些特点:(1)语言表达能力强。C语言是面对数据结构的程序设计语言,通用性好。它可以直接处理字符、数字、地址,可以完成通常由硬件实现的算术、规律运算。它能有效地取代汇编语言来编写各种系统软件和应用软件。最明显的就是UNIX操作系统。在UNIX操作系统中除了核心内部的1000行左右用汇编语言书写之外,其余的都是用C语言描述的。C语言同样可以表达数值处理、字处理功能,所以它又是一种通用语言。(2)语言简洁、紧凑,使用灵敏,易于学习和使用。C语言共有32个关键字,9种掌握语句,程序书写形式自由,主要用小写字母,在表示上力求简洁易行,如用一对{}来代替复合语句begin、end,用赋值运算符(如+=,-=,*=等)对运算和赋值的形式进行精简。(3)数据类型丰富,具有很强的结构化掌握语句。C语言有简洁数据类型(如整型、浮点型、字符型),在此基础上产生各种构造类型(如数组、结构体、共用体等),因而C的数据类型很丰富.同时,它有各种掌握流语句,如if—else、while、for、switch、break等,功能很强,能够描述结构化的程序。(4)语言生成的代码质量高。高级语言能否用来描述系统软件,格外是象操作系统、编译程序等,除要求语言表达能力强之外,很重要的一个因素是语言生成的代码质量如何。如果代码质量低,则系统开销就大,无有用价值。试验表明,针对同一问题用C语言编写程序,其生成代码的效率仅比用汇编语言写的代码效率低10%~20%。由于用高级语言比用汇编语言描述问题编程飞快、工作量小、可读性好,易于调试、修改和移植,因此C语言就成了人们描述系统软件和应用软件比较抱负的工具。(5)语法限制不严格,程序设计自由度大.例如,对数组下标越界不作检查,由程序编写者自己保证程序正确。一般的高级语言语法检查格外严格,能检查出几乎全部的语法错误。而C语言允许程序编写者有较大的自由度,放宽了语法检查。”限制"与”灵敏"是一对冲突,限制严格,就失去灵敏性;而强调灵敏,就必定放松限制.程序编写者要仔细检查程序,保证其正确,而不要过分依靠C编译程序去查错。(6)可移植性好。用C语言编写的程序基本上不作修改就能用于各种型号的计算机和各种操作系统。常用的网络数据掌握工具介绍在Linux系统中常常使用的网络管理工具是IPTABLES。管理工具iptables是Linux2.4内核用来安装、维护、检查数据包规章的管理程序。在Linux2.4网络管理掌握体系结构中,数据处理的规章可以分为四类:IP输入链(IPinputchain)、IP输出链(IPoutputchain)、IP转发链(IPforwardchain)、用户自定义链(userdefinedchain)。网络数据掌握管理的规章指定包的格式和目标.当一个包进来时,内核使用输入链来决定数据包的命运。数据包沿着输入链一条规章一条规章匹配,如果它通过了输入链的检查,内核将决定包下一步该发往何处(这一步叫路由)。假如该数据包是送往另一台机器的,内核就将调用转发链。数据包再沿着转发链一条规章一条规章检查,如果不匹配,就进入目标值所指定的下一条链。这条规章链有可能是用户自己定义的规章链,或者是一个特定值:接受(ACCEPT)、否定(DENY)、拒绝(REJECT)、伪装(MASQ)、重定向(REDIRECT)、返回(RETURN)。=1\*GB2⑴基本的iptables命令一个iptables命令基本上包含如下五个部分:=1\*GB3①盼望工作在哪个表上=2\*GB3②盼望使用该表的哪个链=3\*GB3③进行操作(插入、添加、删除、修改)=4\*GB3④对特定规章的目标动作=5\*GB3⑤匹配数据报条件=2\*GB2⑵iptables基本语法iptables基本语法如下:iptables-ttable-Operationchain-jtargetmatch(es)例如盼望添加一个规章,允许全部从任何地方到本地SMTP端口的连接:iptables-tfilter—AINPUT-jACCEPT—ptcp--dportsmtp.还有其他的对规章进行操作的命令如:清空链表、设置链缺省策略、添加一个用户自定义的链.=3\*GB2⑶iptables的一些基本的操作-A在链尾添加一条规章-I插入规章-D删除规章—R替代一条规章-L列出规章=4\*GB2⑷iptables的一些基本目标动作,适用于全部的链ACCEPT接收该数据报DROP丢弃该数据报QUEUE排队该数据报到用户空间RETURN返回到前面调用的链Foobar用户自定义的链=5\*GB2⑸iptables的一些基本匹配条件,适用于全部的链—p指定协议(tcp/udp/icmp/…)—s源地址(ipaddress/masklen)—d目的地址(ipaddress/masllen)—I数据报输入接口-o数据报输出接口除了基本的操作,匹配和目标还具有各种扩展。这里只对iptables进行简洁的商量,关于iptables的简略使用,可以参考maniptables的手册,也可以参考netfilter的核心开发者PaulRussell写的PacketFilteringHOW-TO和NATHOW-TO。Linux网络管理掌握核心技术ﻩSOCKET网络编程Linux网络编程Socket(套接字)是通过标准的UNIX文件描述符和其它程序通讯的一个方法。每一个套接字都用一个半相关描述:{协议,本地地址、本地端口}来表示;一个完整的套接字则用一个相关描述:{协议,本地地址、本地端口、远程地址、远程端口},每一个套接字都有一个本地的由操作系统安排的唯一的套接字号。基本套接字函数函数socket():这个函数定义为intsocket(intdomain,inttype,intprotocol),参数domain指定要创建的套接字的协议族,可以是如下值:AF_UNIX//UNIX域协议族,本机的进程间通讯时使用AF_INET//Internet协议族(TCP/IP)参数type指定套接字类型,可以是如下值:SOCK_STREAM//流套接字,面对连接的和牢靠的通信类型SOCK_DGRAM//数据报套接字,非面对连接的和不行靠的通信类型SOCK_RAW//原始套接字,只对Internet协议有效,可以用来直接访问IP协议参数protocol通常设置成0,表示使用默认协议,如Internet协议族的流套接字使用TCP协议,而数据报套接字使用UDP协议。当套接字是原始套接字类型时,需要指定参数protocol,由于原始套接字对多种协议有效,如ICMP和IGMP等。Linux系统中创建一个套接字的操作主要是:在内核中创建一个套接字数据结构,然后返回一个套接字描述符标识这个套接字数据结构。这个套接字数据结构包含连接的各种信息,如对方地址、TCP状态以及发送和接收缓冲区等等,TCP协议依据这个套接字数据结构的内容来掌握这条连接.函数connect():这个函数定义为intconnect(intsockfd,structsockaddr*servaddr,intaddrlen);参数sockfd是函数socket返回的套接字描述符;参数servaddr指定远程服务器的套接字地址,包括服务器的IP地址和端口号;参数addrlen指定这个套接字地址的长度。成功时返回0,否则返回—1,并设置全局变量为以下任何一种错误类型:ETIMEOUT、ECONNREFUSED、EHOSTUNREACH或ENETUNREACH。在调用函数connect之前,客户机需要指定服务器进程的套接字地址。客户机一般不需要指定自己的套接字地址(IP地址和端口号),系统会自动从1024至5000的端口号范围内为它选择一个未用的端口号,然后以这个端口号和本机的IP地址填充这个套接字地址.客户机调用函数connect来主动建立连接。这个函数将启动TCP协议的3次握手过程。在建立连接之后或发生错误时函数返回.函数bind():这个函数将本地地址与套接字绑定在一起,其定义为:intbind(intsockfd,structsockaddr*myaddr,intaddrlen);参数sockfd是函数sockt返回的套接字描述符;参数myaddr是本地地址;参数addrlen是套接字地址结构的长度。执行成功时返回0,否则,返回—1,并设置全局变量errno为错误类型EADDRINUSER。服务器和客户机都可以调用函数bind来绑定套接字地址,但一般是服务器调用函数bind来绑定自己的公认端口号函数listen():函数listen将一个套接字转换为征听套接字,定义为:intlisten(intsockfd,intbacklog)参数sockfd指定要转换的套接字描述符;参数backlog设置恳求队列的最大长度;执行成功时返回0,否则返回-1。函数listen功能有两个:(1)将一个尚未连接的主动套接字(函数socket创建的可以用来进行主动连接但不能接受连接恳求的套接字)转换成一个被动连接套接字。执行listen之后,服务器的TCP状态由CLOSED转为LISTEN状态;(2)TCP协议将到达的连接恳求队列,函数listen的其次个参数指定这个队列的最大长度。函数accept():函数accept从征听套接字的完成队列中接收一个已经建立起来的TCP连接。如果完成连接队列为空,那么这个进程睡眠。intaccept(intsockfd,structsockaddr*addr,int*addrlen)参数sockfd指定征听套接字描述符;参数addr为指向一个Internet套接字地址结构的指针;参数addrlen为指向一个整型变量的指针。执行成功时,返回3个结果:函数返回值为一个新的套接字描述符,标识这个接收的连接;参数addr指向的结构变量中存储客户机地址;参数addrlen指向的整型变量中存储客户机地址的长度。失败时返回-1。当函数accept堵塞等待已经建立的连接时,如果进程捕获到信号,函数将以错误返回,错误类型为EINTR。对于这种错误,一般重新调用函数accept来接收连接.函数close():函数close关闭一个套接字描述符。定义如为:intclose(intsockfd);执行成功时返回0,否则返回—1。与操作文件描述符的close一样,函数close将套接字描述符的引用计数器减1,如果描述符的引用计数大于0,则表示还有进程引用这个描述符,函数close正常返回;如果为0,则启动清除套接字描述符的操作,函数close立即正常返回。调用close之后,进程将不再能够访问这个套接字,但TCP协议将连续使用这个套接字,将尚未发送的数据传递到对方,然后发送FIN数据段,执行关闭操作,始终等到这个TCP连接完全关闭之后,TCP协议才删除该套接字。基于TCP协议的通讯TCP传输协议简介在Linux网络管理掌握系统的设计中,为了使系统制定的掌握管理字符能够顺利的传输到主机进行相关的操作,系统采纳了TCP协议为传输掌握指令的载体。TCP是一套牢靠的传输协议,其采纳三次握手的方式建立连接:[1].恳求端发送一个SYN段指明客户打算连接的服务器的端口,以及初始序列号ISN。[2]。服务器发回包含服务器的初始序列号的SYN报文段作为应答.同时,将确认序号设置为客户的ISN加1以客户的SYN报文段进行确认。一个SYN将占用一个序号.[3].客户必须将确认序号设置为服务器的ISN加1以对服务器的SYN报文段进行确认。TCP这三个报文段完成连接的建立,也就是三次握手。掌握字符的制定当TCP连接建立成功后,掌握字节就包含在TCP报文的数据部分发送出去,接收端通过对TCP数据报的解析,取出数据部分的掌握字节进行相关的操作。系统制定的通过TCP协议传输的掌握字节可以完成以下网络掌握功能:=1\*GB2⑴当收到TCP报文段中的数据部分为字符‘a’时,系统编译加载全部的网络掌握模块;=2\*GB2⑵当收到TCP报文段中的数据部分为字符‘f’时,系统丢弃全部进出网络的ICMP数据包;=3\*GB2⑶当收到TCP报文段中的数据部分为字符‘i’时,系统接收全部进出网络的ICMP数据包;=4\*GB2⑷当收到TCP报文段中的数据部分为字符‘t’时,系统禁止访问FTP服务器;=5\*GB2⑸当收到TCP报文段中的数据部分为字符‘p'时,系统允许访问FTP服务器;=6\*GB2⑹当收到TCP报文段中的数据部分为字符‘c’时,系统禁止扫瞄HTTP网页;=7\*GB2⑺当收到TCP报文段中的数据部分为字符‘o'时,系统允许扫瞄HTTP网页;=8\*GB2⑻当收到TCP报文段中的数据部分为字符‘r’时,系统卸载全部功能模块。携带掌握信息的完整TCP协议报文结构图如下:图1采纳TCP协议传输掌握字节数据报TCP报文段携带掌握字符通过socket传输的流程图如下:控制字符控制字符TCP头数据部分TCP头控制数据TCP头TCP数据部分控制字符控制数据Socket建立连接图2采纳TCP协议传输掌握字节数据报NETFILTER—网络掌握模块设计基础netfilter介绍Netfilter比以前任何一版Linux内核的网络管理掌握子系统都要完善强大。Netfilter供应了一个抽象、通用化的框架,该框架定义的一个子功能的实现就是包过滤掌握子系统。Netfilter框架包含以下三部分:1.给网络协议(IPv4、IPv6等)定义一套钩子函数(IPv4定义了5个钩子函数),这些钩子函数在数据报流过协议栈的几个关键点被调用。在这几个点中,协议栈将把数据报及钩子函数标号作为参数调用netfilter框架。2.内核的任何模块可以对每种协议的一个或多个钩子进行注册,实现挂接,这样当某个数据包被传递给netfilter框架时,内核能检测是否有任何模块对该协议和钩子函数进行了注册.若注册了,则调用该模块的注册时使用的回调函数,这样这些模块就有机会检查(可能还会修改)该数据包、丢弃该数据包及指示netfilter将该数据包传入用户空间的队列。3.那些排队的数据包是被传递给用户空间的异步地进行处理.一个用户进程能检查数据包,修改数据包,甚至可以重新将该数据包通过离开内核的同一个钩子函数中注入到内核中.全部的包过滤/NAT等等都基于该框架.内核网络代码中不再有处处都是的、混乱的修改数据包的代码了。当前netfilter框架在IPv4、IPv6及Decnet网络栈中被实现netfilter中的重要返回值内核模块可以对一个或多个钩子函数进行注册挂接,并且在数据报经过这些钩子函数时被调用,从而模块可以修改这些数据报,并向netfilter返回如下值:=1\*GB2⑴NF_ACCEPT连续正常传输数据报.=2\*GB2⑵NF_DROP丢弃该数据报,不再传输。=3\*GB2⑶NF_STOLEN模块接管该数据报,不要连续传输该数据报.=4\*GB2⑷NF_QUEUE对该数据报进行排队(通常用于将数据报给用户空间的进程进行处理)。=5\*GB2⑸NF_REPEAT再次调用该钩子函数。netfilter在IPv4中的框架一个数据在通过netfilter框架时,它将经过图3所示的过程.图3netfilter框架示意图从图中可以看到netfilter框架共有五个钩子函数,分别为:=1\*GB2⑴NF_IP_PRE_ROUTING=2\*GB2⑵NF_IP_LOCAL_IN=3\*GB2⑶NF_IP_FORWARD=4\*GB2⑷NF_IP_POST_ROUTING=5\*GB2⑸NF_IP_LOCAL_OUT当数据报经过了完整性检查后,数据报就从左边进入系统,进行IP校验以后,数据报经过第一个钩子函数NF_IP_PRE_ROUTING[1]进行处理;然后就进入路由代码,其决定该数据报是需要转发还是发给本机;若该数据报是发给本机,则该数据报经过钩子函数NF_IP_LOCAL_IN[2]处理以后然后传递给上层协议;若该数据报应该被转发则它被NF_IP_FORWARD[3]处理;经过转发的数据报经过最后一个钩子函数NF_IP_POST_ROUTING[4]处理以后,再传输到网络上。本地产生的数据经过钩子函数NF_IP_LOCAL_OUT[5]处理以后,进行路由选择处理,然后经过NF_IP_POST_ROUTING[4]处理以后发送到网络上。由此可见,五个HOOK的位置,掌管了全部数据包的可能出入口,我们只要在对应的位置对数据报进行操作,就能实现对数据报的各种处理.IPv4代码中netfilter的接口。IPv4协议栈为了实现对netfilter架构的支持,在数据报经过IPv4协议栈的过程中,仔细选择了五个参考点:NF_IP_PRE_ROUTING、NF_IP_LOCAL_IN、NF_IP_FORWARD、NF_IP_POST_ROUTING、NF_IP_LOCAL_OUT,分别对应IP层五个不同的位置.在这五个参考点上,各引入了一行对NF_HOOK()宏函数的一个相应的调用。在netfilter.h定义了NF_HOOK()宏函数.对于NF_HOOK宏的定义提炼如下:#ifdefCONFIG_NETFILTER#defineNF_HOOK(pf,hook,skb,indev,outdev,okfn)(list_empty(&nf_hooks[(pf)][(hook)])?(okfn)(skb):nf_hook_slow((pf),(hook),(skb),(indev),(outdev),(okfn))#else/*!CONFIG_NETFILTER*/#defineNF_HOOK(pf,hook,skb,indev,outdev,okfn)(okfn)(skb)#endif/*CONFIG_NETFILTER*/当CONFIG_NETFILTER被定义的时候,就转去调用nf_hook_slow()函数;如果CONFIG_NETFILTER没有被定义,则从netfilter模块转回到IPv4协议栈连续往下处理。这样用户在编译kernel时可以通过定义CONFIG_NETFILTER与否来决定是否把netfilter代码编译进内核。从函数的名称来看,也可以把IPv4协议栈上的这五个参考点,形象的看成是五个钩子。当数据报在IPv4协议栈上途经这五个钩子时,就会被netfilter模块钓上来,进行处理并依据返回值来决定数据报的下一步命运,连续传输或者丢弃。netfilter核心模块=1\*GB2⑴钩子函数和参考点如果netfilter的钩子函数被调用,数据包就进入nf_hook_slow()函数的处理。此函数主要是依据nf_hooks[][]数组开头处理数据包。更精准一点来说,上文所说的IPv4协议栈上的五个参考点,并不是防火墙钩子函数,而是在此点允许放置防火墙钩子函数。在每一个参考点,都可以让netfilter放置一个或多个处理函数,来处理经过参考点的数据包,而netfilter的钩子函数则放在了nf_hooks[][]数组里面。这些钩子函数用structnf_hook_ops给予描述,其声明如下:structnf_hook_ops{structlist_headlist;nf_hookfn*hook;intpf;inthooknum;intpriority;};在使用netfilter实现管理功能的模块初始过程中,它会调用nf_register_hook()向netfilter的核心代码注册钩子函数。在这个注册的过程中,也就是将钩子函数放在参考点的的过程。钩子函数的简略位置,由nf_hooks[][]数组的下标简略说明。=2\*GB2⑵mymodules函数对于netfilter所供应的框架,这些钩子函数都将会调用mymodules函数。该函数执行完后,将返回通用的防火墙策略之一,如NF_ACCEPT等。该函数原型如下:unsignedintmymodules(structsk_buff**pskb,unsignedinthook,conststructnet_device*in,conststructnet_device*out,structipt_table*table,void*userdata)此函数的参数介绍如下:=1\*GB3①structsk_buff**pskb:传入的待处理的网络协议包。=2\*GB3②unsignedinthook:在哪个钩子点处理该数据包。=3\*GB3③conststructnet_device*in:网络包传入的网络设备名.=4\*GB3④conststructnet_device*out:网络包传出的网络设备名.=5\*GB3⑤structipt_table*table:用户定义的规章表。用户定义的规章表,经过一些处理后送到核心空间,核心空间将用一些数据结构进行标识.在netfiter框架中,一条规章分为三部分,由三个数据结构来代表:structipt_entry:主要用来匹配IP头。structip_match:额外的匹配(TCP头、MAC地址等).structip_target:除默认的动作外(如:NF_ACCEPT、NF_DROP),还可以增加新的动作(如:NF_REJECT)。mymodules()函数就是依据规章表中存储的一条又一条的规章来处理数据包。但并不是全部的规章都一一来匹配数据包,数据包只与相应的参考点的规章相匹配。这个机制,就为每个规章表实现了多个规章链,而每个规章链上又有多个规章。=3\*GB2⑶匹配和目标匹配(match)是iptables命令的可选部分,它用于匹配数据包的源地址/源端口、目的地址/目的端口、协议等。匹配分为两大类:通用匹配和特定于协议的匹配。目目标是由规章指定的操作,对与那些规章匹配的数据包执行这些操作。除了默认的目标之外,还增加新的目标选项.netfilter可以实现的基本掌握功能=1\*GB3①.包过滤包过滤的掌握模块不会对数据包进行修改,只对数据包进行过滤.它通过钩子函数NF_IP_LOCAL_IN、NF_IP_FORWARD及NF_IP_LOCAL_OUT接入netfilter框架。对于任何一个数据报只有一个地方对其进行过滤。Iptables相对ipchains是一个巨大的改进,由于在ipchains中一个被转发的数据报会遍历三条链.包过滤框架示意图如下:图4掌握管理包过滤模块框架示意图=2\*GB3②.NAT网络地址转换通过NF_IP_PRE_ROUTING、NF_IP_POST_ROUTING及NF_IP_LOCAL_OUT三个钩子函数接入netfilter框架。网络地址转换只对新连接的第一个数据包进行转换,随后的数据包将依据第一个数据包的结果进行同样的转换处理,其分为源地址转换和目的地址转换.NF_IP_PRE_ROUTING实现对转发的数据包的源地址进行地址转换,NF_IP_POST_ROUTING对转发的数据包的目的地址进行地址转换,对于本地数据报的目的地址的转换则由NF_IP_LOCAL_OUT来实现。地址转换框架图如下:图5地址转换框架示意图=3\*GB3③.数据包处理通过钩子函数NF_IP_PRE_ROUTING和NF_IP_LOCAL_OUT接入netfilter框架。包处理可以实现对数据报的修改或给数据报附上一些带外数据.在框架中的钩子点一和钩子点五进行处理,即在下图中的MANGLE处进行处理。ﻩ包过滤框架示意图如下:图6包处理框架示意图=4\*GB3④.连线跟踪连线跟踪(ConnectionTracking)是包过滤、地址转换的基础,但其又作为一个独立的模块在运行,有了连线跟踪,动态包过滤及地址转换才能得以实现。连线跟踪的工作原理是:检测第一个有效连接的状态,并依据这些信息决定网络数据包是否能够通过netfilter功能模块.连线跟踪在netfilter框架中NF_IP_PRE_ROUTING、NF_IP_LOCAL_IN、NF_IP_POST_ROUTING、NF_IP_LOCAL_OUT的四个地方被采纳,连线跟踪的框架示意图如下:图7连线跟踪框架示意图测试Linux网络管理系统的设计实现系统设计整体框架Linux网络掌握管理框架主要分为两个部分:管理部分,掌握部分。首先管理部分通过在本机发送相应的管理命令即管理掌握口令对系统进行管理和掌握,这个部分拥有一套完整的掌握指令,掌握指令是通过TCP数据报发送出去的.掌握部分又分为三部分:接受掌握字节;解释字节掌握模块;掌握模块的加载执行;此系统具有一些比较常用的网络管理掌握功能。可以实现的管理掌握功能包括对网络上ICMP数据包的收发,FTP服务器资源通讯,HTTP网页的访问。Linux网络管理掌握系统的结构图8:管理端管理端控制端ICMP的管理控制FTP的管理控制HTTP的管理控制ICMP数据报FTP服务器HTTP网页访问通过TCP通讯图8网络管理系统结构图用SOCKET实现掌握端和管理端的通讯整个管理掌握系统的框架是用socket套接字编程开发出来的,主要是通过TCP建立起管理端和掌握端的通讯.管理端通过TCP建立通讯发送掌握字节,而掌握端在收到TCP数据报后依据接收到的掌握指令去操作掌握模块执行相关的网络掌握。在本系统的设计中主要是掌握进出网络的ICMP数据报,FTP服务器的访问掌握,HTTP网页的访问掌握。在设计过程中网络套接字的端口均是采纳的TCP4112端口,并且为了便利对设计效果的检测,掌握端的IP地址设为本机的IP地址:222.18。189。199.Socket通讯的简略流程为:通讯建立的简略过程为:1.管理端输入掌握端的IP地址,向掌握端恳求建立连接。然后掌握端开头监听.管理端把掌握字符写进sendbuff[]这个数组里面,通过send()函数发送出去.2.掌握端通过recv()函数接受管理端发来的掌握字符,并且把字符写进recvbuff[]里面。3.掌握端再依据相应的掌握字符去执行简略操作。4.通讯完后关闭套接字:close()Socket通讯的简略流程图为:ﻫ图9socket通讯流程图管理端的设计与实现管理端一个用户管理界面,管理端通过发送连接恳求与掌握端建立连接,从而可以通过TCP发送掌握字节去掌握相关的操作。其核心的代码和注释为://建立一个基本的套接字,使用的是INET协议族,TCP套接字,0表示基本套接字sockfd=socket(AF_INET,SOCK_STREAM,0);//通过sizeof取地址长度,并且调用bzero把地址结构清零bzero(&serveraddr,sizeof(serveraddr));//表示地址结构类型是INET的地址结构类型serveraddr.sin_family=AF_INET;//使用的端口是4114端口,并且用htons转化为网络字节序serveraddr.sin_port=htons(4114);inet_pton(AF_INET,argv[1],&serveraddr.sin_addr);//使用connect函数连接sockfd套接字connect(sockfd,(structsockaddr*)&serveraddr,sizeof(serveraddr));//用recv接受管理界面中recvbuff发过来的数据recv(sockfd,recvbuff,sizeof(recvbuff),0);scanf(”%c",&w);while(w!=’q'){//把w的值写进sebuff数组的一个空间里面通过send发送给掌握界面sebuff[0]=w;send(sockfd,sebuff,1,0);scanf("%c",&w);switch(w)…….……。}//关闭套接字Close();掌握端的设计与实现掌握端为一个后台执行程序,掌握端在和管理端建立连接后,接收来自掌握端的TCP数据报,并且依据数据报中的掌握字节掌握相应的功能模块执行简略的网络掌握操作。其核心的代码和注释为://定义一个接受缓冲区数组charresbuff[5];//定义两个套接字,一个为监听套接字,一个为连接套接字intlistensock,connsock;//定义一个sockaddr_in类型的变量serveraddr.structsockaddr_inserveraddr;//定义一个buff存储hello.constcharbuff[]="hello\r\n";//初始化listensock套接字listensock=socket(AF_INET,SOCK_STREAM,0);//地址结构清零bzero(&serveraddr,sizeof(serveraddr));//使用INET结构的地址的数据结构serveraddr.sin_family=AF_INET;//允许任意地址进行连接serveraddr.sin_addr。s_addr=htonl(INADDR_ANY);//连接的端口号为4114serveraddr。sin_port=htons(4114);//绑定套接字bind(listensock,(structsockaddr*)&serveraddr,sizeof(serveraddr));//开头监听,允许接入的用户个数为4个listen(listensock,4);connsock=accept(listensock,(structsockaddr*)NULL,NULL);//发送数据send(connsock,buff,sizeof(buff),0);//接受掌握字节recv(connsock,resbuff,1,0);printf("%c\n”,resbuff[0]);//以下就是执行掌握命令while(resbuff[0]!='q'){switch(resbuff[0]){case'a’:printf("startthecontrolmodule。\n”);//system函数中的命令为模块编译命令system("gcc-O2-g-Wall-DMODULE-D__KERNEL__—I/usr/src/linux—2.4/include-cnrgcc.c”);system("gcc-O2-g—Wall—DMODULE-D_KERNEL_-I/usr/src/linux-2。4/include-clgcc.c");system("gcc-O2-g-Wall-DMODULE—D__KERNEL__-I/usr/src/linux-2.4/include—cnrgccf。c");case'c’:printf("closethe80sourceport.\n");system(”insmod。/nrgcc.o>log1");break;case'o’:printf(”openthe80sourceport.\n");system("rmmodnrgcc〉log3");break;….//关闭套接字close(connsock);close(listensock);用netfilter设计掌握功能模块设计掌握ICMP数据报的模块在linux-2.4下面可以使用netfilter实现过滤数据报的功能模块,因此在掌握管理ICMP数据报的模块中也同样可以使用netfilter。核心的的模块代码如下://依据内核模块编译#ifndef__KERNEL__#define__KERNEL__#endif//依据设备驱动程序模块编译#ifndefMODULE#defineMODULE#endifﻩ模块处理函数test_firewall,其中hooknum是核心指定的五个钩子点之一,其次个参数它是一个指向指针(这个指针指向sk_buff一类型的结构体)的指针,它是网络堆栈用来描述数据包的结构体。这个结构体定义在linux/skbuff。h中,由于这个结构体的定义很大,这里只着重于它当中更有趣的一些域。sk_buff结构体中最有用的域就是其中的三个联合了,这三个联合描述了传输层的头信息(例如UDP,TCP,ICMP,SPX),网络层的头信息(例如ipv4/6,IPX,RAW)和链路层的头信息(Ethernet或者RAW)。三个联合相应的名字分别为:h,nh和mac。依据特定数据包使用的不同协议,这些联合包含了不同的结构体。net_devices结构体是Linux内核用来描述各种网络接口的。第一个结构体,in代表了数据包将要到达的接口,out就代表了数据包将要离开的接口最后一个参数是一个名为okfn的指向函数的指针,这个函数有一个sk_buff的结构体作为参数,返回一个整型值。staticunsignedinttest_firewall(unsignedinthooknum,structsk_buff**skb,conststructnet_device*in,conststructnet_device*out,int(*okfn)(structsk_buff*)){//定义了一个iphdr的结构体指针*iph structiphdr*iph; //取出IP头,并且检查协议类型是不是ICMP数据报类型 iph=(*skb)->nh.iph; if(iph—〉protocol==IPPROTO_ICMP) {printk("\nDROPaICMPPacket”);//如果是ICMP的话直接使用NF_DROP丢弃数据报 ﻩreturnNF_DROP;}//如果是TCP数据报的话,允许数据报通过if(iph->protocol==IPPROTO_TCP){printk("\nPermitavalidaccess”);returnNF_ACCEPT;}}//其他条件的数据报都不匹配设置的掌握管理规章因此允许通过接受

温馨提示

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

最新文档

评论

0/150

提交评论