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

2024-09-22 14:39:08 发布

您现在位置:Python中文网/ 问答频道 /正文

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

现在,我使用的是一种相当难看的方法:我在iptables中设置一些什么都不做的规则,然后定期从Python运行iptables -vnxL并解析出字节计数器。相对而言,这可能是相当有效的(我们没有分析每一个数据包),但它为丢失数据包留下了可能性,例如,如果系统重新启动,计数器将被重置(尤其是在重新启动不干净的情况下),如果我有任何理由手动修改iptables规则,出于某种原因,在我的系统中,计数器也会从那个动作中复位。在

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

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

我之所以喜欢用Python而不是iptables来实现这一点,是因为我可以获得更多的灵活性。因为我要手动解析IP地址和端口以及所有这些,所以我可以从统计学上做一些事情,比如“HTTP占流量的百分比是多少”。现在,使用iptables方法,我所能做的就是确定“每个主机使用多少”

方法2是我学习的地方。以下是我想了解的方法:

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

我看到的问题:

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

有人能给我一些建议吗,或者指点我到什么地方去寻求这个项目的建议?在

F


Tags: 文件方法iptables字节规则系统地方方式
1条回答
网友
1楼 · 发布于 2024-09-22 14:39:08

我可以想出两种方法:

  1. 仅分析旋转文件。E、 g.旋转ulogd文件并在旋转后对其进行解析
  2. 解析实时文件

最后,你需要为1发展,也可能为2发展。一、 你需要考虑日志轮换,记住你解析的最新的旋转文件,然后在下一次运行parse时从这一点开始。因此,您肯定需要在调用之间保持状态。在

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

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

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

相关问题 更多 >