找了一年没有找到这样一款 Linux 流量监控工具

2018-08-23 16:32:04 +08:00
 DearTanker

一直在找一款任意形式可以查看 Linux 端口流量消耗统计程序。

有个大前提:

然后前前后后翻遍了谷歌各种关键字,github 也翻了好几遍,目前能找到最接近的是 2 款。

其一、Ntopng

这款在线监控可以很容易部署网页版,但是只提供端口流量占用排行,不提供具体流量统计,而且除此之外的功能全部用不上,并且实际测试发现不是很稳定,重启或者崩溃后历史数据全部丢失。

其二、Flowmon

这款也是在线监控,目前还不支持部署到 KVM 机器中,但是提供了端口流量占用及排序,完全符合需求。 有兴趣可以看一下官网的 demo。

https://demo.flowmon.com/fmc/analysis/

账号密码都是:demo

想请教各位大佬,有没有能满足这个需求的解决方案?

10888 次点击
所在节点    问与答
34 条回复
sbw
2018-08-23 16:39:04 +08:00
换个桌子啊,nftables (
DearTanker
2018-08-23 16:43:25 +08:00
@sbw #1 忘了说,只能用 Firewalld 呢。。。
innoink
2018-08-23 16:47:42 +08:00
借楼问一问,有没有能统计本地各进程网速流量的工具?
DearTanker
2018-08-23 16:49:26 +08:00
忘了补充了,不是 iptraf 这种实时统计的指令,这些网络监控指令大大小小基本全都试过了,没办法让后台运行进行统计。。
DearTanker
2018-08-23 16:49:50 +08:00
@innoink #3 貌似这种的还是很多的。。支持 windows。
innoink
2018-08-23 16:52:08 +08:00
@DearTanker linux 里面好像还没见过
xiaoz
2018-08-23 16:59:13 +08:00
和楼主有相同的需求,google 和 github 搜了几遍,试了好几个都达不到效果。
DearTanker
2018-08-23 17:01:34 +08:00
@innoink #6 实时的有大把,统计的我也没见过。
DearTanker
2018-08-23 17:02:02 +08:00
@xiaoz #7 目前为止,清一色的基于 iptables。。
jasonyang9
2018-08-23 17:05:47 +08:00
firewalld 不就是 iptable 套了个壳么
DearTanker
2018-08-23 17:08:07 +08:00
@jasonyang9 #10 但是并没有办法支持统计流量的对应参数。翻过文档了。
Phant0m
2018-08-23 17:16:04 +08:00
FakeNet-NG 了解一下?
DearTanker
2018-08-23 17:24:37 +08:00
@Phant0m #12 貌似只能一个个端口添加到配置文件中,这样如果端口有几百个。。。。
Phant0m
2018-08-23 17:33:51 +08:00
@DearTanker 可以找找基于 PF_RING 的一些网络监控工具
angryRabbit
2018-08-23 19:11:58 +08:00
其实我也找这个工具很久了,一直没有发现。大多数都是进程自己统计自己流量,比如 apache 有这个功能。能不能进程外统计呢?

我有个思路,可以自己实现试一下。
+ 自己实现一个进程,叫 confiner。confiner 监听 80、443 等端口。
+ confiner 将流量转发到 60080、60443 端口。confiner 可以进行流量统计、流量监听。
+ 其实这就是 iptables 的 user-space 版。区别是:iptables 工作在网络层,这个程序工作在传输层。
+ 实现难易度:容易。易用性:不易用

思路 2:
+ 为什么 kernel 可以统计每一个 eth interface 的流量?就是因为 kernel 的计数单位是 eth interface。
+ 给每一个要监控的进程都创建一个 eth interface,就可以了。
+ 但是,eth interface 可能收到广播,广播不能算发送给进程的数据包。所以 interface rx 肯定大于实际用量
+ 实现难易度:容易。易用性:不易用



楼主的问题是“所有进程”。这个问题就有点困难了,感觉必须要改动 kernel 的源码,可以看看现在的 android 是怎么实现的。经过冥思苦想,又想到了下一个思路:

思路 3:
+ 实现自定义的 glibc,然后覆盖系统提供的 glibc。在 glibc 中修改可以一次性把所有进程都改了。
+ 原理:socket 是 system call。system call 是内核实现的,但怎么从 user-space 切换为 kernel-space 呢?肯定需要配置 cpu stack、然后执行某个 CPU instruction,而 libc 已经做好了这一切。所以调用 system call 实际调用的都是 libc。
+ 每次收到数据包都先记录在内存中,当 rx 或 tx 超过 10KB 写入到一个文件,然后 user-space 进程取读取这个文件。
+ 实现难易度:容易。易用性:易用
bobyang
2018-08-23 19:51:18 +08:00
谢谢,很不错啊!试试吧
DearTanker
2018-08-23 20:00:05 +08:00
@angryRabbit #15 我应该说的是统计指定端口范围 /指定端口的流量,不是指某些进程。
其实 ntopng 可以做到统计端口流量的,只不过貌似这个工具的重心不在这边。
ntopng 是基于 tcpdump 中的 Libpcap 来进行包解析的,但是我通过 Libpcap 来查询相关的工具,也没有找到统计 tcp 端口流量的工具。
DearTanker
2018-08-23 20:02:30 +08:00
@Phant0m #14 谢谢,找找看。
phoenixlzx
2018-08-23 20:18:43 +08:00
我觉得已经猜到你要做什么了。

不过,你找的这些工具都是分析骨干网络流量的,不是分析系统流量的。Linux 系统内能实时看端口流量的比如 nethogs? 但是也没法生成统计报表。

所以建议你直接去把这功能做到你要用的程序里。
hailinxyz
2018-08-23 20:25:09 +08:00
我前两天也在研究这个
我的是两个方案 iptables 和 tcpdump
比较了一下 好像还是 iptables 好 和 zabbix 出图还行 看端口速率和总流量
tcpdump 要一直监听所有包 占系统资源
不过通过 tcpdump 解析包来计数应该可以达到你的目的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/482579

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX