Linux进程网络流量统计的实现过程

 更新时间:2018年09月17日 10:11:51   作者:zhouqiao  
这篇文章主要介绍了Linux进程网络流量统计的实现过程,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下

前言

linux都有相应开源工具实时采集网络连接、进程等信息其中网络连接一般包括最基本的五元组信息(源地址、目标地址、源端口、目标端口、协议号)再加上所属进程信息pid, exe, cmdline)等。其中这两项数据大多可直接读取linux /proc目录下的网络状态连接文件/proc/net/tcp、/proc/net/udp), 进程状态目录(/proc/pid/xx) 。

在某些应用安全场景需要结合进程网络连接、流入流出流量等数据可分析出是否在内网存在恶意外传敏感数据现象在网络监控 时发现 服务器大量带宽被占用但不清楚由系统具体哪个进程占用 。为此都需要获取到更细粒度的进程级网络流量数据综合分析。

在linux proc目录下可查到主机级网络数据,例如/proc/net/snmp提供了主机各层IP、ICMP、ICMPMsg、TCP、UDP详细数据,/proc/net/netstat 文件 InBcastPkts、 OutBcastPkts、InOctets、OutOctets字段表示主机的收发包数、收包字节数据。很可惜没有 进程级流入流出网络流量数据。

为此参考nethogs原理实现统计进程级网络流量方式。

基本数据

涉及proc以下几个目录或文件网络状态文件/proc/net/tcp、/proc/net/udp, 进程文件描述符目录/proc/pid/fd。

网络状态文件/proc/net/tcp

我们重点关注五元组+状态+inode号分别在第2、3、4、11列

其中第23列分别是主机字节序ip:port ,例如”0500000A:0016″ -> “10.0.0.5″, 22

第4列是状态信息状态字段含义如下:

“01″: “ESTABLISHED”,
“02″: “SYN_SENT”,
“03″: “SYN_RECV”,
“04″: “FIN_WAIT1″,
“05″: “FIN_WAIT2″,
“06″: “TIME_WAIT”,
“07″: “CLOSE”,
“08″: “CLOSE_WAIT”,
“09″: “LAST_ACK”,
“0A”: “LISTEN”,
“0B”: “CLOSING”

第11列是inode号 linux系统文件系统中的一个文件系统对象包括文件、目录、设备文件、socket、管道等的元信息。


进程文件描述符

/proc/pid/fd目录下列出当前进程打开的文件信息其中0、1、2表示标准输入、输出、错误。

网络连接是以socket:开头的文件描述符,其中[]号内的是inode号这样与网络状态文件/proc/net/tcp下的inode号可对应起来

以pid:25133进程为例, 文件描述符是10、12 对应inode号分别是512505532、512473483的网络连接,同时在下图中的/proc/net/tcp都可以查找到对应连接的详细信息。

根据上述文件信息可以从/proc/net/tcp建立起网络连接五元组->inode的映射, 而 /proc/pid/fd建立起连接inode ->进程的映射。

这样 通过inode号作为桥梁关联起系统内的进程与网络连接的信息。

实现流程

为了实时获取网络连接流量在linux主机上使用开源libpcap库来抓取网络报文。整个实现流程图如下包含以下5个关键步骤。

抓包

使用抓包Libpcap库获取到网络packet结构。

解析报文

解析出packet的五元组(源地址、目标地址、源端口、目标端口、协议号)信息和当前包的流量大小。

缓存更新

在ConnInodeHash查找五元组组成的key对应的inode号如果不存在重新读取/proc/net/tcp与udp刷新ConnInodeHash缓存建立起连接与inode的映射并重新读取/proc/pid/fd目录对所有文件描述符遍历过滤出以socket:开头的连接刷新InodeProcessHash缓存重新建立inode与进程的映射。

hash查找

根据查找到inode号在InodeProcessHash查找相应进程pid。

统计流量

根据报文地址,判断网络连接方向,累加进程流入、流出数据。

总结

对linux主机抓包,结合网络状态文件、进程文件描述符实现一种细粒度的进程级网络流量采集方式。

通过linux 文件inode号作为桥梁,关联出进程、网络连接的关系,可以统计进程接收/发送的总量/平均值等各维度数据,也可以分析出进程各个网络连接的流量数据,这些在主机流量安全分析、网络监控排查等场景方面可作为重要依据。但同时也需要注意的是持续通过libpcap抓包对主机性能有损耗影响。

以上所述是小编给大家介绍的Linux进程网络流量统计的实现过程,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • Ubuntu基础设定:openssh-server的安装和使用介绍

    Ubuntu基础设定:openssh-server的安装和使用介绍

    今天小编就为大家分享一篇关于Ubuntu基础设定:openssh-server的安装和使用介绍,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • Linux内存泄漏检测shell脚本

    Linux内存泄漏检测shell脚本

    这篇文章主要为大家详细介绍了Linux内存泄漏检测shell脚本,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • 详解Ubuntu16.04下Hadoop 2.7.3的安装与配置

    详解Ubuntu16.04下Hadoop 2.7.3的安装与配置

    本篇文章主要介绍了详解Ubuntu16.04下Hadoop 2.7.3的安装与配置,具有一定的参考价值,有兴趣的可以了解一下。
    2017-01-01
  • Linux中怎么通过PID号找到对应的进程名及所在目录方法

    Linux中怎么通过PID号找到对应的进程名及所在目录方法

    本篇文章主要介绍了Linux中怎么通过PID号找到对应的进程名及所在目录方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-06-06
  • 关于Linux vi命令使用详解(vim编辑器)

    关于Linux vi命令使用详解(vim编辑器)

    这篇文章主要介绍了关于Linux vi命令使用详解(vim编辑器),文中详细列举了vi命令的用法,还不熟悉的朋友可以多看一下
    2023-03-03
  • 红帽RHEL8和7的区别对比分享(Centos8与7参照redhat)

    红帽RHEL8和7的区别对比分享(Centos8与7参照redhat)

    这篇文章主要介绍了红帽RHEL8和7有什么区别(Centos8与7参照redhat),包括红帽RHEL8和RHEL7功能区别对比和RHEL8额外新功能新特性,对红帽RHEL8和7相关知识感兴趣的朋友跟随小编一起看看吧
    2023-01-01
  • Linux加载vmlinux调试

    Linux加载vmlinux调试

    今天小编就为大家分享一篇关于Linux加载vmlinux调试,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • Shell中的单中括号和双中括号的用法详解

    Shell中的单中括号和双中括号的用法详解

    shell中的中括号在条件测试中是使用最频繁的,无论是中括号还是双中括号,可用于一些条件的测试:算术比较、文件属性测试、字符串比较。这篇文章主要介绍了Shell中的单中括号和双中括号的用法详解,需要的朋友可以参考下
    2022-12-12
  • 详解linux centos yum安装LAMP环境

    详解linux centos yum安装LAMP环境

    本篇文章主要介绍了linux centos yum安装LAMP环境 ,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧。
    2016-12-12
  • CentOS7环境下gcc(版本10.2.0)升级详细过程

    CentOS7环境下gcc(版本10.2.0)升级详细过程

    大家好,本篇文章主要讲的是CentOS7环境下gcc(版本10.2.0)升级详细过程,感兴趣的同学快来看一看吧,希望对你有帮助
    2021-11-11

最新评论