V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
chenjiandongx
V2EX  ›  分享创造

sniffer: 一个现代化的全平台进程流量分析工具

  •  3
     
  •   chenjiandongx · 2021-11-18 10:17:05 +08:00 · 3599 次点击
    这是一个创建于 1112 天前的主题,其中的信息可能已经有所发展或是发生改变。

    sniffer 项目地址https://github.com/chenjiandongx/sniffer

    在 Linux 系统中,进程的多数指标数据都能在 /proc/${PID} 路径下获取到,但网络 IO 的数据,比如网络流量或者进出网络包吞吐量这类的是没有办法直接读取到的。一番搜索后,在 Github 上找到两个工具,imsnif/bandwhichraboof/nethogs,前者使用 Rust 编写,后者使用 C++ 编写。bandwhich 界面精巧并且支持以多种视角查看流量数据,像 Socket 连接、进程以及远程端点,但不支持传入 BPF 过滤条件,比如只想查看某个端口的流量数据或者过滤某个 IP 的数据。而 nethlogs 支持 BPF 过滤条件但只能以进程维度查看数据。

    那问题就来了,能不能两者兼得呢?既能使用 BPF 过滤特性又能以多种视角查看数据。

    当然可以,自己动手写一个不就行了。

    chenjiandongx/sniffer 是一个 Golang 编写的,支持 TCP/UDP 协议,用于查看分析进程或者连接的流量情况的命令行工具。既然要查看进程流量,那如何高效的将网络包的信息将进程信息关联起来就显得十分重要了。在 sniffer 中,Linux 系统下使用的是类似 ss 命令的 netlink socket ,只获取 ESTABLISHED 状态的连接,而不是直接读取 /proc/net/* 下面的数据,这种做法更高效,因为主机上可能存在大量的 TimeWait 的链接,这些链接是不会有流量的,所以无需纳入统计范围内。而 MacOS 上则用的是 losf 命令,也是仅获取 ESTABLISHED 状态的连接。Windows 上就比较简单粗暴了,直接使用 shirou/gopsutil 提供的 API 。

    用法介绍

    ❯ sniffer -h
    # A modern alternative network traffic sniffer.
    
    Usage:
      sniffer [flags]
    
    Examples:
      # processes mode for pid 1024,2048 in MB unit
      $ sniffer -p 1024 -p 2048 -m 2 -u MB
    
      # only capture the TCP protocol packets with lo,eth prefixed devices
      $ sniffer -b tcp -d lo -d eth
    
    Flags:
      -b, --bpf string                   specify string pcap filter with the BPF syntax (default "tcp or udp")
      -d, --devices-prefix stringArray   prefixed devices to monitor (default [en,lo,eth,em,bond])
      -h, --help                         help for sniffer
      -i, --interval int                 interval for refresh rate in seconds (default 1)
      -l, --list                         list all devices name
      -m, --mode int                     view mode of sniffer (0: bytes 1: packets 2: processes)
      -n, --no-dns-resolve               disable the DNS resolution
      -p, --pids int32Slice              pids to watch, empty stands for all pids (default [])
      -u, --unit string                  unit of traffic stats in processes mode, optional: B, KB, MB, GB (default "KB")
      -v, --version                      version for sniffer
    

    截图预览

    Bytes Mode: 以流量视角查看数据

    Packets Mode: 以网络包视角渲染数据。

    Processes Mode: 进程整体维度展示数据。

    17 条回复    2021-11-22 23:28:46 +08:00
    nasmatic
        1
    nasmatic  
       2021-11-18 10:45:30 +08:00
    给一代目打 call
    defunct9
        2
    defunct9  
       2021-11-18 11:51:58 +08:00
    不错,不错
    sbilly
        3
    sbilly  
       2021-11-18 13:14:48 +08:00
    赞~
    能生成抓包文件么?
    chenjiandongx
        4
    chenjiandongx  
    OP
       2021-11-18 13:25:28 +08:00
    @sbilly 抓包文件暂时还不支持 是想在使用的时候同时生成文件 然后退出进程的时候将抓包文件落盘?
    chenjiandongx
        5
    chenjiandongx  
    OP
       2021-11-18 13:26:06 +08:00
    @nasmatic 钓鱼佬永不空军
    wellsc
        6
    wellsc  
       2021-11-18 13:31:31 +08:00
    👍🏻
    Archeb
        7
    Archeb  
       2021-11-18 20:07:42 +08:00
    很直观,正是我需要的,赞!
    guyskk0x0
        8
    guyskk0x0  
       2021-11-18 21:59:37 +08:00
    很不错,求发布单文件可执行包~
    sbilly
        9
    sbilly  
       2021-11-19 00:23:17 +08:00
    @chenjiandongx 把制定的网络数据包写入磁盘
    sola97
        10
    sola97  
       2021-11-19 19:02:48 +08:00
    不错,我为了编译二进制还特地放到 docker 里编译完再拿出来,有 release 就好了
    chenjiandongx
        11
    chenjiandongx  
    OP
       2021-11-19 22:24:36 +08:00
    @guyskk0x0 这个之前试过提供过 不过有开发者反馈不能直接使用 参见 issue https://github.com/chenjiandongx/sniffer/issues/1
    chenjiandongx
        12
    chenjiandongx  
    OP
       2021-11-19 22:25:00 +08:00
    @sola97 同上
    chenjiandongx
        13
    chenjiandongx  
    OP
       2021-11-19 22:25:40 +08:00
    @sbilly 是为了拿到 wireshark 上分析吗?
    guyskk0x0
        14
    guyskk0x0  
       2021-11-19 22:34:32 +08:00
    @chenjiandongx #11 有点遗憾,看来是依赖系统的 libpcap 库,导致没法静态编译
    chenjiandongx
        15
    chenjiandongx  
    OP
       2021-11-19 22:37:50 +08:00
    如果是相同或者兼容的 libpcap 库应该可以,我试过在 macos 上编译 windows 版本,放到 windows 能跑起来
    sbilly
        16
    sbilly  
       2021-11-20 04:32:57 +08:00
    zhaoawd
        17
    zhaoawd  
       2021-11-22 23:28:46 +08:00
    正好需要一个流量监控工具
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1052 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 19:26 · PVG 03:26 · LAX 11:26 · JFK 14:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.