毕业设计(论文)-Linux下的简单网络管理控制系统的设计与开发设计与实现.doc

上传人:西安人 文档编号:3281348 上传时间:2019-08-07 格式:DOC 页数:27 大小:341.53KB
返回 下载 相关 举报
毕业设计(论文)-Linux下的简单网络管理控制系统的设计与开发设计与实现.doc_第1页
第1页 / 共27页
毕业设计(论文)-Linux下的简单网络管理控制系统的设计与开发设计与实现.doc_第2页
第2页 / 共27页
毕业设计(论文)-Linux下的简单网络管理控制系统的设计与开发设计与实现.doc_第3页
第3页 / 共27页
毕业设计(论文)-Linux下的简单网络管理控制系统的设计与开发设计与实现.doc_第4页
第4页 / 共27页
毕业设计(论文)-Linux下的简单网络管理控制系统的设计与开发设计与实现.doc_第5页
第5页 / 共27页
点击查看更多>>
资源描述

《毕业设计(论文)-Linux下的简单网络管理控制系统的设计与开发设计与实现.doc》由会员分享,可在线阅读,更多相关《毕业设计(论文)-Linux下的简单网络管理控制系统的设计与开发设计与实现.doc(27页珍藏版)》请在三一文库上搜索。

1、Linux下的简单网络管理控制系统的设计与开发摘 要随着网络的逐步普及,网络的管理和控制的重要性已经越来越突出,它关系着网络的进一步发展和普及,甚至关系着网络的生存。为了促进网络的发展,在现有的技术条件下,可以开发出成熟的网络控制系统对网络进行管理和控制。可以通过对网络的管理和控制为本地网络和外部网络之间建立一道屏障,从而控制和管理进出网络的数据。网络管理控制系统的核心是制定一套完整的网络控制指令集和设计控制管理的功能模块。本系统在Linux-2.4.20-8内核下完成网络管理控制系统的设计,使用控制管理命令实现对网络数据的管理。控制和管理模块的设计使用了netfilter数据控制过滤机制来实

2、现对网络的管理。模块可以实现对固定端口,网页访问以及不同数据协议类型的数据进行管理和控制。从实际应用中可以得出结论在Linux-2.4.20-8的内核下可以成功的使用netfilter网络数据控制机制过滤和管理进出系统的网络数据。本文首先介绍网络管理控制系统的一些基本概念以及一些在Linux下的C语言编译环境,其次介绍Linux netfilter控制模块在内核中的实现,在此着重介绍了netfilter在IPv4中的结构以及在Linux 2.4.x内核中实现,最后介绍了网络数据管理的策略、模块编程以及如何设计网络管理控制的功能模块。在了解这些技术的基础之上,成功的在Linux-2.4.20-8

3、内核下开发出一套简单的网络管理控制模块。这些模块通过程序发出的控制指令进行动态的插入和卸载。这些模块分别实现了对ICMP网络数据,HTTP站点,FTP服务器的管理控制。关键词:内核模块;数据包;netfilterDesign and Development of Simple Internet Management and Controlling System under LinuxAbstractWith the permeation of Internet,the importance of Internet management and controlling becomes more

4、prominent, It is related to the further development and permeation even the existence of Internet. To promote the development of Internet, it is possible to develop a mature Internet controlling system which can be managed and controlled under the current technical conditions. It can build a natural

5、 defense between internal and external network through managing and controlling the data of Internet. It is the core of this system that builds an overall Internet controlling agreement and realizes the model function of controlling and management. This system realizes the management and controlling

6、 of Internet data successfully by doing its design whose modules mainly based on the data controlling and filtering mechanism of Netfilter, under Linux. The modules have success in realizing the data managements. From practice, it concludes that data controlling mechanism of Netfilter can succeed in

7、 managing and filtering the whole data under Linux. This thesis introduces some basic concepts of MCS and edition environment of C language under Linux, firstly. Then it introduced realization of controlling module of Linux, Netfilter in Kernel, which highlight the structure of Netfilter in IPv4 and

8、 realization of Linux. Lastly it mentioned the strategy of MCS modules edition and how to design the function modules of MCS. So one simple modules of MCS of which doing dynamic insertion and suddenly unloading through controlling agreement sent by programs is designed successfully under Linux, foll

