gpt4 book ai didi

Linux:使用Python捕获发送到ULOG的数据包? (带宽监控项目)

转载 作者:太空宇宙 更新时间:2023-11-04 05:03:56 26 4
gpt4 key购买 nike

我正在为我的网络编写一个自定义带宽监控系统。我希望能够跟踪内部 (NAT) 子网上每个 IP 使用的带宽。我已经编码了所有基础设施来处理显示日志、发送警告等,并进行任何所需的统计分析。

现在,我正在使用一种相当丑陋的方法:我在 iptables 中设置了一些不执行任何操作的规则,然后定期从 Python 运行 iptables -vnxL 并解析出字节计数器。相对而言,这可能相当有效(我们没有解析每个数据包),但它留下了丢失数据包的可能性,例如如果系统重新启动,计数器将被重置(特别是如果它重新启动不干净),并且如果我有任何原因手动修改 iptables 规则,由于某种原因,在我的系统上计数器也会从该行为中重置。

我读过有关 ULOG 目标的内容,我可以用它来将所有路由数据包发送到用户空间,在那里我可以获取数据包大小并将它们添加到存储在数据库中的计数器中。我看到两种可能的选择:

  1. 以某种方式在 Python 中实现一个 ulogd 等效项,它只是查看通过接口(interface)的所有数据包,手动解析每个数据包的大小和地址,并处理所有数学运算。我觉得这最终可能会效率低下,因为我将在 Python 中进行每个数据包的解析,因此在高数据包应用程序(VOIP 等)的情况下,我们可能会导致 Python 落后或丢失数据包。
  2. 运行ulogd本身,但不知何故让它只将每个数据包的IP地址和字节数记录到文件中;然后定期用 python 解析这个文件。每次 python 解析文件时,我都希望它被清除。

我想在 Python 而不是 iptables 中执行此操作的原因是我可以获得更大的灵 active 。由于我将手动解析 IP 地址和端口以及所有这些内容,因此我可以统计出诸如“HTTP 流量的百分比”之类的事情。现在,使用 iptables 方法,我所能做的就是确定“每个主机使用了多少”。

我倾向于方法 2。这是我希望看到的方法:

  1. Python 进程启动。它以某种方式捕获当前 ulogd 日志文件的快照。
  2. ulogd 重新启动,日志文件为空。这样,当 Python 处理数据包快照时,我们就不会错过任何数据包,因此 Python 不必跟踪它最后到达的日志文件中的位置。
  3. Python 现在可以按照自己的节奏自由解析日志快照中的数据包。

我看到的问题:

  1. Python如何获得这个“快照”?我能想到的唯一方法是:终止ulogd,复制文件,删除或截断原始文件,然后重新启动ulogd。这可能需要一些时间,在现代连接上,这几秒钟可能会导致丢失数兆字节的跟踪数据。
  2. 如果我通过读取 ulogd 正在写入的同一个文件来工作,我觉得如果我从 ulogd 有写入句柄的文件中读取数据,可能会发生一些奇怪的事情。诸如写入缓存之类的事情似乎我们仍然可能会丢失数据包。

有人可以给我,或者指导我去某个地方获取关于这个项目的一些建议吗?

F

最佳答案

我能想到的有两种方法:

  1. 仅解析旋转的文件。例如。旋转 ulogd 文件并在旋转后解析它们
  2. 解析实时文件

最后,您需要针对#1 进行开发,并可能针对#2 进行扩展。 IE。您需要考虑日志轮换,记住您解析的最新轮换文件,并在下次运行时从该点开始解析。因此,您肯定需要在调用之间保持状态。

对于#2,您可以遵循 logtail 方法。例如,保留实时文件的 inode 号和解析到的最新偏移量。如果 inode 号发生变化(或者大小变得小于偏移量),那么您需要解析整个文件。否则你可以从那一点开始解析。

如果您不需要实时数据,那么使用旋转文件应该可以很好地工作。但是,如果您想要更实时的东西,那么解析当前日志文件 a'la logtail 应该很快。

或者,您可以尝试使用 ulogd 的数据库后端并解决其中的问题。

关于Linux:使用Python捕获发送到ULOG的数据包? (带宽监控项目),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23474035/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com