首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >监视网络使用情况(不包括本地流量)

监视网络使用情况(不包括本地流量)
EN

Stack Overflow用户
提问于 2010-11-25 23:31:56
回答 7查看 4.9K关注 0票数 10

我正在开发一个监控网络使用情况的应用程序。但是,我注意到许多这样做的方法不允许排除本地通信量(例如,时间机器)。

我正在寻找一种排除本地流量的方法,并且只监视直接进出互联网的使用情况。

Update:谢谢您的回复,现在我知道如何查找流量是否是本地的,但我仍然不知道如何计算总字节数(如果前面没有详细说明,很抱歉)。我无法知道在一段时间内,或自操作系统启动以来,本地(或互联网)发送/接收了多少字节。这个问题由于操作系统运行时进程被启动或终止而变得更加复杂。

How to get network adapter stats in linux/Mac OSX?问题的答案给出了一种有趣的方法来总结总的使用情况,但是它没有帮助,因为它总结的使用是接口统计。

更新2:我已经发布了我的最后解决方案。请往下滚动一点看。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2011-11-03 23:32:27

我的最后一个工作解决方案是使用libpcap来实现这一点。当然,也有一些缺点,包括它需要提升特权,并且必须捕获所有过滤过的数据包才能计算统计数据,但至少它工作得非常好。

许多关于libpcap的文档和教程是相当透彻和清晰的,我建议每一个对这个解决方案感兴趣的人都看看那些相对较少的google-fu。

此外,我对互联网流量的筛选可能会引起一些人的兴趣-

代码语言:javascript
复制
- (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:@""];只是一个快速的黑客,在一些特殊的情况下很容易失败,但是没有人抱怨,至少现在还没有。

票数 0
EN

Stack Overflow用户

发布于 2011-04-01 18:05:04

回答您关于哪些接口包含本地流量的评论实际上很复杂,因为这取决于您对本地通信量的定义。

“本地”是什么意思?

“本地通信量”最简单的含义是不让机器在其上生成的通信量(例如,同一台机器上的两个程序相互交谈)。所有的交通都过去了。这是人们在说当地话时所指的一件事(以及我回答时所想到的)。

下一个最简单的意思是“发送到同一子网上的机器的IP通信”。那就是在本地子网中有目的地地址的通信量。计算这一点的最简单方法是要么是路由表(如果Mac计算每条路由的流量统计,那么各个网关上的路由将给您提供非本地流量),要么使用防火墙规则。当他们说“当地交通”时,这可能是不想让任何人用的手段。

另一个意思是“发送到这个(物理)位置的机器的IP通信”。在我的办公室,我们有几个子网在使用,它们之间有路由器,但是从一个子网到另一个子网的流量显然仍然是本地的。使用此定义,您需要网络知识来区分本地流量和非本地流量。

另一个意思是“我的组织中的机器的IP通信”。这是一个合理的含义,取决于您的网络是如何设置(例如,您可能有快速光纤在您的位置,但您的互联网连接要慢得多,或收费每GB)。需要对网络有深入的了解,才能知道目的地是否是本地的--而且,对于像VPN这样的东西,这可能会随着时间的推移而变化。

最后,“互联网流量”与任何一个都不是相反的。例如,有时候,以太网段上的本地机器实际上是通过VPN,通过Internet (这并不疯狂,对于远程用户需要使用各种Windows服务非常有用)。您的组织内部的流量可以很容易地通过Internet VPN传输。

简单网络中的欺骗

如果网络非常简单,只有一个内部子网,一个路由器,并且所有的流量这可能适用于绝大多数家庭网络,也适用于许多小企业网络。

使用防火墙规则

在一个简单的网络设置中,您可能可以做一些假设,并通过将流量计算为非本地通信量得到足够接近的答案,如果:

  • 目的地MAC地址是默认网关的MAC地址;
  • 目的地IP地址不是默认网关的IP地址

另一种选择是:

  • 目标IP地址不在网络接口子网中,默认路由退出

您可能可以创建一个防火墙规则来计算其中的任何一个。至少你可以使用Linux iptables,我很确定BSD pf,可能还有Mac。

替代方法: SNMP

最后,如果您不能使用防火墙规则(因为这需要根),您可以希望默认网关响应SNMP社区公共,探索它的所有接口,并找到一个具有子网外IP地址的接口,然后假设它是Internet链接。然后,您可以要求路由器在该接口上的流量计数。

当然,您会发现许多SOHO路由器不支持SNMP,而那些支持SNMP的路由器可能没有打开它。

票数 2
EN

Stack Overflow用户

发布于 2011-02-25 12:51:08

最好的方法是通过eth0、eth1或任何带有系统调用ifconfig的适配器找到“外部”ip地址。然后为任何系统(消息、syslog等)提取日志,并为该外部ip地址编写一个筛选器。为了使它更好和更可移植,编写一个正则表达式,它只对可公开路由的ip进行过滤,只过滤“外部”ip地址的消息日志。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4281531

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档