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

时间:2014-05-03 16:37:27

标签: linux iptables python bandwidth

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

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

我已经阅读了有关ULOG目标的信息,我可以使用该目标基本上将所有路由数据包发送到用户空间,在那里我可以获取数据包大小并将它们添加到存储在我数据库中的计数器中。我看到两种可能的选择:

  1. 以某种方式在Python中实现ulogd等价物,只是看到所有数据包通过接口,手动解析每个数据包的大小和地址,并处理所有数学。我觉得这可能最终效率低下,因为我在Python中进行逐包解析,因此在高包应用程序(VOIP等)的情况下,我们最终可能会落后于Python或丢失数据包
  2. 运行ulogd本身,但不知何故只能将每个数据包的IP地址和字节数记录到文件中;然后定期用python解析这个文件。每次python解析文件时,我都希望它被清除。
  3. 我想在Python而不是iptables中这样做的原因是我获得了更大的灵活性。由于我将手动解析IP地址和端口以及所有这些,我可以在统计上执行类似" HTTP和#34;的流量百分比。现在,使用iptables方法,我所能做的就是确定每个主机使用的数量。"

    方法2是我倾向于此。以下是我希望看到的方法:

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

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

        ˚F

1 个答案:

答案 0 :(得分:1)

我能想到两种方法:

  1. 仅解析旋转的文件。例如。旋转ulogd文件并在旋转后解析它们
  2. 解析实时文件
  3. 最后,您需要为#1开发,并可能延伸到#2。即您需要考虑日志轮换,记住您解析的最新旋转文件以及从该点开始的下一次运行解析。因此,您肯定需要在调用之间保持状态。

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

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

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