找了一年没有找到这样一款 Linux 流量监控工具 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
DearTanker
V2EX    问与答

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

  •  1
     
  •   DearTanker 2018-08-23 16:32:04 +08:00 11501 次点击
    这是一个创建于 2612 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    有个大前提:

    • 不能基于 iptables (别问为什么,业务如此)
    • 支持 CentOS 7

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

    其一、Ntopng

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

    其二、Flowmon

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

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

    账号密码都是:demo

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

    34 条回复    2018-09-15 18:01:53 +08:00
    sbw
        1
    sbw  
       2018-08-23 16:39:04 +08:00
    换个桌子啊,nftables (
    DearTanker
        2
    DearTanker  
    OP
       2018-08-23 16:43:25 +08:00
    @sbw #1 忘了说,只能用 Firewalld 呢。。。
    innoink
        3
    innoink  
       2018-08-23 16:47:42 +08:00 via Android
    借楼问一问,有没有能统计本地各进程网速流量的工具?
    DearTanker
        4
    DearTanker  
    OP
       2018-08-23 16:49:26 +08:00
    忘了补充了,不是 iptraf 这种实时统计的指令,这些网络监控指令大大小小基本全都试过了,没办法让后台运行进行统计。。
    DearTanker
        5
    DearTanker  
    OP
       2018-08-23 16:49:50 +08:00
    @innoink #3 貌似这种的还是很多的。。支持 windows。
    innoink
        6
    innoink  
       2018-08-23 16:52:08 +08:00 via Android
    @DearTanker linux 里面好像还没见过
    xiaoz
        7
    xiaoz  
       2018-08-23 16:59:13 +08:00
    和楼主有相同的需求,google 和 github 搜了几遍,试了好几个都达不到效果。
    DearTanker
        8
    DearTanker  
    OP
       2018-08-23 17:01:34 +08:00
    @innoink #6 实时的有大把,统计的我也没见过。
    DearTanker
        9
    DearTanker  
    OP
       2018-08-23 17:02:02 +08:00
    @xiaoz #7 目前为止,清一色的基于 iptables。。
    jasonyang9
        10
    jasonyang9  
       2018-08-23 17:05:47 +08:00
    firewalld 不就是 iptable 套了个壳么
    DearTanker
        11
    DearTanker  
    OP
       2018-08-23 17:08:07 +08:00
    @jasonyang9 #10 但是并没有办法支持统计流量的对应参数。翻过文档了。
    Phant0m
        12
    Phant0m  
       2018-08-23 17:16:04 +08:00
    FakeNet-NG 了解一下?
    DearTanker
        13
    DearTanker  
    OP
       2018-08-23 17:24:37 +08:00
    @Phant0m #12 貌似只能一个个端口添加到配置文件中,这样如果端口有几百个。。。。
    Phant0m
        14
    Phant0m  
       2018-08-23 17:33:51 +08:00
    @DearTanker 可以找找基于 PF_RING 的一些网络监控工具
    angryRabbit
        15
    angryRabbit  
       2018-08-23 19:11:58 +08:00   3
    其实我也找这个工具很久了,一直没有发现。大多数都是进程自己统计自己流量,比如 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
        16
    bobyang  
       2018-08-23 19:51:18 +08:00 via Android
    谢谢,很不错啊!试试吧
    DearTanker
        17
    DearTanker  
    OP
       2018-08-23 20:00:05 +08:00
    @angryRabbit #15 我应该说的是统计指定端口范围 /指定端口的流量,不是指某些进程。
    其实 ntopng 可以做到统计端口流量的,只不过貌似这个工具的重心不在这边。
    ntopng 是基于 tcpdump 中的 Libpcap 来进行包解析的,但是我通过 Libpcap 来查询相关的工具,也没有找到统计 tcp 端口流量的工具。
    DearTanker
        18
    DearTanker  
    OP
       2018-08-23 20:02:30 +08:00
    @Phant0m #14 谢谢,找找看。
    phoenixlzx
        19
    phoenixlzx  
       2018-08-23 20:18:43 +08:00
    我觉得已经猜到你要做什么了。

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

    所以建议你直接去把这功能做到你要用的程序里。
    hailinxyz
        20
    hailinxyz  
       2018-08-23 20:25:09 +08:00 via Android
    我前两天也在研究这个
    我的是两个方案 iptables 和 tcpdump
    比较了一下 好像还是 iptables 好 和 zabbix 出图还行 看端口速率和总流量
    tcpdump 要一直监听所有包 占系统资源
    不过通过 tcpdump 解析包来计数应该可以达到你的目的。
    hailinxyz
        21
    hailinxyz  
       2018-08-23 20:26:59 +08:00 via Android
    @phoenixlzx 好思路
    DearTanker
        22
    DearTanker  
    OP
       2018-08-23 20:35:39 +08:00
    @hailinxyz #20 有想过,就是按照这个找遍了天涯海角,也没看到相关链接。
    innoink
        23
    innoink  
       2018-08-23 22:22:34 +08:00 via Android
    @DearTanker 比如说 nethogs?但是这个是基于 pcap,容易吃 cpu
    Judoon
        24
    Judoon  
       2018-08-23 22:58:20 +08:00 via Android
    如果找不到好的工具,我觉得你的思路可以转变一下。用容器来隔离每个程序,然后统计每个容器的网络情况就行了。

    说白了其实就是 k8s 配普罗米修斯那一套。
    Judoon
        25
    Judoon  
       2018-08-23 23:02:27 +08:00 via Android
    ntopng 之前玩过,主要的应用场景是旁路布署在核心网络上,镜像转发所有流量过来后,能可视化整个网络的流量情况
    ksharp8
        26
    ksharp8  
       2018-08-23 23:07:25 +08:00
    有基于 web 版的 cacti 或 zabbix
    DearTanker
        27
    DearTanker  
    OP
       2018-08-23 23:27:40 +08:00
    @innoink #23 只能实时,没法用于统计吧。
    DearTanker
        28
    DearTanker  
    OP
       2018-08-23 23:45:06 +08:00
    @ksharp8 #26 貌似这 2 款,如果要监控端口的话,必须一个个手动指定。
    liangzi
        29
    liangzi  
       2018-08-24 05:20:53 +08:00 via Android
    iftop 命令 试一下 指定接口加个输出参数写到指定文件里面后台运行。。。
    josephshen
        30
    josephshen  
       2018-08-24 10:22:39 +08:00 via iPhone   1
    angry rabbit 的思路三我觉得很好啊。hack libc,修改里面的 read 和 write 函数,记录下端口对应的句柄,而且可以针对特定的应用程序,在加载 libc 的之前选择是否是 hack 后的 libc,缺点是静态链接的程序就不行了。我记得前一段时间论坛里有一个给指定程序做代理的方案,就是在 Windows 下通过拦截读写函数的。
    Rehtt
        31
    Rehtt  
       2018-09-03 07:42:23 +08:00 via Android
    读取 /proc/net/dev 文件呢
    fuge
        32
    fuge  
       2018-09-03 09:28:57 +08:00
    netdata
    DearTanker
        33
    DearTanker  
    OP
       2018-09-03 17:25:45 +08:00
    @Rehtt #31 你这个还是总流量啊。注意审题。。
    reus
        34
    reus  
       2018-09-15 18:01:53 +08:00
    systemtap,sysdig
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5443 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 36ms UTC 08:53 PVG 16:53 LAX 01:53 JFK 04:53
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86