Linux下的简单网络管理控制系统的设计与开发
1.无需注册登录,支付后按照提示操作即可获取该资料.
2.资料以网页介绍的为准,下载后不会有水印.资料仅供学习参考之用.
密 惠 保
1 引言
1.1 课题背景
Linux做为当今使用最为广泛的操作系统,在各个领域都具有非常重要的用途,随着网络技术的飞速发展,网络数据管理和控制系统方面设计人才的需求不断增加。特别是随着我国经济的不断发展,网络管理控制系统开发方面的人才的需求也越来越大。通过这个课题可以使我们熟悉Linux下的netfilter网络数据控制过滤机制,可以使我们学会指定网络控制协议和开发网络管理控制模块的方法。通过Linux下的简单网络管理控制系统的设计和开发,可以提高实际的编程能力,特别是网络数据通讯管理这部分的编程能力。
1.2 国内外研究现状
Linux作为一种开源的操作系统,在国内外享有较高的声誉,其重要地位是其他操作系统所不可取代的。正是由于Linux操作系统的开源性,在国内外各大研究机构对其进行了不断的开发和完善,逐步形成了今天的Linux操作系统,其功能非常强大,运行非常稳定。国内外均成立了专门的研究机构对其进行开发和研究。而近年来由于网络技术的兴起,Linux系统也发展为一种可以进行资源共享和交互的网络平台。在资源共享的同时,网络的安全已经成为科研机构研究的重点,并且推出了一系列的网络管理控制系统,特别是实现对网络数据的管理和控制。其中以网络数据管理和控制过滤器IPTABLES最为出名。可以说就目前国内外研究的情况来看Liunx方面的网络管理控制系统的开发技术已经相当成熟,并且正在不断的进行完善。 [来源:http://www.think58.com]
1.3 课题意义
随着网络技术的飞速发展,在越来越多的领域要用到网络控制管理。Linux操作系统是一个开源操作系统,对网络管理控制程序的设计提供了良好的实验开发平台,同时市场对Linux下的研发人员需求也很大。通过对Linux网络通讯管理控制系统的开发,可以提高学生对网络通讯知识的了解和实际网络编程的能力,同时通过网络管理控制模块功能的设计,可以熟悉Linux下的网络数据的过滤机制,学会运用netfilter实现对网络数据的管理和控制。因此,该课题具有较好的实用价值。
1.4 本课题研究方法
在Linux-2.4.20-8操作系统平台下使用C语言开发环境。通过使用netfilter网络数据包管理控制机制进行网络控制模块功能的开发和编译,并且运用C语言编程开发出可以发出控制协议的管理控制平台进行相应的管理和控制模块的运行。其次研究网络通讯中的传输协议,以及数据报的传输过程,以及一些可以控制和管理网络数据的传输端口,制定出一套网络管理控制协议,即一套完整的控制字节。最终在Linux操作系统环境下实现完成该网络管理控制程序,并且用netfilter实现控制功能模块的设计。
2 Linux开发环境介绍
2.1 Linux简介
Linux是开源的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。它主要用于基于Intel x86系列CPU的计算机上。这个系统是由全世界各地的成千上万的程序员设计和实现的。其目的是建立不受任何商品化软件的版权制约的、全世界都能自由使用的Unix兼容产品。同时Linux以高效性和灵活性著称。Linux模块化的设计结构,使得它既能在价格昂贵的工作站上运行,也能够在廉价的PC机上实现全部的Unix特性,具有多任务、多用户的能力。Linux是在GNU公共许可权限下免费获得的,是一个符合POSIX标准的操作系统。Linux操作系统软件包不仅包括完整的Linux操作系统,而且还包括了文本编辑器、高级语言编译器等应用软件。它还包括带有多个窗口管理器的X-Windows图形用户界面,如同使用Windows NT一样,允许使用窗口、图标和菜单对系统进行操作。 [来源:http://think58.com]
Linux具有:稳定、可靠、安全的优点,并且有强大的网络功能。在相关软件的支持下,可实现WWW、FTP、DNS、DHCP、E-mail等服务,还可作为路由器使用,利用IPCHAINS/IPTABLE网络管理工具可构建NAT及功能全面的防火墙。
2.2 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等,功能很强,能够描述结构化的程序。 [来源:http://think58.com]
(4)语言生成的代码质量高。高级语言能否用来描述系统软件,特别是象操作系统、编译程序等,除要求语言表达能力强之外,很重要的一个因素是语言生成的代码质量如何。如果代码质量低,则系统开销就大,无实用价值。试验表明,针对同一问题用C语言编写程序,其生成代码的效率仅比用汇编语言写的代码效率低10%~20%。由于用高级语言比用汇编语言描述问题编程迅速、工作量小、可读性好,易于调试、修改和移植,因此C 语言就成了人们描述系统软件和应用软件比较理想的工具。
(5)语法限制不严格,程序设计自由度大。例如,对数组下标越界不作检查,由程序编写者自己保证程序正确。一般的高级语言语法检查非常严格,能检查出几乎所有的语法错误。而C语言允许程序编写者有较大的自由度,放宽了语法检查。"限制"与"灵活"是一对矛盾,限制严格,就失去灵活性;而强调灵活,就必然放松限制。程序编写者要仔细检查程序,保证其正确,而不要过分依赖C编译程序去查错。
(6)可移植性好。用C语言编写的程序基本上不作修改就能用于各种型号的计算机和各种操作系统。
2.3 常用的网络数据控制工具介绍
在Linux系统中经常使用的网络管理工具是IPTABLES。管理工具iptables是Linux 2.4内核用来安装、维护、检查数据包规则的管理程序。在Linux 2.4网络管理控制体系结构中,数据处理的规则可以分为四类:IP输入链(IP input chain)、IP输出链(IP output chain)、IP转发链(IP forward chain)、用户自定义链(user defined chain)。网络数据控制管理的规则指定包的格式和目标。当一个包进来时,内核使用输入链来决定数据包的命运。数据包沿着输入链一条规则一条规则匹配,如果它通过了输入链的检查,内核将决定包下一步该发往何处(这一步叫路由)。假如该数据包是送往另一台机器的,内核就将调用转发链。数据包再沿着转发链一条规则一条规则检查,如果不匹配,就进入目标值所指定的下一条链。这条规则链有可能是用户自己定义的规则链,或者是一个特定值:接受(ACCEPT)、否定(DENY)、拒绝(REJECT)、伪装(MASQ)、重定向(REDIRECT)、返回(RETURN)。 think58 [资料来源:www.THINK58.com]
⑴ 基本的iptables命令
一个iptables命令基本上包含如下五个部分:
① 希望工作在哪个表上
② 希望使用该表的哪个链
③ 进行操作(插入、添加、删除、修改)
④ 对特定规则的目标动作
⑤ 匹配数据报条件
⑵ iptables基本语法
iptables基本语法如下:
iptables -t table -Operation chain -j target match(es)
例如希望添加一个规则,允许所有从任何地方到本地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的一些基本匹配条件, 适用于所有的链
-p 指定协议(tcp/udp/icmp/…)
-s 源地址(ip address/masklen)
-d 目的地址(ip address/masllen) copyright think58
[来源:http://www.think58.com]
-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(套接字)是通过标准的UNIX文件描述符和其它程序通讯的一个方法。每一个套接字都用一个半相关描述:{协议,本地地址、本地端口}来表示;一个完整的套接字则用一个相关描述:{协议,本地地址、本地端口、远程地址、远程端口},每一个套接字都有一个本地的由操作系统分配的唯一的套接字号。
3.1.2 基本套接字函数
函数socket():这个函数定义为int socket(int domain,int type,int protocol),参数domain指定要创建的套接字的协议族,可以是如下值:
AF_UNIX //UNIX域协议族,本机的进程间通讯时使用
AF_INET //Internet协议族(TCP/IP)
参数type指定套接字类型,可以是如下值:
SOCK_STREAM //流套接字,面向连接的和可靠的通信类型
SOCK_DGRAM //数据报套接字,非面向连接的和不可靠的通信类型 think58.com
SOCK_RAW //原始套接字,只对Internet协议有效,可以用来直接访问IP协议
参数protocol通常设置成0,表示使用默认协议,如Internet协议族的流套接字使用TCP协议,而数据报套接字使用UDP协议。当套接字是原始套接字类型时,需要指定参数protocol,因为原始套接字对多种协议有效,如ICMP和IGMP等。
Linux系统中创建一个套接字的操作主要是:在内核中创建一个套接字数据结构,然后返回一个套接字描述符标识这个套接字数据结构。这个套接字数据结构包含连接的各种信息,如对方地址、TCP状态以及发送和接收缓冲区等等,TCP协议根据这个套接字数据结构的内容来控制这条连接。
函数connect():这个函数定义为int connect(int sockfd,struct sockaddr * servaddr,int addrlen);参数sockfd是函数socket返回的套接字描述符;参数servaddr指定远程服务器的套接字地址,包括服务器的IP地址和端口号;参数addrlen指定这个套接字地址的长度。成功时返回0,否则返回-1,并设置全局变量为以下任何一种错误类型:ETIMEOUT、ECONNREFUSED、EHOSTUNREACH或ENETUNREACH。
在调用函数connect之前,客户机需要指定服务器进程的套接字地址。客户机一般不需要指定自己的套接字地址(IP地址和端口号),系统会自动从1024至5000的端口号范围内为它选择一个未用的端口号,然后以这个端口号和本机的IP地址填充这个套接字地址。
客户机调用函数connect来主动建立连接。这个函数将启动TCP协议的3次握手过程。在建立连接之后或发生错误时函数返回。
函数bind():这个函数将本地地址与套接字绑定在一起,其定义为:int bind(int sockfd,struct sockaddr * myaddr,int addrlen);参数sockfd是函数sockt返回的套接字描述符;参数myaddr是本地地址;参数addrlen是套接字地址结构的长度。执行成功时返回0,否则,返回-1,并设置全局变量errno为错误类型EADDRINUSER。服务器和客户机都可以调用函数bind来绑定套接字地址,但一般是服务器调用函数bind来绑定自己的公认端口号
函数listen():函数listen将一个套接字转换为征听套接字,定义为:int listen(int sockfd,int backlog)参数sockfd指定要转换的套接字描述符;参数backlog设置请求队列的最大长度;执行成功时返回0, 否则返回-1。函数listen功能有两个:(1)将一个尚未连接的主动套接字(函数socket创建的可以用来进行主动连接但不能接受连接请求的套接字)转换成一个被动连接套接字。执行listen之后,服务器的TCP状态由CLOSED转为LISTEN状态;(2)TCP协议将到达的连接请求队列,函数listen的第二个参数指定这个队列的最大长度。
函数accept():函数accept从征听套接字的完成队列中接收一个已经建立起来的TCP连接。如果完成连接队列为空,那么这个进程睡眠。int accept(int sockfd,struct sockaddr * addr,int * addrlen)参数sockfd指定征听套接字描述符;参数addr为指向一个Internet套接字地址结构的指针;参数addrlen为指向一个整型变量的指针。执行成功时,返回3个结果:函数返回值为一个新的套接字描述符,标识这个接收的连接;参数addr指向的结构变量中存储客户机地址;参数addrlen指向的整型变量中存储客户机地址的长度。失败时返回-1。当函数accept阻塞等待已经建立的连接时,如果进程捕获到信号,函数将以错误返回,错误类型为EINTR。对于这种错误,一般重新调用函数accept来接收连接。
[资料来源:http://think58.com]
函数close():函数close关闭一个套接字描述符。定义如为:int close(int sockfd);执行成功时返回0,否则返回-1。与操作文件描述符的close一样,函数close将套接字描述符的引用计数器减1,如果描述符的引用计数大于0,则表示还有进程引用这个描述符,函数close正常返回;如果为0,则启动清除套接字描述符的操作,函数close立即正常返回。调用close之后,进程将不再能够访问这个套接字,但TCP协议将继续使用这个套接字,将尚未发送的数据传递到对方,然后发送FIN数据段,执行关闭操作,一直等到这个TCP连接完全关闭之后,TCP协议才删除该套接字。
3.2 基于TCP协议的通讯
3.2.1 TCP传输协议简介
在Linux网络管理控制系统的设计中,为了使系统制定的控制管理字符能够顺利的传输到主机进行相关的操作,系统采用了TCP协议为传输控制指令的载体。TCP是一套可靠的传输协议,其采用三次握手的方式建立连接:[1].请求端发送一个SYN段指明客户打算连接的服务器的端口,以及初始序列号ISN。[2].服务器发回包含服务器的初始序列号的SYN报文段作为应答。同时,将确认序号设置为客户的ISN加1以客户的SYN报文段进行确认。一个SYN将占用一个序号。[3].客户必须将确认序号设置为服务器的ISN加1以对服务器的SYN报文段进行确认。TCP这三个报文段完成连接的建立,也就是三次握手。 think58好,好think58 [资料来源:www.THINK58.com]
3.2.2 控制字符的制定
当TCP连接建立成功后,控制字节就包含在TCP报文的数据部分发送出去,接收端通过对TCP数据报的解析,取出数据部分的控制字节进行相关的操作。系统制定的通过TCP协议传输的控制字节可以完成以下网络控制功能:⑴当收到TCP报文段中的数据部分为字符‘a’时,系统编译加载所有的网络控制模块;⑵当收到TCP报文段中的数据部分为字符‘f’时,系统丢弃所有进出网络的ICMP数据包;⑶当收到TCP报文段中的数据部分为字符‘i’时,系统接收所有进出网络的ICMP数据包;⑷当收到TCP报文段中的数据部分为字符‘t’时,系统禁止访问FTP服务器;⑸当收到TCP报文段中的数据部分为字符‘p’时,系统允许访问FTP服务器;⑹当收到TCP报文段中的数据部分为字符‘c’时,系统禁止浏览HTTP网页;⑺当收到TCP报文段中的数据部分为字符‘o’时,系统允许浏览HTTP网页;⑻当收到TCP报文段中的数据部分为字符‘r’时,系统卸载所有功能模块。
[资料来源:THINK58.com]
下一篇:VC++学生成绩统计分析系统