《基于Linux的防火墙设计.docx》由会员分享,可在线阅读,更多相关《基于Linux的防火墙设计.docx(61页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、中文摘要在科技不断发展的今天,人们的生活与互联网的关系越来越紧密,但是网络安全问题也越来越严重。防火墙在一定程度上可以保护计算机和互联网安全,避免可能的损失。本文主要研究了基于Linux内核防火墙Netfilter系统的结构框架特点、工作原理及其在内核中的实现机制;Linux内核模块的开发。论文介绍了一个简单的包过滤防火墙的设计过程。本系统在Netfilter上进行二次开发,设计了一个内核模块,通过动态加载到内核中实现对数据包的过滤功能,具有很高的效率,数据包处理能力较强。Netfilter框架的使用使其具有良好的代码结构,易于维护和扩展。防火墙架设在Linux系统上,连接内部网络和外部网络。
2、该防火墙主要实现了以下功能:用户配置;基于IP地址的过滤;针对TCP/UDP协议端口的过滤;日志记录。关键词:网络安全;防火墙;Linux内核;NetfilterSimple Firewall based on LinuxAuthor: Tutor: Wu YanAbstractNowadays, as technology is developing increasingly, the relationship between peoples ordinary life and Internet has become closer and closer. Meanwhile, interne
3、t security becomes more and more serious. Firewall is able to protect computer and network in general level from attacking via network.This paper mainly studies the framework, theory and implementation mechanisms in kernel of the Linux firewall named Netfilter, Linux kernel module development.The sy
4、stem designs a simple packet filtering firewall. The firewall system is the second development based on Netfilter. The firewall is a kernel module which is dynamic loaded into the kernel to realize the packet filtering, whick has high efficiency and strong ability of dealing with data packages. It h
5、as good code structure, is easy to maintain and extend because of using of Netfilter framework. The firewall is set up on the Linux server, connects the internal network and the external network. The main functions of the firewall includes: user configuration; IP address filtering; TCP/UDP port filt
6、ering; log recording.Keywords: network security;firewall;Linux kernel;Netfilter56目 录第一章 系统概述11.1 课题研究的背景11.1.1 网络的不安全性11.1.2 网络安全需要防火墙保护11.2 课题研究的意义11.3 选题的目的2第二章 防火墙的功能需求32.1 功能描述32.2 需求分析42.2.1 防火墙的条件和动作42.2.2 防火墙支持的过滤类型和内容52.2.3 防火墙过滤的方式和动作62.2.4 防火墙的配置文件72.2.5 防火墙命令行配置格式72.2.6 防火墙的规则文件格式82.2.7 防
7、火墙的日志文件数据格式92.2.8 防火墙构建所采用的技术方案9第三章 所采用的技术介绍113.1 使用netlink进行用户空间和内核空间数据交互113.1.1 netlink套接字的用户空间建立和使用113.1.2 netlink的内核空间API113.2 使用proc进行内存数据用户空间映射133.3 内核空间的文件读写操作16第四章 模块划分与设计194.1 防火墙的总体架构194.1.1 总体架构的组成194.1.2 总体结构的实现方法204.2 防火墙的用户命令解析214.3 用户空间与内核空间交互254.4 防火墙链上的规则264.5 proc虚拟文件系统294.6 防火墙配置文
8、件和日志文件处理294.7 防火墙的过滤模块设计30第五章 编码实现325.1 过滤规则匹配325.2 网络数据拦截335.3 proc虚拟文件系统355.3.1 proc文件的读操作355.3.2 proc文件的写操作365.4 配置文件解析365.5 防火墙内核模块的初始化385.6 用户空间处理主函数395.7 Makefile的编写40第六章 运行测试436.1 防火墙程序编译436.1.1 编译、加载内核模块436.1.2 查看proc虚拟文件系统436.1.3 编译用户层程序446.2 防火墙功能测试456.2.1 设置过滤规则456.2.2 查看过滤日志456.2.2 关闭防火墙
9、46结束语47致 谢48参考文献49附 录50第一章 系统概述1.1 课题研究的背景1.1.1 网络的不安全性1. Internet是不安全的在建设Internet的初期,其建设者认为安全不是一个问题。Internet在其早期是一个开放的为研究人员服务的网际网,是完全非盈利性的信息共享载体,所以,几乎所有的Internet协议都是没有考虑安全机制。这一点从Internet上最通用的应用FTP,Telnet和电子邮件中用户口令的明文传输以及IP报文在子网段上的广播传递就充分地体现出来。近些年,Internet的性质和用户的情况发生了巨大的变化,使得Internet的安全问题显得越来越为突出。随着
10、Internet的全球普及和商业化,用户很多非常私人化,如信用卡号等和其自身利益相关的私有信息也通过Internet传输,而且Internet越来越多的信息受到了非法的访问,其安全性也成为人们日益关注的问题。2. 局域网是不安全的目前的局域网基本上都是采用以广播为技术的以太网,任何两个节点之间的通信数据包,不仅为这两个节点的网卡所接受,也同时为处于同一个以太网上的任何一个节点的网卡所截取,因此,黑客只要接入以太网上的任意节点进行侦听,就可以捕获这个以太网上的所有数据包,对其进行解包分析,从而窃取关键信息,这就是以太网固有的安全隐患。1.1.2 网络安全需要防火墙保护防火墙技术作为一种建立在现代
11、通信技术和信息安全技术基础上的应用性安全技术,可以再一定程度上保护计算机和网络的安全,避免系统和网络受到来自外部网络和内部网络的攻击。虽然防火墙并不能保证系统和网络100%安全,但却十分必要。因此防火墙已经越来越多地应用于网络互联环境之中了。1.2 课题研究的意义随着互联网技术的日新月异,网络受到了越来越多的各式各样的攻击。网络的安全性也就成为了日益关注的问题,而防火墙是保证网络安全最重要的一种措施。Linux是近几年突出的一种操作系统,以其公开的源代码、强大稳定的网络功能和大量的免费资源受到业界的普遍赞扬。Linux环境下的的防火墙技术从2.0内核版本发展到目前的2.6版本经历了若干的技术革
12、新,逐步发展起来。2.0版本内核中的ipfwadm是Alan Cox 完成的,其代码来自FreeBSD 的内核。2.2版本内核中的ipchains较之前的版本有了很大的改进,ipchains 维护者之一Paul Russell 针对其缺点,在Linux kernel2.3系列的开发过程中形成了目前netfilter的主要架构。用户空间的防火墙管理工具,也相应地发展为iptables。Iptables 作为Linux防火墙的新一代继承人,当然也针对黑客不断推诚出新的探测技术拟出一些对应之道,那就是对封包的联机状态,作出更详细的分析,透过这样的分析能对一些可能被黑客利用的弱点加以阻隔,另外也开发出
13、真正的封包改写能力,不需要透过其它程序的协助来仿真网址转译,除此之外,Iptables 也获得系统核心的直接支持, 不需要像Ipchains那样需要自行重新编译核心。总之,目前大部分国内军队、政府机关、金融机构、企业都采用Linux系统,因此在Linux上配置防火墙有极其重要的意义,同时可以学习这一先进的技术与熟悉一个优秀的操作平台。1.3 选题的目的本课题主要是基于Linux系统设计并实现了一个网络防火墙。这种防火墙的成本低,安全性适度,更重要的是实现简单、维护方便。Linux内核中的netfilter框架是Linux防火墙构建的基础,使用这个框架可以构建用户指定的网络数据报文过滤规则和处理
14、方法。要完成该课题,需要深入了解Linux 内核,Linux下系统程序设计,防火墙基本概念、运行机制、包过滤过程等技术。第二章 防火墙的功能需求2.1 功能描述基于Linux的简单防火墙,利用Linux内核的netfilter模块,对从本主机进出的网络数据进行过滤,并可以通过用户界面进行交互,设置过滤规则,进行规则的记录和读取,以及过滤日志分析。1. 网络数据过滤防火墙的主要目的主要是对发送到本地和从本地发出的网络数据进行拦截工作,防火墙的拦截功能定义是指防火墙对什么网络数据进行过滤, 怎样进行过滤。过滤规则如下:可以分为丢弃、通过;可以按照网卡进行过滤,针对某个网卡设置过滤规则;可以按照IP
15、地址和端口进行过滤;可以按照协议进行过滤,支持的协议有TCP、UDP、ICMP和IGMP2. 防火墙规则的设置防火墙能够与用户进行交互是防火墙的基本功能,用户可以使用防火墙的用户接口对防火墙的过滤规则进行一些操作。用户可以通过命令行方式进行防火墙规则的设置 、删除、显示等操作。具体含义如下:规则设置: 用户按照命令行的格式增加防火墙规则,用户设置的合法规则需要立即生效。规则删除: 用户可以根据规则列表中的序号等方式对防火墙目前的规则进行删除。规则的显示: 用户可以列出防火墙目前的规则。3. 防火墙配置文件及日志记录防火墙除了核心的功能外,一些附加的功能也是必须得。例如,防火墙启动时的配置选项、
16、对通过防火墙的网络数据的过滤情况进行信息记录等。防火墙可以根据用户设置的配置文件对基本的用户设置进行读取,例如默认的防火墙动作、日志文件的记录路径。防火墙需要建立基本的系统信息获取方法,使用PROC虚拟文件系统,向用户反应基本的系统设置情况,并可以通过简单的设置对防火墙进行基本的配置。防火墙可以对符合用户设置规则的网络数据进行记录,方便用户查看,即可以进行日志记录,需要保存到文件中。2.2 需求分析2.2.1 防火墙的条件和动作防火墙的核心构成是由条件和动作组成的。当网络数据满足某些条件的时候则执行对应的动作。条件即网络数据所承载的信息,例如来源主机的IP地址和端口地址、目的主机的IP地址和目
17、的地址、网络数据中所采用的协议类型,此外还包含网络协议所处的阶段,动作即对网络数据的处理方式。例如通常所采用的接受、丢弃、转发等。从网络上过来的数据会按照条件动作的方式通过防火墙。当满足接受条件时,执行接受的动作,网络数据直接通过防火墙,由网络协议栈处理数据。而当网络数据满足丢弃条件的时候,防火墙会将数据丢弃,网络数据不会经过防火墙。当网络数据满足转发条件的时候,防火墙会将网络数据进行转发,条件中指定的另一个主机将会接受到网络数据并进行处理,如图2.1所示。图2.1 防火墙条件和动作2.2.2 防火墙支持的过滤类型和内容1. 无条件过滤防火墙的默认规则为DROP,即当没有指定任何规则的时候,将
18、丢弃任何网络数据。用户可以在此规则的基础上构建自己的规则,当用户定义规则之后,满足用户规则的网络数据,将执行用户所定义的规则处理方式,如果不满足用户定义的规则,会执行默认的过滤规则,即默认的丢弃规则。其实可以定义一个全部ACCEPT的规则来覆盖默认规则,将所有的网络数据都接受,而不是默认地丢弃。2. 按照IP进行过滤防火墙可以按照主机IP地址进行过滤,只有满足规则中设置的IP地址的主机才能进行规定的工作。IP地址分为源主机IP地址和目的主机IP地址。3. 根据协议类型过滤防火墙可以根据设置的网络协议类型进行过滤,即只有某个协议的网络数据才能执行相应的工作。本防火墙所能识别的协议有TCP、UDP
19、、ICMP和IGMP,当某个协议不能识别的时候,会按照无协议指定的规则进行过滤条件判断和处理。4. 根据协议的阶段进行过滤防火墙可以根据TCP网络协议的某个阶段进行过滤,为了能够有效拦截一个TCP连接,可以将服务器上防火墙的过滤条件设置为TCP协议的SYN阶段,即在客户端SYN字段的时候就进行过滤,使得服务器端的网络协议接受不到SYN数据,这样就不会对其它数据造成影响,例如客户端的其它TCP连接。5. 协议的类型和代码防火墙可以根据ICMP和IGMP协议的代码和类型进行过滤。ICMP协议和IGMP有很多类型和代码,并且其功能比较重要,如果不区分具体的类型和代码全部进行过滤,将会造成很大的麻烦。
20、例如为了阻止别的主机对本主机进行的ping操作,而将所有的ICMP进行拦截,将会将“主机不可达”等有用的信息屏蔽掉,使得网络协议很不完整。2.2.3 防火墙过滤的方式和动作防火墙的过滤方式是防火墙设计的重要部分,本防火墙主要包括防火墙的3个链、防火墙的规则增加所引起的规则优先级变化等需求的定义。防火墙分为3个链,INPUT、OUTPUT和FORWARD,如图2.2所示,3个链的含义和处理方式如下:图2.2 防火墙的3个过滤链INPUT是防火墙的输入链,即进入主机的网络数据都会经过防火墙的这个链,在这个链上查找可以匹配的规则,并按照规则制定的方式进行处理。OUTPUT是防火墙的输出链,即从主机发
21、出的网络数据都会经过防火墙的这个链,可以将对从主机发出的网络数据规则放到这个链上,由这个链进行命中规则查找,当命中的时候,在这个链上对网络数据按照定义的动作进行处理。FORWARD为防火墙的转发链,即主机进行转发的数据都会进过转发链,如果需要对转发的网络数据进行过滤,将规则放到FORWARD链上。防火墙的3个链由各种规则组成,其中的规则构成为链表结构,当进行过滤规则命中判定的时候,需要遍历整个链表结构。如果规则命中则停止对链表中规则的遍历。因为遍历链表的时候,只要找到一个规则就停止遍历,所以前面的规则优先级要高于后面的规则,本防火墙将用户新加入的规则放到链的最前面,即用户新加入的规则总是拥有最
22、高的优先级。2.2.4 防火墙的配置文件防火墙在启动的时候需要读取基本配置信息,例如默认配置规则、规则配置文件的路径、日志文件的路径等信息,用于初始化防火墙的配置。防火墙配置文件的路径为“/etc/sipfw.conf”(注:如果配置文件不存在,将会建立该文件,并将下面所述的默认配置信息写入文件),配置文件的格式如下:# | 关键字 = 值 配置文件的一行为注释行或者为配置行。当一行的第一个字符为#时,表示为注释,防火墙将忽略本行,不进行解析。配置行的格式为“关键字=值”,其中“关键字”表示配置行的含义;“值”表示具体的配置选项是什么。配置文件的“关键字”有如下几个:DefaultAction
23、:默认动作,即防火墙没有设置规则时对网络数据的处理方式,可以是ACCEPT或DROP两种之一。如果没有配置此项,默认值为DROP,即会将所有的网络数据丢弃。RulesFile:防火墙规则配置文件的路径,防火墙将从此文件中读取防火墙的配置规则。如果此项没有进行配置,将从文件“/etc/sipfw.rules”文件中读取防火墙配置规则。LogFile: 防火墙日志文件的路径,防火墙将把过滤规则的命中情况放到这个文件中。如果此项没有进行配置,将向文件“/etc/sipfw.log”中写入命中情况。2.2.5 防火墙命令行配置格式防火墙的命令行配置是用户设置防火墙的基本方法,包括增加规则、删除规则等操
24、作。防火墙命令行配置的格式如下:sipfw chain -action -source -dest -sport -dport -protocol -interface 配置选项的含义为:-chain: 操作的链,即操作所要生效的链的名称,将要把此规则动作添加到指定的链上,链分为3个,INPUT、OUTPUT和FORWAED。-action:规则定义的动作,符合规则定义的网络数据将按照给定的action动作来操作,有ACCEPT和DROP。-source: 网络数据来源主机的IP地址。-dest: 网络数据的目的IP地址。-sport: 网络数据来源主机的端口号。-dport: 网络数据的目的
25、主机的端口号。-protocol: 规则定义所指的协议类型,可以支持TCP、UDP、ICMP、IGMP协议。tcp表示TCP协议,udp表示UDP协议;icmp表示ICMP协议,igmp表示IGMP协议,当值为0时表示支持上述4中协议类型。-interface: 表示规则定义所绑定的网络接口,目前仅支持以太网接口,例如回环接口lo,以太网接口eth0等。-delete: 此项操作不带参数,将删除指定规则。-flush: 此项操作不带任何其它参数,将清空防火墙中的所有过滤规则。-list: 此项操作列出指定链上的过滤规则设置情况。参数可以为INPUT、OUTPUT和FORWARD,当不带参数时,
26、将列出所有链上的规则设置情况。2.2.6 防火墙的规则文件格式防火墙规则配置文件用于保存防火墙过滤规则的配置情况。防火墙启动的时候,从配置文件读取防火墙配置参数,生成防火墙的配置规则。当用户对防火墙的配置规则进行了修改之后,防火墙配置文件的记录将进行实时更新。防火墙配置文件的默认路径为“/etc/sipfw.rules”,若默认路径没有规则配置文件,将自动创建。防火墙配置文件采用严格的解析方式,各个条件中间没有多余的空格,配置规则格式如下: # | 目标链 动作 源IP 源端口 目的IP 目的端口 协议类型 网络接口2.2.7 防火墙的日志文件数据格式防火墙日志文件记录防火墙规则的命中情况,规
27、则为用户定义的规则,不包含默认规则的命中情况,主要是因为默认规则的命中比较多,会造成日志文件的无限增大。防火墙日志文件的路径将从防火墙配置文件中读取,如果配置文件中没有配置此选项,将从路径“/etc/sipfw.log”文件汇读取,并将命中规则写入此文件中。日子文件的一行为注释或命中规则,防火墙日志文件的格式如下: # | 时间 from 源IP:源端口 to 目的IP:目的端口 协议类型 动作2.2.8 防火墙构建所采用的技术方案防火墙的设计除了规则之外,技术框架的选取也十分关键。在Linux系统上,有一个成功的网络数据过滤框架,这就是netfilter。1. 内核过滤架构的选择防火墙采用n
28、etfilter的5个钩子实现,如图2.3所示,选取5个钩子中的3个作为实现防火墙数据拦截的基础:NF_IP_LOCAL_IN、NF_IP_LOCAL_OUT、 NF_IP_LOCAL_FORWARD,分别对应于防火墙的INPUT、OUTPUT、FORWARD链。图2.3 netfilter的 5个钩子防火墙采用netlink 框架和 proc 编程的方法实现用户空间和内核空间通信。netlink框架用于实现用户命令行的交互,将用户的命令设置发送到内核,并将内核的相应数据发送给用户。proc框架用于获取用户对netlink基本情况的简单信息,例如默认动作、防火墙的有效和失效配置、过滤规则命中的
29、简单情况等。2. 防火墙文件的内核操作防火墙的文件操作设计配置文件的读、写、建立,规则文件的读、写、建立,日志文件建立、写等操作。防火墙的主要动作都是集中在内核空间的,即文件操作也要使用内核空间的文件函数。第三章 所采用的技术介绍3.1 使用netlink进行用户空间和内核空间数据交互netlink用于在用户空间和内核空间传递数据,它提供了内核、用户空间的双向通行方法。3.1.1 netlink套接字的用户空间建立和使用netlink包含用户空间的标准套接字和用于构建内核模块的内核API。防火墙使用netlink进行用户空间和内核空间的通行。用户层的netlink程序设计与通用的套接字编程一致
30、,其顺序如下:Socket(): 建立netlink套接字Bind(): 将netlink套接字与netlink地址类型进行绑定。Sendmsg(): 向内核或者其他进程发送消息。Recvmsg(): 从内核或者其它进程接受消息。Close(): 关闭netlink套接字。其中socket()函数用于建立netlink类型的套接字。Bind()将socket函数生成的套接字文件描述符与一个netlink类型的地址结构绑定在一起。Sendmsg()函数由用户空间向内核空间发送数据,recvmsg() 函数用于用户空间接收来自内核空间的数据。最后关闭netlink网络套接字。3.1.2 netli
31、nk的内核空间API内核空间的netlink API 与应用程序之间的API之间有很多的不同,netlink内核API在文件net/core/af_netlink.c中实现。内核netlink API可以用于访问内核模块的netlink套接字,并和用户空间的应用程序进行通信。1. netlink的内核套接字建立内核空间建立此套接字的函数为:Struct sock * netlink_kernel_create(int unit, void (*input)(struct sock *sk, int len);参数unit,是netlink协议类型,函数指针input是一个接收到用户空间的消息后
32、的回调函数,是netlink内核套接字的主要处理函数。建立套接字成功的时候,返回一个structure sock指针类型的值,之后可以用这个值对netlink套接字进行处理;当返回值为NULL时,创建失败。2. netlink的应用层数据接收当用户空间向内核空间通过之前的netlink套接字发送消息的时候,net_kernel_create()函数注册的回调函数input()会被调用,下面是一个input()函数的实现代码: 当应用层的进程通过sendmsg()函数发送数据的时候,如果input()函数的处理速度足够快,则不会对系统造成影响。当input()函数的处理过程占用很长时间,需要将处
33、理的代码从input()函数中移除,放到别的地方进行处理,防止系统调用在此处阻塞,别的系统不能进行调用。可以使用内核线程类处理上述的功能,在此内核线程中使用skb=skb_recv_dategrm(nl_sk)函数来接受客户端发送的数据,接受到的数据保存在skb-data中。当使用netlink_kernel_create()函数建立的套接字nl_sk没有数据时,内核处理线程进入睡眠状态,当有数据到来的时候需要将内核处理线程唤醒,进行接收和处理线程的工作。所以在input()函数中,需要将内核线程唤醒。可以使用如下的代码实现:Void input(struct sock *sk, int le
34、n) Wake_up_interruptible(sk-sleep);3. netlink的内核数据发送netlink在内核中发送数据与应用程序发送数据一样,需要设置netlink的源地址和目的netlink地址。例如,需要发送的netlink消息数据在结构struct sk_buff *skb中,则本地的地址可以使用如下设置:NETLINK_CB(skb).groups = local_groups;NETLINK_CB(skb).pid = 0; /*from kernel */Netlink的目的地址的设置为如下的代码:NETLINK_CB(skb).dst_groups = dst_g
35、roups;NETLINK_CB(skb).dst_pid = dst_pid;上述消息没有存在skb-data中,而是存放在netlink协议的套接字缓冲区控制块sbk中。发送一个单播消息, 使用netlink_unicast()函数,其原型如下:int netlink_unicast(struct sock *ssk, struct sk_buff *skb, u32 pid, int nonlock);其中的参数ssk由netlink_kernel_create()函数返回,skb-data指向需要发送的netlink消息,pid是应用层接受数据的pid, nonblock用于设置当接收
36、缓冲区不可用的时候是阻塞等待直到还是直接返回失败。4. netlink套接字关闭关闭netlink套接字,使用sock_release)()函数来进行。主要进行内存等资源的释放,将一些指针进行重置的操作。函数的原型如下:void sock_release(struct socket *sock);3.2 使用proc进行内存数据用户空间映射Linux中的proc文件系统是一种虚拟的文件系统,通过这个文件系统可以实现内核空间和用户空间的通信。在porc虚拟文件系统中,通过对文件的读写来实现用户空间和内核空间之间的通信。在proc虚拟文件系统总,通过对文件的读写来实现用户空间和内核空间的通信,与普
37、通的文件不同,/proc目录下的虚拟文件的内容是动态创建的。1. proc虚拟文件系统的结构对proc虚拟文件系统进行操作首先要要了解它的核心结构,proc文件系统的核心数据结构是structure proc_dir_entry, 它用来表示一个虚拟文件系统的文件。原型定义如下:Struct proc_dir_entryConst char *name; /*虚拟文件的名称*/Mode_t mode; /*文件的模式权限*/Uid_t uid; /*文件的用户ID*/Gid_t gid; /*文件的组ID*/Struct inode_operations *proc_iops /*inode节
38、点操作函数*/Struct file_operations *proc_fops; /*文件操作函数*/Struct proc_dir_entry *parent; /*父目录*/.Read_proc_t *read_proc /*proc的读函数*/ Write_proc_t *write_proc /*proc的写函数*/Void *data /* 私有数据指针*/Atomic_t count; /*使用技术*/名称name应该选取一个有意义的名字,并且不能包含任何特殊再付和空格符,因为proc文件系统通常通过命令行的shell进入,那样会造成从控制台进入困难。权限mode的设置需要仔细考
39、虑,如果不恰当的设置和写权限,可能造成系统的奔溃。参数proc_fops并不是一个全功能的文件系统函数,它仅仅限定于读操作和写操作。参数read_proc和write_proc是proc文件系统的读写界面,有用户实现。参数 data是用户的私有数据指针,可以将不方便传递的参数通过data指针进行读写。2. 创建proc虚拟文件创建proc虚拟文件的函数由创建目录的函数proc_mkdir()和创建文件的函数create_proc_entry().创建目录的proc_mkdir()函数原型如下:Extern struct proc_dir_entry *proc_mkdir(const char
40、 *dir_name, Struct proc_dir_entry *parent);Proc_mkdir()函数在parent下创建一个名称为dir_name指向字符串的目录。当创建成功的时候,返回值为指向结构struct proc_dir_entry指针。extern struct proc_dir_entyr *create_proc_entry( const char *name; /*创建文件的名称*/ mode_t mode; /*文件的属主*/ struct proc_dir_entry *parent /*文件的父目录*/函数create_proc_entry()在/proc文
41、件系统中创建一个虚拟文件,文件名为name指定的字符串;文件的权限由参数mode设置,与通用文件的权限一致;而parent参数说明此文件的位置,当为&proc_root的时候其目录为/proc的根目录下。3. 删除proc虚拟文件虚拟文件proc的释放函数为remove_proc_entry(),函数的原型如下。其中的参数name为要删除文件的名称,parent为proc文件的父目录。Extern void *remove_proc_entry*( Const char *name, /*要删除文件的名称*/ Struct proc_dir_entry *parent); /*文件的父目录*/
42、4. proc文件的写函数proc文件系统的镀锡通过用户实现的读写回调函数来实现,其中的写函数表示用户空间向内核空间写入数据,此时如何处理用户空间的数据由实现的函数决定。原型如下: Typedef int (write_proc_t)(struct file *file, const char_user *buffer, unsigned long count,void *data);参数file是一个已经打开的文件结构,通常忽略这个变量。参数buffer是用户传递过来的数据结构,这实际上是一个用户指针,在内核空间只能直接使用这个参数,需要使用例如copy_from_user()函数将用户空间
43、的数据复制到内核空间来。参数count是缓冲区中数据的数量参数data是一个指向私有数据的指针。5. proc文件读函数当用户空间的程序读取创建的proc文件时,内核会分配给proc读取程序一页大小的内存空间,即PAGE_SIZE大小,proc驱动程序会自动将这块空间的数据复制到用户空间。Proc驱动程序分配的这块空间会通过政策的proc_read回调函数传入。函数原型如下: Int pro_read(char *page, char *start, off_t offset, int count, int *eof, void *data);参数page为proc驱动程序传入的分配的内核空间
44、,将需要传递给用户的数据复制到这个缓冲区的地址。这个缓冲区是内核空间的缓冲区,系统会自动将page中数据复制给用户。参数start是在此缓冲区中需要复制给用户的数据的起始地址。参数offset表示用户打算读取文件时的偏移地址。参数count是用户请求读取的字节数。参数eof是一个整型指针,当驱动程序的数据发送完毕时,将这个值设置为结束发送给用户,判断数据是否结束。参数data是私有数据指针。3.3 内核空间的文件读写操作防火墙中要对文件在内核空间进行读写,在内核空间中操作文件的函数与用户空间不同,需要使用内核空间专用的一套函数,主要有:file_open()、file_close()、vfs_
45、write()、set_fs()、 get_fs()等,函数在头文件Linux/fs.h和asm/uaccess.h中声明。1. 内核空间的文件结构内核中对文件进行操作的文件结构struct file,是进行文件操作时经常使用的结构,结构的原型如下,其中f_op是对文件进行操作的结构, f_ops为文件当前的指针位置:Struct file Const struct file_operations *f_op; /*文件操作结构*/.Loff_t f_ops; /*文件的当前指针*/Struct file_operations结构中定义的为一些内核文件操作的函数,结构的原型定义如下:Struc
46、t file_operations Ssize_t (*read) (struct file *, char_user *, size_t, loff_t *); /*从文件中读取数据*/Ssize_t(*write) (struct file *, const char_user *, size_t,loff_t *); /* 向文件中写入数据*/ 2. 内核空间的文件建立操作内核中的打开文件函数为file_open(),其原型如下:Sturct file *file_open(const char *filename, int flags, int mode);File_open()函数用于打开路径filename下的文件,返回一个指向指针结构struct file的指针,后面的函数使用这个指针对文件进行操作,返回值需要使用宏IS_ERR()来检验其有效性。参数说明:Filena