我正在开发一个监控网络使用情况的应用程序。但是,我注意到许多这样做的方法不允许排除本地通信量(例如,时间机器)。
我正在寻找一种排除本地流量的方法,并且只监视直接进出互联网的使用情况。
Update:谢谢您的回复,现在我知道如何查找流量是否是本地的,但我仍然不知道如何计算总字节数(如果前面没有详细说明,很抱歉)。我无法知道在一段时间内,或自操作系统启动以来,本地(或互联网)发送/接收了多少字节。这个问题由于操作系统运行时进程被启动或终止而变得更加复杂。
How to get network adapter stats in linux/Mac OSX?问题的答案给出了一种有趣的方法来总结总的使用情况,但是它没有帮助,因为它总结的使用是接口统计。
更新2:我已经发布了我的最后解决方案。请往下滚动一点看。
发布于 2011-11-03 23:32:27
我的最后一个工作解决方案是使用libpcap来实现这一点。当然,也有一些缺点,包括它需要提升特权,并且必须捕获所有过滤过的数据包才能计算统计数据,但至少它工作得非常好。
许多关于libpcap的文档和教程是相当透彻和清晰的,我建议每一个对这个解决方案感兴趣的人都看看那些相对较少的google-fu。
此外,我对互联网流量的筛选可能会引起一些人的兴趣-
- (NSString *)_internetFilterStringForInterface:(AKNetworkInterface *)interface
inOrOut:(BOOL)inYesOutNo
{
if (![interface net] || ![interface mask] || IsEmpty([interface addresses]))
{
return nil;
}
NSString *hostType = inYesOutNo ? @"dst" : @"src";
NSString *host = nil;
for (NSString *hostComponent in [interface addresses])
{
if (IsEmpty(hostComponent)) continue;
if (!host)
host = [NSString stringWithFormat:@"(%@ host %@", hostType, hostComponent];
else
host = [host stringByAppendingFormat:@" or %@ host %@", hostType, hostComponent];
}
host = [host stringByAppendingString:@")"];
NSString *net = [interface netString];
net = [net stringByReplacingOccurrencesOfString:@".0" withString:@""];
NSString *filter = [NSString stringWithFormat:
@"ip and (not %@ net %@) and %@",
inYesOutNo ? @"src" : @"dst",
net, host];
return filter;
}过滤器的设计有一些关于什么是‘本地流量’的答案,我知道它不包括一些边缘情况,如双NAT配置等,但我想看看有关这方面的建议。
我知道net = [net stringByReplacingOccurrencesOfString:@".0" withString:@""];只是一个快速的黑客,在一些特殊的情况下很容易失败,但是没有人抱怨,至少现在还没有。
发布于 2011-04-01 18:05:04
回答您关于哪些接口包含本地流量的评论实际上很复杂,因为这取决于您对本地通信量的定义。
“本地”是什么意思?
“本地通信量”最简单的含义是不让机器在其上生成的通信量(例如,同一台机器上的两个程序相互交谈)。所有的交通都过去了。这是人们在说当地话时所指的一件事(以及我回答时所想到的)。
下一个最简单的意思是“发送到同一子网上的机器的IP通信”。那就是在本地子网中有目的地地址的通信量。计算这一点的最简单方法是要么是路由表(如果Mac计算每条路由的流量统计,那么各个网关上的路由将给您提供非本地流量),要么使用防火墙规则。当他们说“当地交通”时,这可能是不想让任何人用的手段。
另一个意思是“发送到这个(物理)位置的机器的IP通信”。在我的办公室,我们有几个子网在使用,它们之间有路由器,但是从一个子网到另一个子网的流量显然仍然是本地的。使用此定义,您需要网络知识来区分本地流量和非本地流量。
另一个意思是“我的组织中的机器的IP通信”。这是一个合理的含义,取决于您的网络是如何设置(例如,您可能有快速光纤在您的位置,但您的互联网连接要慢得多,或收费每GB)。需要对网络有深入的了解,才能知道目的地是否是本地的--而且,对于像VPN这样的东西,这可能会随着时间的推移而变化。
最后,“互联网流量”与任何一个都不是相反的。例如,有时候,以太网段上的本地机器实际上是通过VPN,通过Internet (这并不疯狂,对于远程用户需要使用各种Windows服务非常有用)。您的组织内部的流量可以很容易地通过Internet VPN传输。
简单网络中的欺骗
如果网络非常简单,只有一个内部子网,一个路由器,并且所有的流量这可能适用于绝大多数家庭网络,也适用于许多小企业网络。
使用防火墙规则
在一个简单的网络设置中,您可能可以做一些假设,并通过将流量计算为非本地通信量得到足够接近的答案,如果:
另一种选择是:
您可能可以创建一个防火墙规则来计算其中的任何一个。至少你可以使用Linux iptables,我很确定BSD pf,可能还有Mac。
替代方法: SNMP
最后,如果您不能使用防火墙规则(因为这需要根),您可以希望默认网关响应SNMP社区公共,探索它的所有接口,并找到一个具有子网外IP地址的接口,然后假设它是Internet链接。然后,您可以要求路由器在该接口上的流量计数。
当然,您会发现许多SOHO路由器不支持SNMP,而那些支持SNMP的路由器可能没有打开它。
发布于 2011-02-25 12:51:08
最好的方法是通过eth0、eth1或任何带有系统调用ifconfig的适配器找到“外部”ip地址。然后为任何系统(消息、syslog等)提取日志,并为该外部ip地址编写一个筛选器。为了使它更好和更可移植,编写一个正则表达式,它只对可公开路由的ip进行过滤,只过滤“外部”ip地址的消息日志。
https://stackoverflow.com/questions/4281531
复制相似问题