9、owing these skills. These modules also realize the management and controlling of ICMP data, HTTP websites and FTP Servers, respectively.Key words: Kernel Module;Packet;Netfilter目 录论文总页数:29页1引言11.1课题背景11.2国内外研究现状11.3课题意义11.4本课题研究方法12Linux开发环境介绍22.1Linux简介22.2Linux下的C语言开发环境22.3常用的网络数据控制工具介绍33Linux网络管理

10、控制核心技术53.1SOCKET网络编程53.1.1 Linux网络编程53.1.2基本套接字函数53.2基于TCP协议的通讯73.2.1 TCP传输协议简介73.2.2控制字符的制定74NETFILTER-网络控制模块设计基础84.1netfilter介绍84.2netfilter中的重要返回值84.3netfilter在IPv4中的框架94.4netfilter核心模块104.5netfilter可以实现的基本控制功能115测试Linux网络管理系统的设计实现135.1系统设计整体框架135.2用SOCKET实现控制端和管理端的通讯145.2.1管理端的设计与实现155.2.2控制端的设计

11、与实现165.3用netfilter设计控制功能模块185.3.1设计控制ICMP数据报的模块185.3.2用netflter设计管理控制FTP服务器的模块205.3.3设计控制HTTP网站访问的模块225.4用GCC编译生成模块235.5管理控制系统测试235.6程序设计中遇到的问题和解决方法245.6.1解决模块编译的环境问题245.6.2解决程序异常退出问题255.6.3解决模块自动加载问题26结 论26参考文献27致 谢28声 明291 引言1.1 课题背景Linux做为当今使用最为广泛的操作系统,在各个领域都具有非常重要的用途,随着网络技术的飞速发展,网络数据管理和控制系统方面设计人

12、才的需求不断增加。特别是随着我国经济的不断发展,网络管理控制系统开发方面的人才的需求也越来越大。通过这个课题可以使我们熟悉Linux下的netfilter网络数据控制过滤机制,可以使我们学会指定网络控制协议和开发网络管理控制模块的方法。通过Linux下的简单网络管理控制系统的设计和开发,可以提高实际的编程能力,特别是网络数据通讯管理这部分的编程能力。1.2 国内外研究现状Linux作为一种开源的操作系统,在国内外享有较高的声誉,其重要地位是其他操作系统所不可取代的。正是由于Linux操作系统的开源性,在国内外各大研究机构对其进行了不断的开发和完善,逐步形成了今天的Linux操作系统,其功能非常

13、强大,运行非常稳定。国内外均成立了专门的研究机构对其进行开发和研究。而近年来由于网络技术的兴起,Linux系统也发展为一种可以进行资源共享和交互的网络平台。在资源共享的同时,网络的安全已经成为科研机构研究的重点,并且推出了一系列的网络管理控制系统,特别是实现对网络数据的管理和控制。其中以网络数据管理和控制过滤器IPTABLES最为出名。可以说就目前国内外研究的情况来看Liunx方面的网络管理控制系统的开发技术已经相当成熟,并且正在不断的进行完善。1.3 课题意义随着网络技术的飞速发展,在越来越多的领域要用到网络控制管理。Linux操作系统是一个开源操作系统,对网络管理控制程序的设计提供了良好的

14、实验开发平台,同时市场对Linux下的研发人员需求也很大。通过对Linux网络通讯管理控制系统的开发,可以提高学生对网络通讯知识的了解和实际网络编程的能力,同时通过网络管理控制模块功能的设计,可以熟悉Linux下的网络数据的过滤机制,学会运用netfilter实现对网络数据的管理和控制。因此,该课题具有较好的实用价值。1.4 本课题研究方法在Linux-2.4.20-8操作系统平台下使用C语言开发环境。通过使用netfilter网络数据包管理控制机制进行网络控制模块功能的开发和编译,并且运用C语言编程开发出可以发出控制协议的管理控制平台进行相应的管理和控制模块的运行。其次研究网络通讯中的传输协

15、议,以及数据报的传输过程,以及一些可以控制和管理网络数据的传输端口,制定出一套网络管理控制协议,即一套完整的控制字节。最终在Linux操作系统环境下实现完成该网络管理控制程序,并且用netfilter实现控制功能模块的设计。2 Linux开发环境介绍2.1 Linux简介Linux是开源的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。它主要用于基于Intel x86系列CPU的计算

