一种基于Linux的进程流量监控方法、系统及设备与流程

文档序号:23688764发布日期:2021-01-23 09:48阅读:368来源:国知局
一种基于Linux的进程流量监控方法、系统及设备与流程
一种基于linux的进程流量监控方法、系统及设备
技术领域
[0001]
本发明涉及计算机技术领域,更具体的说是涉及一种基于linux的进程流量监控方法、系统及设备。


背景技术:

[0002]
linux下的进程流量监控功能,即linux系统上监测各个进程产生的上行和下行流量,并对超过阈值的流量进行阻断的功能,目前实现的方法是:在linux netfilter内核模块的nf_inet_local_in和nf_inet_local_out两个挂载点挂载自己的hook函数,在这两个函数中对进程产生的流量进行统计和控制,但这个方法存在问题:由于netfilter模块工作在中断上下文中,它拿到的进程名是不准确的,导致对进程的流量监控会存在误差。


技术实现要素:

[0003]
针对以上问题,本发明的目的在于提供一种基于linux的进程流量监控方法、系统及设备,能够在内核层准确地拿到网络包对应的进程名称,准确统计进程的上下行流量信息。
[0004]
本发明为实现上述目的,通过以下技术方案实现:一种基于linux的进程流量监控方法,包括如下步骤:
[0005]
s1:在系统应用层获取当前运行的进程名称;
[0006]
s2:根据进程名称获取对应的socket文件的inode号;
[0007]
s3:把进程与inode号的映射关系通过netlink通信发到系统内核层,并保存;
[0008]
s4:系统内核层在netfilter模块的挂载点上挂载hook函数,用于对进出本机的网络数据包进行处理;
[0009]
s5:在hook函数中获取网络数据包所属socket文件的inode号,进而确定产生网络流量的进程;
[0010]
s6:计算产生网络流量的进程流量信息,并发送至系统应用层进行展示。
[0011]
进一步,所述步骤s1包括:
[0012]
遍历系统的proc目录的每个子目录,从所述子目录下的exe链接文件解析到它指向的可执行程序文件,从而可以得到当前运行的进程名称。
[0013]
进一步,所述步骤s2包括:
[0014]
在系统的proc目录的每个子目录的fd目录下,获取对应进程的socket文件,并从socket文件的链接信息获取socket文件的inode号。
[0015]
进一步,所述步骤s4包括:
[0016]
系统内核层在netfilter模块的nf_inet_local_in检测点和nf_inet_local_out检测点上注册hook函数,用于对进出本机的网络数据包进行处理。
[0017]
进一步,所述步骤s5包括:
[0018]
s51:在hook函数中,根据记录网络数据包信息的struct sk_buff参数的sk_
socket字段获取struct socket数据,
[0019]
s52:根据struct socket数据的file字段获得struct file数据;
[0020]
s53:根据struct file数据的f_path.dentry字段获得dentry数据;
[0021]
s54:根据dentry数据的d_inode字段获得inode数据;
[0022]
s55:根据inode数据的i_ino字段获取socket文件的inode号;
[0023]
s56:根据inode号在进程与inode号的映射关系中确定网络数据包所属的进程名称。
[0024]
进一步,所述步骤s6包括:
[0025]
s61:获取传输层头部长度,并计算出传输的数据流量;
[0026]
s62:将传输的数据流量累加在对应的网络数据包所属的进程上,根据策略配置的进程流量上限对网络数据包做出是否丢弃的判断;
[0027]
s63:把网络数据包所属的进程累计的上下行流量信息发送至系统应用层进行展示。
[0028]
相应的,本发明还公开了一种基于linux的进程流量监控系统,包括:
[0029]
获取模块,用于在系统应用层获取当前运行的进程名称,并根据进程名称获取对应的socket文件的inode号;
[0030]
传输模块,用于把进程与inode号的映射关系通过netlink通信发到系统内核层,并保存;
[0031]
挂载模块,用于系统内核层在netfilter模块的挂载点上挂载hook函数,用于对进出本机的网络数据包进行处理;
[0032]
进程确定模块,用于在hook函数中获取网络数据包所属socket文件的inode号,进而确定产生网络流量的进程;
[0033]
计算展示模块,用于计算产生网络流量的进程流量信息,并发送至系统应用层进行展示。
[0034]
相应的,本发明还公开了一种基于linux的进程流量监控设备,包括:
[0035]
存储器,用于存储计算机程序;
[0036]
处理器,用于执行所述计算机程序时实现如上文任一项所述基于linux的进程流量监控方法步骤。
[0037]
对比现有技术,本发明有益效果在于:本发明提供了一种基于linux的进程流量监控方法、系统及设备,通过在应用层遍历各进程打开的socket文件,获得socket文件的inode号,把进程与inode号的映射关系通过netlink发到内核层,在内核层netfilter模块的hook函数中,从sk_buff结构获得网络包所属socket文件的inode号,用此inode号在上述对应关系中找到对应的进程名称,从而可以精确到统计到某个进程上行和下行的流量数据,用于进程流量的监测和控制。
[0038]
另外,本发明除了可以统计进程产生的上下行流量数据,还可以根据流量是否超出阈值对网络传输进行阻断。
[0039]
由此可见,本发明与现有技术相比,具有突出的实质性特点和显著的进步,其实施的有益效果也是显而易见的。
附图说明
[0040]
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。
[0041]
附图1是本发明的方法流程图。
[0042]
附图2是本发明的系统结构图。
具体实施方式
[0043]
下面结合附图对本发明的具体实施方式做出说明。
[0044]
如图1所示的一种基于linux的进程流量监控方法,包括如下步骤:
[0045]
s1:在系统应用层获取当前运行的进程名称。
[0046]
linux系统的proc目录是进程信息的存放目录,它下面的每个目录对应每个运行的进程,进入proc的每个子目录,从子目录下的exe链接文件解析到它指向的可执行程序文件,从而可以得到进程名。
[0047]
s2:根据进程名称获取对应的socket文件的inode号。
[0048]
在proc的每个子目录的fd目录下,存放着每个运行的进程打开的所有文件描述符链接,并以socket文件的形式存放,socket文件的链接信息中存放着socket文件的inode号。读取socket文件的链接信息,即可获取对应的socket文件的inode号。
[0049]
s3:把进程与inode号的映射关系通过netlink通信发到系统内核层,并保存。
[0050]
s4:系统内核层在netfilter模块的挂载点上挂载hook函数,用于对进出本机的网络数据包进行处理。
[0051]
netfilter模块是linux内核层中处理网络数据包的一个子系统,它在网络流程的5个位置放置了检测点,在每个检测点上可以注册处理函数对网络包进行处理。
[0052]
本步骤在nf_inet_local_in和nf_inet_local_out两个检测点上注册了hook函数,即对进出本机的网络数据包进行处理。
[0053]
s5:在hook函数中获取网络数据包所属socket文件的inode号,进而确定产生网络流量的进程。
[0054]
在注册的两个hook函数中,都有一个记录网络数据包信息的struct sk_buff参数,根据sk_buff的sk_socket字段获取struct socket数据,根据socket的file字段获得struct file数据,根据file的f_path.dentry字段获得dentry数据,根据dentry的d_inode字段获得inode数据,根据inode的i_ino字段获取socket文件的inode号,用这个inode号到步骤s3中保存的映射关系中查到这个网络数据包所属的进程名称。即确定了产生网络流量的进程。
[0055]
s6:计算产生网络流量的进程流量信息,并发送至系统应用层进行展示。
[0056]
具体来说,用ip_hdr获取sk_buff的ip头部,分析ip头部信息,获得ip头部长度和protocol字段,再分别获取tcp头部或udp头部,分析头部信息获得传输层头部长度,用总长度减去ip头部长度和传输层头部长度,得到此次传输的数据流量,累加在对应的产生网络流量的进程上,根据策略配置的进程流量上限对此网络数据包做出是否丢弃的判断,并把
相应进程累计的上下行流量信息发给应用层用于展示。
[0057]
相应的,如图2所示,本发明还公开了一种基于linux的进程流量监控系统,包括:
[0058]
获取模块,用于在系统应用层获取当前运行的进程名称,并根据进程名称获取对应的socket文件的inode号;
[0059]
传输模块,用于把进程与inode号的映射关系通过netlink通信发到系统内核层,并保存;
[0060]
挂载模块,用于系统内核层在netfilter模块的挂载点上挂载hook函数,用于对进出本机的网络数据包进行处理;
[0061]
进程确定模块,用于在hook函数中获取网络数据包所属socket文件的inode号,进而确定产生网络流量的进程;
[0062]
计算展示模块,用于计算产生网络流量的进程流量信息,并发送至系统应用层进行展示。
[0063]
相应的,本发明还公开了一种基于linux的进程流量监控设备,包括:
[0064]
存储器,用于存储计算机程序;
[0065]
处理器,用于执行所述计算机程序时实现如上文任一项所述基于linux的进程流量监控方法步骤。
[0066]
本领域的技术人员可以清楚地了解到本发明实施例中的技术可借助软件加必需的通用硬件平台的方式来实现。基于这样的理解,本发明实施例中的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中如u盘、移动硬盘、只读存储器(rom,read-only memory)、随机存取存储器(ram,random access memory)、磁碟或者光盘等各种可以存储程序代码的介质,包括若干指令用以使得一台计算机终端(可以是个人计算机,服务器,或者第二终端、网络终端等)执行本发明各个实施例所述方法的全部或部分步骤。本说明书中各个实施例之间相同相似的部分互相参见即可。尤其,对于终端实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例中的说明即可。
[0067]
在本发明所提供的几个实施例中,应该理解到,所揭露的系统、系统和方法,可以通过其它的方式实现。例如,以上所描述的系统实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,系统或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
[0068]
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
[0069]
另外,在本发明各个实施例中的各功能模块可以集成在一个处理单元中,也可以是各个模块单独物理存在,也可以两个或两个以上模块集成在一个单元中。
[0070]
同理,在本发明各个实施例中的各处理单元可以集成在一个功能模块中,也可以是各个处理单元物理存在,也可以两个或两个以上处理单元集成在一个功能模块中。
[0071]
结合附图和具体实施例,对本发明作进一步说明。应理解,这些实施例仅用于说明本发明而不用于限制本发明的范围。此外应理解,在阅读了本发明讲授的内容之后,本领域技术人员可以对本发明作各种改动或修改,这些等价形式同样落于本申请所限定的范围。
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1