Linux下的简单网络管理控制系统的设计与开发设计与实现.docx
《Linux下的简单网络管理控制系统的设计与开发设计与实现.docx》由会员分享,可在线阅读,更多相关《Linux下的简单网络管理控制系统的设计与开发设计与实现.docx(26页珍藏版)》请在冰豆网上搜索。
Linux下的简单网络管理控制系统的设计与开发设计与实现
Linux下的简单网络管理控制系统的设计与开发
摘要
随着网络的逐步普及,网络的管理和控制的重要性已经越来越突出,它关系着网络的进一步发展和普及,甚至关系着网络的生存。
为了促进网络的发展,在现有的技术条件下,可以开发出成熟的网络控制系统对网络进行管理和控制。
可以通过对网络的管理和控制为本地网络和外部网络之间建立一道屏障,从而控制和管理进出网络的数据。
网络管理控制系统的核心是制定一套完整的网络控制指令集和设计控制管理的功能模块。
本系统在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服务器的管理控制。
关键词:
内核模块;数据包;netfilter
DesignandDevelopmentofSimpleInternetManagementandControllingSystemunderLinux
Abstract
WiththepermeationofInternet,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页
1引言1
1.1课题背景1
1.2国内外研究现状1
1.3课题意义1
1.4本课题研究方法1
2Linux开发环境介绍2
2.1Linux简介2
2.2Linux下的C语言开发环境2
2.3常用的网络数据控制工具介绍3
3Linux网络管理控制核心技术5
3.1SOCKET网络编程5
3.1.1Linux网络编程5
3.1.2基本套接字函数5
3.2基于TCP协议的通讯7
3.2.1TCP传输协议简介7
3.2.2控制字符的制定7
4NETFILTER-网络控制模块设计基础8
4.1netfilter介绍8
4.2netfilter中的重要返回值8
4.3netfilter在IPv4中的框架9
4.4netfilter核心模块10
4.5netfilter可以实现的基本控制功能11
5测试Linux网络管理系统的设计实现13
5.1系统设计整体框架13
5.2用SOCKET实现控制端和管理端的通讯14
5.2.1管理端的设计与实现15
5.2.2控制端的设计与实现16
5.3用netfilter设计控制功能模块18
5.3.1设计控制ICMP数据报的模块18
5.3.2用netflter设计管理控制FTP服务器的模块20
5.3.3设计控制HTTP网站访问的模块22
5.4用GCC编译生成模块23
5.5管理控制系统测试23
5.6程序设计中遇到的问题和解决方法24
5.6.1解决模块编译的环境问题24
5.6.2解决程序异常退出问题25
5.6.3解决模块自动加载问题26
结论26
参考文献27
致谢28
声明29
1引言
1.1课题背景
Linux做为当今使用最为广泛的操作系统,在各个领域都具有非常重要的用途,随着网络技术的飞速发展,网络数据管理和控制系统方面设计人才的需求不断增加。
特别是随着我国经济的不断发展,网络管理控制系统开发方面的人才的需求也越来越大。
通过这个课题可以使我们熟悉Linux下的netfilter网络数据控制过滤机制,可以使我们学会指定网络控制协议和开发网络管理控制模块的方法。
通过Linux下的简单网络管理控制系统的设计和开发,可以提高实际的编程能力,特别是网络数据通讯管理这部分的编程能力。
1.2国内外研究现状
Linux作为一种开源的操作系统,在国内外享有较高的声誉,其重要地位是其他操作系统所不可取代的。
正是由于Linux操作系统的开源性,在国内外各大研究机构对其进行了不断的开发和完善,逐步形成了今天的Linux操作系统,其功能非常强大,运行非常稳定。
国内外均成立了专门的研究机构对其进行开发和研究。
而近年来由于网络技术的兴起,Linux系统也发展为一种可以进行资源共享和交互的网络平台。
在资源共享的同时,网络的安全已经成为科研机构研究的重点,并且推出了一系列的网络管理控制系统,特别是实现对网络数据的管理和控制。
其中以网络数据管理和控制过滤器IPTABLES最为出名。
可以说就目前国内外研究的情况来看Liunx方面的网络管理控制系统的开发技术已经相当成熟,并且正在不断的进行完善。
1.3课题意义
随着网络技术的飞速发展,在越来越多的领域要用到网络控制管理。
Linux操作系统是一个开源操作系统,对网络管理控制程序的设计提供了良好的实验开发平台,同时市场对Linux下的研发人员需求也很大。
通过对Linux网络通讯管理控制系统的开发,可以提高学生对网络通讯知识的了解和实际网络编程的能力,同时通过网络管理控制模块功能的设计,可以熟悉Linux下的网络数据的过滤机制,学会运用netfilter实现对网络数据的管理和控制。
因此,该课题具有较好的实用价值。
1.4本课题研究方法
在Linux-2.4.20-8操作系统平台下使用C语言开发环境。
通过使用netfilter网络数据包管理控制机制进行网络控制模块功能的开发和编译,并且运用C语言编程开发出可以发出控制协议的管理控制平台进行相应的管理和控制模块的运行。
其次研究网络通讯中的传输协议,以及数据报的传输过程,以及一些可以控制和管理网络数据的传输端口,制定出一套网络管理控制协议,即一套完整的控制字节。
最终在Linux操作系统环境下实现完成该网络管理控制程序,并且用netfilter实现控制功能模块的设计。
2Linux开发环境介绍
2.1Linux简介
Linux是开源的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。
它能运行主要的UNIX工具软件、应用程序和网络协议。
它支持32位和64位硬件。
Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。
它主要用于基于Intelx86系列CPU的计算机上。
这个系统是由全世界各地的成千上万的程序员设计和实现的。
其目的是建立不受任何商品化软件的版权制约的、全世界都能自由使用的Unix兼容产品。
同时Linux以高效性和灵活性著称。
Linux模块化的设计结构,使得它既能在价格昂贵的工作站上运行,也能够在廉价的PC机上实现全部的Unix特性,具有多任务、多用户的能力。
Linux是在GNU公共许可权限下免费获得的,是一个符合POSIX标准的操作系统。
Linux操作系统软件包不仅包括完整的Linux操作系统,而且还包括了文本编辑器、高级语言编译器等应用软件。
它还包括带有多个窗口管理器的X-Windows图形用户界面,如同使用WindowsNT一样,允许使用窗口、图标和菜单对系统进行操作。
Linux具有:
稳定、可靠、安全的优点,并且有强大的网络功能。
在相关软件的支持下,可实现WWW、FTP、DNS、DHCP、E-mail等服务,还可作为路由器使用,利用IPCHAINS/IPTABLE网络管理工具可构建NAT及功能全面的防火墙。
2.2Linux下的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语言编写的程序基本上不作修改就能用于各种型号的计算机和各种操作系统。
2.3常用的网络数据控制工具介绍
在Linux系统中经常使用的网络管理工具是IPTABLES。
管理工具iptables是Linux2.4内核用来安装、维护、检查数据包规则的管理程序。
在Linux2.4网络管理控制体系结构中,数据处理的规则可以分为四类:
IP输入链(IPinputchain)、IP输出链(IPoutputchain)、IP转发链(IPforwardchain)、用户自定义链(userdefinedchain)。
网络数据控制管理的规则指定包的格式和目标。
当一个包进来时,内核使用输入链来决定数据包的命运。
数据包沿着输入链一条规则一条规则匹配,如果它通过了输入链的检查,内核将决定包下一步该发往何处(这一步叫路由)。
假如该数据包是送往另一台机器的,内核就将调用转发链。
数据包再沿着转发链一条规则一条规则检查,如果不匹配,就进入目标值所指定的下一条链。
这条规则链有可能是用户自己定义的规则链,或者是一个特定值:
接受(ACCEPT)、否定(DENY)、拒绝(REJECT)、伪装(MASQ)、重定向(REDIRECT)、返回(RETURN)。
基本的iptables命令
一个iptables命令基本上包含如下五个部分:
希望工作在哪个表上
希望使用该表的哪个链
进行操作(插入、添加、删除、修改)
对特定规则的目标动作
匹配数据报条件
iptables基本语法
iptables基本语法如下:
iptables-ttable-Operationchain-jtargetmatch(es)
例如希望添加一个规则,允许所有从任何地方到本地SMTP端口的连接:
iptables-tfilter-AINPUT-jACCEPT-ptcp--dportsmtp。
还有其他的对规则进行操作的命令如:
清空链表、设置链缺省策略、添加一个用户自定义的链。
iptables的一些基本的操作
-A在链尾添加一条规则
-I插入规则
-D删除规则
-R替代一条规则
-L列出规则
iptables的一些基本目标动作,适用于所有的链
ACCEPT接收该数据报
DROP丢弃该数据报
QUEUE排队该数据报到用户空间
RETURN返回到前面调用的链
Foobar用户自定义的链
iptables的一些基本匹配条件,适用于所有的链
-p指定协议(tcp/udp/icmp/…)
-s源地址(ipaddress/masklen)
-d目的地址(ipaddress/masllen)
-I数据报输入接口
-o数据报输出接口
除了基本的操作,匹配和目标还具有各种扩展。
这里只对iptables进行简单的讨论,关于iptables的详细使用,可以参考maniptables的手册,也可以参考netfilter的核心开发者PaulRussell写的PacketFilteringHOW-TO和NATHOW-TO.
3Linux网络管理控制核心技术
3.1SOCKET网络编程
3.1.1Linux网络编程
Socket(套接字)是通过标准的UNIX文件描述符和其它程序通讯的一个方法。
每一个套接字都用一个半相关描述:
{协议,本地地址、本地端口}来表示;一个完整的套接字则用一个相关描述:
{协议,本地地址、本地端口、远程地址、远程端口},每一个套接字都有一个本地的由操作系统分配的唯一的套接字号。
3.1.2基本套接字函数
函数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协议才删除该套接字。
3.2基于TCP协议的通讯
3.2.1TCP传输协议简介
在Linux网络管理控制系统的设计中,为了使系统制定的控制管理字符能够顺利的传输到主机进行相关的操作,系统采用了TCP协议为传输控制指令的载