16、机上。这个系统是由全世界各地的成千上万的程序员设计和实现的。其目的是建立不受任何商品化软件的版权制约的、全世界都能自由使用的Unix兼容产品。同时Linux以高效性和灵活性著称。Linux模块化的设计结构,使得它既能在价格昂贵的工作站上运行,也能够在廉价的PC机上实现全部的Unix特性,具有多任务、多用户的能力。Linux是在GNU公共许可权限下免费获得的,是一个符合POSIX标准的操作系统。Linux操作系统软件包不仅包括完整的Linux操作系统,而且还包括了文本编辑器、高级语言编译器等应用软件。它还包括带有多个窗口管理器的X-Windows图形用户界面,如同使用Windows NT一样,允

17、许使用窗口、图标和菜单对系统进行操作。Linux具有:稳定、可靠、安全的优点,并且有强大的网络功能。在相关软件的支持下,可实现WWW、FTP、DNS、DHCP、E-mail等服务,还可作为路由器使用,利用IPCHAINS/IPTABLE网络管理工具可构建NAT及功能全面的防火墙。2.2 Linux下的C语言开发环境C语言是一种成功的系统描述语言,同时C语言又是一种通用的程序设计语言,在国际上广泛流行。它主要有以下一些特点:(1)语言表达能力强。C语言是面向数据结构的程序设计语言,通用性好。它可以直接处理字符、数字、地址,可以完成通常由硬件实现的算术、逻辑运算。它能有效地取代汇编语言来编写各种系

18、统软件和应用软件。最明显的就是UNIX操作系统。在UNIX操作系统中除了核心内部的1000行左右用汇编语言书写之外,其余的都是用C语言描述的。C语言同样可以表达数值处理、字处理功能,所以它又是一种通用语言。(2)语言简洁、紧凑,使用灵活,易于学习和使用。C语言共有32个关键字,9种控制语句,程序书写形式自由,主要用小写字母,在表示上力求简洁易行,如用一对来代替复合语句begin、end,用赋值运算符(如+=,-=,*=等)对运算和赋值的形式进行精简。(3)数据类型丰富,具有很强的结构化控制语句。C语言有简单数据类型(如整型、浮点型、字符型),在此基础上产生各种构造类型(如数组、结构体、共用体等

19、),因而C的数据类型很丰富。同时,它有各种控制流语句,如if-else、while、for、switch、break等,功能很强,能够描述结构化的程序。(4)语言生成的代码质量高。高级语言能否用来描述系统软件,特别是象操作系统、编译程序等,除要求语言表达能力强之外,很重要的一个因素是语言生成的代码质量如何。如果代码质量低,则系统开销就大,无实用价值。试验表明,针对同一问题用C语言编写程序,其生成代码的效率仅比用汇编语言写的代码效率低10%20%。由于用高级语言比用汇编语言描述问题编程迅速、工作量小、可读性好,易于调试、修改和移植,因此C 语言就成了人们描述系统软件和应用软件比较理想的工具。(5

20、)语法限制不严格,程序设计自由度大。例如,对数组下标越界不作检查,由程序编写者自己保证程序正确。一般的高级语言语法检查非常严格,能检查出几乎所有的语法错误。而C语言允许程序编写者有较大的自由度,放宽了语法检查。限制与灵活是一对矛盾,限制严格,就失去灵活性;而强调灵活,就必然放松限制。程序编写者要仔细检查程序,保证其正确,而不要过分依赖C编译程序去查错。(6)可移植性好。用C语言编写的程序基本上不作修改就能用于各种型号的计算机和各种操作系统。2.3 常用的网络数据控制工具介绍在Linux系统中经常使用的网络管理工具是IPTABLES。管理工具iptables是Linux 2.4内核用来安装、维护

21、、检查数据包规则的管理程序。在Linux 2.4网络管理控制体系结构中,数据处理的规则可以分为四类:IP输入链(IP input chain)、IP输出链(IP output chain)、IP转发链(IP forward chain)、用户自定义链(user defined chain)。网络数据控制管理的规则指定包的格式和目标。当一个包进来时,内核使用输入链来决定数据包的命运。数据包沿着输入链一条规则一条规则匹配,如果它通过了输入链的检查,内核将决定包下一步该发往何处(这一步叫路由)。假如该数据包是送往另一台机器的,内核就将调用转发链。数据包再沿着转发链一条规则一条规则检查,如果不匹配,就

22、进入目标值所指定的下一条链。这条规则链有可能是用户自己定义的规则链,或者是一个特定值:接受(ACCEPT)、否定(DENY)、拒绝(REJECT)、伪装(MASQ)、重定向(REDIRECT)、返回(RETURN)。 基本的iptables命令一个iptables命令基本上包含如下五个部分: 希望工作在哪个表上 希望使用该表的哪个链 进行操作(插入、添加、删除、修改) 对特定规则的目标动作 匹配数据报条件 iptables基本语法iptables基本语法如下:iptables -t table -Operation chain -j target match(es)例如希望添加一个规则,允许所

23、有从任何地方到本地SMTP端口的连接:iptables -t filter -A INPUT -j ACCEPT -p tcp -dport smtp。还有其他的对规则进行操作的命令如:清空链表、设置链缺省策略、添加一个用户自定义的链。 iptables的一些基本的操作-A 在链尾添加一条规则-I 插入规则-D 删除规则-R 替代一条规则-L 列出规则 iptables的一些基本目标动作,适用于所有的链ACCEPT 接收该数据报DROP 丢弃该数据报QUEUE 排队该数据报到用户空间RETURN 返回到前面调用的链Foobar 用户自定义的链 iptables的一些基本匹配条件, 适用于所有的

24、链-p 指定协议(tcp/udp/icmp/)-s 源地址(ip address/masklen)-d 目的地址(ip address/masllen)-I 数据报输入接口-o 数据报输出接口除了基本的操作,匹配和目标还具有各种扩展。这里只对iptables进行简单的讨论,关于iptables的详细使用,可以参考man iptables的手册,也可以参考netfilter的核心开发者Paul Russell写的Packet Filtering HOW-TO 和NAT HOW-TO.3 Linux网络管理控制核心技术3.1 SOCKET网络编程3.1.1 Linux网络编程Socket(套接字)

25、是通过标准的UNIX文件描述符和其它程序通讯的一个方法。每一个套接字都用一个半相关描述:协议,本地地址、本地端口来表示;一个完整的套接字则用一个相关描述:协议,本地地址、本地端口、远程地址、远程端口,每一个套接字都有一个本地的由操作系统分配的唯一的套接字号。3.1.2 基本套接字函数函数socket():这个函数定义为int socket(int domain,int type,int protocol),参数domain指定要创建的套接字的协议族,可以是如下值:AF_UNIX /UNIX域协议族,本机的进程间通讯时使用AF_INET /Internet协议族(TCP/IP)参数type指定套

26、接字类型,可以是如下值:SOCK_STREAM /流套接字,面向连接的和可靠的通信类型SOCK_DGRAM /数据报套接字,非面向连接的和不可靠的通信类型SOCK_RAW /原始套接字,只对Internet协议有效,可以用来直接访问IP协议参数protocol通常设置成0,表示使用默认协议,如Internet协议族的流套接字使用TCP协议,而数据报套接字使用UDP协议。当套接字是原始套接字类型时,需要指定参数protocol,因为原始套接字对多种协议有效,如ICMP和IGMP等。Linux系统中创建一个套接字的操作主要是:在内核中创建一个套接字数据结构,然后返回一个套接字描述符标识这个套接字数

27、据结构。这个套接字数据结构包含连接的各种信息,如对方地址、TCP状态以及发送和接收缓冲区等等,TCP协议根据这个套接字数据结构的内容来控制这条连接。函数connect():这个函数定义为int connect(int sockfd,struct sockaddr * servaddr,int addrlen);参数sockfd是函数socket返回的套接字描述符;参数servaddr指定远程服务器的套接字地址,包括服务器的IP地址和端口号;参数addrlen指定这个套接字地址的长度。成功时返回0,否则返回-1,并设置全局变量为以下任何一种错误类型:ETIMEOUT、ECONNREFUSED、E

