我正在为我的网络编写自定义带宽监控系统。我希望能够跟踪内部(NAT)子网上每个IP使用的带宽。我已经将所有基础设施编码为处理显示日志,发送警告等,并进行任何必要的统计分析。
现在,我使用了一种相当丑陋的方法:我在iptables中设置了一些什么都不做的规则,然后定期从Python运行iptables -vnxL
并解析出字节计数器。这可能相当有效(我们不解析每个数据包),但它留下了丢失数据包的可能性,例如,如果系统重新启动,计数器将被重置(特别是如果它不正确地重新启动),并且如果我有任何理由手动修改iptables规则,由于某些原因我的系统上的计数器也会从该行为中重置。
我已经阅读了有关ULOG目标的信息,我可以使用该目标基本上将所有路由数据包发送到用户空间,在那里我可以获取数据包大小并将它们添加到存储在我数据库中的计数器中。我看到两种可能的选择:
ulogd
等价物,只是看到所有数据包通过接口,手动解析每个数据包的大小和地址,并处理所有数学。我觉得这可能最终效率低下,因为我在Python中进行逐包解析,因此在高包应用程序(VOIP等)的情况下,我们最终可能会落后于Python或丢失数据包ulogd
本身,但不知何故只能将每个数据包的IP地址和字节数记录到文件中;然后定期用python解析这个文件。每次python解析文件时,我都希望它被清除。 我想在Python而不是iptables中这样做的原因是我获得了更大的灵活性。由于我将手动解析IP地址和端口以及所有这些,我可以在统计上执行类似" HTTP和#34;的流量百分比。现在,使用iptables方法,我所能做的就是确定每个主机使用的数量。"
方法2是我倾向于此。以下是我希望看到的方法:
ulogd
。这样我们就不会在Python处理数据包快照时丢失任何数据包,因此Python不必跟踪它最后到达日志文件的位置。我看到的问题:
有人可以给我,或者直接到某个地方去找一些关于这个项目的建议吗?
˚F
答案 0 :(得分:1)
我能想到两种方法:
最后,您需要为#1开发,并可能延伸到#2。即您需要考虑日志轮换,记住您解析的最新旋转文件以及从该点开始的下一次运行解析。因此,您肯定需要在调用之间保持状态。
对于#2,您可以遵循logtail方法。例如,保留实时文件的inode编号和您已解析的最新偏移量。如果inode编号更改(或者大小变得小于偏移量),则需要解析整个文件。否则你可以从那时开始解析。
如果您不需要实时数据,那么使用旋转文件应该可以很好地工作。如果你想要更实时的东西,那么解析当前的日志文件应该很快。
或者,您可以尝试使用ulogd的数据库后端并解决问题。