![linux:如何获取流量统计数据](https://linux22.com/image/526274/linux%EF%BC%9A%E5%A6%82%E4%BD%95%E8%8E%B7%E5%8F%96%E6%B5%81%E9%87%8F%E7%BB%9F%E8%AE%A1%E6%95%B0%E6%8D%AE.png)
我有一个基于 Linux 的桥接器。我想计算每个经过的 IP 产生了多少流量。换句话说,我想获取如下文件:
src_IP dst_IP pkt_size
1.1.1.1 2.2.2.2 12304
3.3.3.3 4.4.4.4 430
....
linux 下有没有什么工具可以做到这一点?
我已经在 ulog 上搜索过,但是这两个“会计守护进程”项目似乎都被放弃了(它们的网页无法使用)。使用 tcpdump 捕获流量然后分析转储可能是一种选择,但是我不知道如何从转储中获取数据包大小。
如果有办法的话,请告诉我。
答案1
在 IP 报头中,您有一个 TOTAL LENGTH 报头,其中包含“数据报的长度,以八位字节为单位,包括互联网报头和数据。”(RFC 791)。如果您只想获得数据包的有效负载大小,则需要执行 TOTAL LENGTH 减去(IP 报头长度 + (TCP|UDP) 报头长度)。(IP 报头长度在 IHL 报头中,TCP 报头长度在数据偏移报头中)。
使用基本的 tcpdump 命令,例如
# tcpdump -s 1500 -Svni eth0 tcp and port 80
我将显示每个 TCP 数据包如下
11:58:52.114411 IP(tos 0x0、ttl 53、id 5745、偏移量 0、标志 [DF]、proto TCP(6)、长度 505)
12.66.33.88.53247 > 88.231.98.32.80: Flags [P.], cksum 0x62fd (correct), seq 1193308573:1193309026, ack 2122411067, win 46, options [nop,nop,TS val 122841090 ecr 125780554], length 453
第一行包含 IP 报头,包括总长度(长度 505)。第二行包含 tcp 报头,包括有效负载长度(长度 453),即 505 - 52(52 为 IP + TCP 报头的长度)。
如果您想自动执行此操作,您可以设置 tcpdump 将捕获存储在 pcap 文件中,然后使用脚本解析 pcap。
但是,如果您想快速完成此操作而不降低性能,您应该查看 libnetfilter_queue。这需要用 C 编写一些代码,但实际上并不多。这个想法是您在 netfilter 中放置一个钩子以将流量引导到您的程序。从那里您可以解析 ip|tcp|udp 标头并计算您的信息,如果需要,将其放入 RRD 数据库中,然后将流量重新注入 netfilter。
答案2
首先让我们先介绍一个可以实时查看这些数据的工具:iftop
其次,我认为有必要指出,像 tcpdump 这样的侵入式数据包捕获和分析会对您的接口和计算资源造成损害。除非您设置一个单独的系统,盲目地监视线路上的流量而不接触它,例如 snort,否则您将受到打击。永远不要忘记这一点,否则您的网络将陷入困境,当负载上升时,人们会想知道它为什么这么糟糕!
(编辑:从我上次停下的地方继续)
最后,如果您确实需要一个永久的日志解决方案,那么您将需要一些可以分析和记录数据包数据的工具。为此,有很多工具,但我最近都没有使用过。ngrep
以前这是一个很好的方法,bmon
但我不知道现在是否还存在。tcpdstat
看起来它可能是一个选项,bandwidth
尽管它可能比你想要的做得更多。