28、HOSTUNREACH或ENETUNREACH。在调用函数connect之前,客户机需要指定服务器进程的套接字地址。客户机一般不需要指定自己的套接字地址(IP地址和端口号),系统会自动从1024至5000的端口号范围内为它选择一个未用的端口号,然后以这个端口号和本机的IP地址填充这个套接字地址。客户机调用函数connect来主动建立连接。这个函数将启动TCP协议的3次握手过程。在建立连接之后或发生错误时函数返回。函数bind():这个函数将本地地址与套接字绑定在一起,其定义为:int bind(int sockfd,struct sockaddr * myaddr,int addrlen);参

29、数sockfd是函数sockt返回的套接字描述符;参数myaddr是本地地址;参数addrlen是套接字地址结构的长度。执行成功时返回0,否则,返回-1,并设置全局变量errno为错误类型EADDRINUSER。服务器和客户机都可以调用函数bind来绑定套接字地址,但一般是服务器调用函数bind来绑定自己的公认端口号函数listen():函数listen将一个套接字转换为征听套接字,定义为:int listen(int sockfd,int backlog)参数sockfd指定要转换的套接字描述符;参数backlog设置请求队列的最大长度;执行成功时返回0, 否则返回-1。函数listen功能

30、有两个:(1)将一个尚未连接的主动套接字(函数socket创建的可以用来进行主动连接但不能接受连接请求的套接字)转换成一个被动连接套接字。执行listen之后,服务器的TCP状态由CLOSED转为LISTEN状态;(2)TCP协议将到达的连接请求队列,函数listen的第二个参数指定这个队列的最大长度。函数accept():函数accept从征听套接字的完成队列中接收一个已经建立起来的TCP连接。如果完成连接队列为空,那么这个进程睡眠。int accept(int sockfd,struct sockaddr * addr,int * addrlen)参数sockfd指定征听套接字描述符;参数

31、addr为指向一个Internet套接字地址结构的指针;参数addrlen为指向一个整型变量的指针。执行成功时,返回3个结果:函数返回值为一个新的套接字描述符,标识这个接收的连接;参数addr指向的结构变量中存储客户机地址;参数addrlen指向的整型变量中存储客户机地址的长度。失败时返回-1。当函数accept阻塞等待已经建立的连接时,如果进程捕获到信号,函数将以错误返回,错误类型为EINTR。对于这种错误,一般重新调用函数accept来接收连接。函数close():函数close关闭一个套接字描述符。定义如为:int close(int sockfd);执行成功时返回0,否则返回-1。与操

32、作文件描述符的close一样,函数close将套接字描述符的引用计数器减1,如果描述符的引用计数大于0,则表示还有进程引用这个描述符,函数close正常返回;如果为0,则启动清除套接字描述符的操作,函数close立即正常返回。调用close之后,进程将不再能够访问这个套接字,但TCP协议将继续使用这个套接字,将尚未发送的数据传递到对方,然后发送FIN数据段,执行关闭操作,一直等到这个TCP连接完全关闭之后,TCP协议才删除该套接字。3.2 基于TCP协议的通讯3.2.1 TCP传输协议简介在Linux网络管理控制系统的设计中,为了使系统制定的控制管理字符能够顺利的传输到主机进行相关的操作,系统

33、采用了TCP协议为传输控制指令的载体。TCP是一套可靠的传输协议,其采用三次握手的方式建立连接:1.请求端发送一个SYN段指明客户打算连接的服务器的端口,以及初始序列号ISN。2.服务器发回包含服务器的初始序列号的SYN报文段作为应答。同时,将确认序号设置为客户的ISN加1以客户的SYN报文段进行确认。一个SYN将占用一个序号。3.客户必须将确认序号设置为服务器的ISN加1以对服务器的SYN报文段进行确认。TCP这三个报文段完成连接的建立,也就是三次握手。3.2.2 控制字符的制定当TCP连接建立成功后,控制字节就包含在TCP报文的数据部分发送出去,接收端通过对TCP数据报的解析,取出数据部分

34、的控制字节进行相关的操作。系统制定的通过TCP协议传输的控制字节可以完成以下网络控制功能:当收到TCP报文段中的数据部分为字符a时,系统编译加载所有的网络控制模块;当收到TCP报文段中的数据部分为字符f时,系统丢弃所有进出网络的ICMP数据包;当收到TCP报文段中的数据部分为字符i时,系统接收所有进出网络的ICMP数据包;当收到TCP报文段中的数据部分为字符t时,系统禁止访问FTP服务器;当收到TCP报文段中的数据部分为字符p时,系统允许访问FTP服务器;当收到TCP报文段中的数据部分为字符c时,系统禁止浏览HTTP网页;当收到TCP报文段中的数据部分为字符o时,系统允许浏览HTTP网页;当收

35、到TCP报文段中的数据部分为字符r时,系统卸载所有功能模块。携带控制信息的完整TCP协议报文结构图如下:图1 采用TCP协议传输控制字节数据报TCP报文段携带控制字符通过socket传输的流程图如下:控制字符TCP头 数据部分TCP头 控制数据TCP 头TCP 数据部分控制字符控制数据Socket建立连接图2 采用TCP协议传输控制字节数据报4 NETFILTER-网络控制模块设计基础4.1 netfilter介绍Netfilter比以前任何一版Linux内核的网络管理控制子系统都要完善强大。Netfilter提供了一个抽象、通用化的框架,该框架定义的一个子功能的实现就是包过滤控制子系统。Ne

36、tfilter框架包含以下三部分:1.给网络协议(IPv4、IPv6等)定义一套钩子函数(IPv4定义了5个钩子函数),这些钩子函数在数据报流过协议栈的几个关键点被调用。在这几个点中,协议栈将把数据报及钩子函数标号作为参数调用netfilter框架。2.内核的任何模块可以对每种协议的一个或多个钩子进行注册,实现挂接,这样当某个数据包被传递给netfilter框架时,内核能检测是否有任何模块对该协议和钩子函数进行了注册。若注册了,则调用该模块的注册时使用的回调函数,这样这些模块就有机会检查(可能还会修改)该数据包、丢弃该数据包及指示netfilter将该数据包传入用户空间的队列。3.那些排队的数

37、据包是被传递给用户空间的异步地进行处理。一个用户进程能检查数据包,修改数据包,甚至可以重新将该数据包通过离开内核的同一个钩子函数中注入到内核中。 所有的包过滤/NAT等等都基于该框架。内核网络代码中不再有到处都是的、混乱的修改数据包的代码了。当前netfilter框架在IPv4、IPv6及Decnet网络栈中被实现4.2 netfilter中的重要返回值内核模块可以对一个或多个钩子函数进行注册挂接,并且在数据报经过这些钩子函数时被调用,从而模块可以修改这些数据报,并向netfilter返回如下值: NF_ACCEPT 继续正常传输数据报。 NF_DROP丢弃该数据报,不再传输。 NF_STOL

38、EN 模块接管该数据报,不要继续传输该数据报。 NF_QUEUE对该数据报进行排队(通常用于将数据报给用户空间的进程进行处理) 。 NF_REPEAT 再次调用该钩子函数。4.3 netfilter在IPv4中的框架一个数据在通过netfilter框架时,它将经过图3所示的过程。图3 netfilter框架示意图从图中可以看到netfilter框架共有五个钩子函数,分别为: NF_IP_PRE_ROUTING NF_IP_LOCAL_IN NF_IP_FORWARD NF_IP_POST_ROUTING NF_IP_LOCAL_OUT当数据报经过了完整性检查后,数据报就从左边进入系统,进行IP

39、校验以后,数据报经过第一个钩子函数NF_IP_PRE_ROUTING1进行处理;然后就进入路由代码,其决定该数据报是需要转发还是发给本机;若该数据报是发给本机,则该数据报经过钩子函数NF_IP_LOCAL_IN2处理以后然后传递给上层协议;若该数据报应该被转发则它被NF_IP_FORWARD3处理;经过转发的数据报经过最后一个钩子函数NF_IP_POST_ROUTING4处理以后,再传输到网络上。本地产生的数据经过钩子函数NF_IP_LOCAL_OUT 5处理以后,进行路由选择处理,然后经过NF_IP_POST_ROUTING4处理以后发送到网络上。由此可见,五个HOOK的位置,掌管了全部数据

40、包的可能出入口,我们只要在对应的位置对数据报进行操作,就能实现对数据报的各种处理。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宏的定义

41、提炼如下:#ifdef CONFIG_NETFILTER#define NF_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 */#define NF_HOOK(pf,hook,skb,indev,outdev,okfn) (okfn)(skb)#endif /* CONFIG_NETFILTER */当CONFIG_NETF

42、ILTER被定义的时候,就转去调用 nf_hook_slow() 函数;如果CONFIG_NETFILTER没有被定义,则从netfilter模块转回到IPv4协议栈继续往下处理。这样用户在编译kernel时可以通过定义 CONFIG_NETFILTER与否来决定是否把 netfilter 代码编译进内核。从函数的名称来看,也可以把IPv4协议栈上的这五个参考点,形象的看成是五个钩子。当数据报在IPv4协议栈上途经这五个钩子时,就会被netfilter模块钓上来,进行处理并根据返回值来决定数据报的下一步命运,继续传输或者丢弃。4.4 netfilter核心模块 钩子函数和参考点如果netfil

43、ter的钩子函数被调用,数据包就进入nf_hook_slow()函数的处理。此函数主要是根据nf_hooks 数组开始处理数据包。更准确一点来说,上文所说的IPv4协议栈上的五个参考点,并不是防火墙钩子函数,而是在此点允许放置防火墙钩子函数。在每一个参考点,都可以让netfilter放置一个或多个处理函数,来处理经过参考点的数据包,而netfilter的钩子函数则放在了nf_hooks 数组里面。这些钩子函数用struct nf_hook_ops给予描述,其声明如下:struct nf_hook_opsstruct list_head list;nf_hookfn * hook;int pf;

44、int hooknum;int priority;在使用netfilter实现管理功能的模块初始过程中,它会调用nf_register_hook()向netfilter的核心代码注册钩子函数。在这个注册的过程中,也就是将钩子函数放在参考点的的过程。钩子函数的具体位置,由nf_hooks数组的下标具体说明。 mymodules函数对于netfilter所提供的框架,这些钩子函数都将会调用mymodules函数。该函数执行完后,将返回通用的防火墙策略之一,如NF_ACCEPT等。该函数原型如下:unsigned int mymodules( struct sk_buff * *pskb,unsig

45、ned int hook,const struct net_device * in, const struct net_device * out,struct ipt_table * table,void * userdata)此函数的参数介绍如下: struct sk_buff * * pskb:传入的待处理的网络协议包。 unsigned int hook:在哪个钩子点处理该数据包。 const struct net_device * in:网络包传入的网络设备名。 const struct net_device * out:网络包传出的网络设备名。 struct ipt_table *

46、table:用户定义的规则表。用户定义的规则表,经过一些处理后送到核心空间,核心空间将用一些数据结构进行标识。在netfiter框架中,一条规则分为三部分,由三个数据结构来代表:struct ipt_entry:主要用来匹配IP头。struct ip_match:额外的匹配(TCP头、MAC地址等)。struct ip_target:除默认的动作外(如:NF_ACCEPT、NF_DROP),还可以增加新的动作(如:NF_REJECT)。mymodules() 函数就是按照规则表中存储的一条又一条的规则来处理数据包。但并不是所有的规则都一一来匹配数据包,数据包只与相应的参考点的规则相匹配。这个机

47、制,就为每个规则表实现了多个规则链,而每个规则链上又有多个规则。 匹配和目标匹配(match)是iptables命令的可选部分,它用于匹配数据包的源地址/源端口、目的地址/目的端口、协议等。匹配分为两大类:通用匹配和特定于协议的匹配。目目标是由规则指定的操作,对与那些规则匹配的数据包执行这些操作。除了默认的目标之外,还增加新的目标选项。4.5 netfilter可以实现的基本控制功能.包过滤包过滤的控制模块不会对数据包进行修改,只对数据包进行过滤。它通过钩子函数NF_IP_LOCAL_IN、NF_IP_FORWARD及NF_IP_LOCAL_OUT接入netfilter框架。对于任何一个数据报只有一个地方对其进行过滤。Iptables相对ipchains是一个巨大的改进,因为在ipchains中一个被转发的数据报会遍历三条链。包过滤框架示意图如下:图4 控制管理包过滤模块框架示意图.NAT网络地址转换通过NF_IP_PRE_ROU

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 研究报告 > 信息产业


经营许可证编号:宁ICP备18001539号-1