Frage

Ich arbeite an einer App, die die Netzwerknutzung überwacht. Ich bemerkte jedoch, dass viele Möglichkeiten, dies zu tun, nicht zulässt, dass der lokale Verkehr ausgeschlossen ist (z. B. Zeitmaschine).

Ich suche nach einer Möglichkeit, den lokalen Verkehr auszuschließen, und überwacht nur die Nutzung, die direkt zum/vom Internet geht.

Aktualisieren: Vielen Dank für Ihre Antworten, jetzt weiß ich, wie ich feststellen kann, ob der Verkehr lokal ist, aber ich weiß immer noch nicht, wie ich die Gesamtbytes berechnen kann (Entschuldigung, wenn ich nicht früher ausgearbeitet habe). Ich habe keine Möglichkeit zu wissen, wie viele Bytes in einem bestimmten Zeitraum vor Ort (oder ins Internet) oder seit Beginn des Betriebssystems gesendet/empfangen werden. Dieses Problem wird durch die Tatsache, dass Prozesse im Laufe des Betriebssystems gestartet oder getötet werden, weiter erschwert.

Die Antwort auf die Frage Wie bekomme ich Netzwerkadapter -Statistiken in Linux/Mac OSX? Gibt eine interessante Möglichkeit, die vollständige Verwendung zu summieren, aber es hilft nicht, weil die Verwendung, die sie fasst, Schnittstellenstatistiken sind.

Update 2: Ich habe meine endgültige Lösung dafür gepostet. Bitte scrollen Sie ein wenig nach unten, um zu sehen.

War es hilfreich?

Lösung 8

Die endgültige Arbeitslösung, die ich habe, ist die Verwendung libpcap um das zu erreichen. Natürlich gibt es einige Nachteile, einschließlich der Einbeziehung erhöhte Berechtigungen und muss alle gefilterten Pakete erfassen, um Statistiken zu berechnen, aber zumindest funktioniert es perfekt gut.

Viele Dokumentationen und Tutorials zu libpcap ist ziemlich gründlich und klar, ich empfehle, dass jeder, der sich für diese Lösung interessiert, diejenigen mit relativ wenig Google-Fu-Anstrengung anzusehen.

Es kann auch einige interessieren, dass mein Filter für den Internetverkehr einfach die folgende ist -

- (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;
}

Der Filter ist mit einigen der Antworten darüber ausgelegt, was als „lokaler Verkehr“ gilt. Ich weiß, dass er einige Randfälle wie Doppel -NAT -Konfigurationen usw. nicht umfasst, aber ich möchte Vorschläge dazu sehen.

Ich weiss net = [net stringByReplacingOccurrencesOfString:@".0" withString:@""]; ist nur ein kurzer Hack, der unter einigen besonderen Umständen leicht scheitern könnte, aber hey, niemand beschwert sich, zumindest noch nicht.

Andere Tipps

Bei der Beantwortung eines Kommentars darüber, welche Schnittstellen den lokalen Verkehr tragen, ist tatsächlich kompliziert, da dies davon abhängt, was Sie unter dem lokalen Verkehr meinen.

Was „lokal“ bedeutet

Die einfachste Bedeutung von "lokalem Verkehr" ist der Verkehr, der die Maschine nicht auf dem generierten Maschine lässt (zwei Programme auf derselben Maschine, die beispielsweise miteinander sprechen). Dieser Verkehr geht alles über Lo. Dies ist eine Sache, die die Leute meinen, wenn sie lokal sagen (und woran ich dachte, als ich antwortete).

Die nächst einfachste Bedeutung wäre "IP -Verkehr für Maschinen im selben Subnetz". Das wäre der Verkehr, der eine Zieladresse im lokalen Subnetz hat. Der einfachste Weg, um dies zu zählen, ist entweder die Routing-Tabelle (wenn Mac OS X Verkehrsstatistiken pro Route zählt, werden die Routen auf den verschiedenen Gateways nicht lokale Verkehrsverkehr geben) oder mit einer Firewall-Regel. Dies will wahrscheinlich niemanden bedeutet, wenn er "lokaler Verkehr" sagt.

Eine weitere Bedeutung wäre "IP -Verkehr, der für Maschinen an diesem (physischen) Ort bestimmt ist. ZB in meinem Büro haben wir mehrere Subnetze mit Routern zwischen ihnen, aber der Datenverkehr von einem Subnetz zum anderen ist noch eindeutig lokal. Sie benötigen Netzwerkwissen, um mit dieser Definition den lokalen nicht lokalen Verkehr zu unterscheiden.

Eine weitere Bedeutung wäre "IP -Verkehr, der für Maschinen in meiner Organisation bestimmt ist". Dies ist eine vernünftige Bedeutung, je nachdem, wie Ihr Netzwerk eingerichtet ist (z. B. haben Sie möglicherweise eine schnelle Faser zwischen Ihren Standorten, Ihre Internetverbindungen sind jedoch viel langsamer oder pro-GB). Erfordert eingehende Kenntnisse des Netzwerks, um sich zu ermitteln, wenn ein Ziel lokal sein wird oder nicht-und mit Dingen wie VPNs das, das kann im Laufe der Zeit variieren.

Schließlich ist "Internetverkehr" nicht das Gegenteil von irgendein von diesen. Manchmal ist beispielsweise eine lokale Maschine in Ihrem Ethernet -Segment tatsächlich über einem VPN über das Internet (dies ist nicht verrückt, es ist sehr nützlich, wenn Remote -Benutzer verschiedene Windows -Dienste nutzen müssen). Der Verkehr in Ihrem Unternehmen kann problemlos über ein Internet -VPN reisen.

Betrug in einfachen Netzwerken

Wenn das Netzwerk sehr einfach ist, da nur ein internes Subnetz, nur ein Router und der gesamte Datenverkehr zu diesem internen Subnetz im Internetverkehr sind, können Sie dies betrügen und lösen. Dies gilt wahrscheinlich für die überwiegende Mehrheit der Heimnetzwerke und viele kleine Unternehmen.

Verwenden von Firewall -Regeln

In einem einfachen Netzwerk-Setup können Sie wahrscheinlich einige Annahmen treffen und eine genau genug Antwort erhalten, indem Sie den Verkehr als nicht lokal zählen, wenn:

  • Die Ziel -MAC -Adresse ist die MAC -Adresse des Standard -Gateways. und
  • Die Ziel -IP -Adresse lautet nicht Die IP -Adresse des Standard -Gateways

Alternative:

  • Die Ziel -IP -Adresse befindet sich nicht im Subnetz der Netzwerkschnittstelle. Die Standardroute geht

Sie können wahrscheinlich eine Firewall -Regel erstellen, um beide davon zu zählen. Zumindest mit Linux iptables können Sie und ich bin mir ziemlich sicher, dass BSD PF und wahrscheinlich Mac OS X.

Alternativer Ansatz: SNMP

Wenn Sie eine Firewall-Regel nicht verwenden können (da dies Root erforderlich wäre), können Sie hoffen, dass das Standard-Gateway auf SNMP Community Public reagiert, alle seine Schnittstellen erkunden und die mit einer IP-Adresse außerhalb der Subnet finden. und nehmen Sie dann an, dass dies der Internet -Link ist. Anschließend können Sie den Router nach Verkehrszählungen auf dieser Schnittstelle fragen.

Natürlich werden Sie feststellen, dass viele Soho -Router SNMP nicht unterstützen und diejenigen, die es wahrscheinlich nicht haben, nicht eingeschaltet haben.

Der beste Weg ist, die "externe" IP -Adresse über die ETH0, ETH1 oder den Adapter mit einem Systemanruf an IFConfig zu finden. Ziehen Sie dann Protokolle für das System (Nachrichten, Syslog, was auch immer) und schreiben Sie einen Filter für diese externe IP -Adresse. Um es schöner und tragbarer zu machen, schreiben Sie einen Regex, der nur für öffentlich routbare IPS filtert und einfach Nachrichtenprotokoll für diese "externe" IP -Adresse filtert.

Sie müssen die Quelle für IFConfig (8) lesen, in der beschrieben wird, wie der Status jeder beigefügten Netzwerkschnittstelle erhalten.

Achten Sie besonders auf In_Status (), das die Inet -Adresse und die Netzmaske einer Schnittstelle erhält.

Wenn die Quell- oder Zieladresse im Datenverkehr denselben Host wie eine lokale Schnittstelle hat

int is_local =
(src && netmask) == (ifaddr && netmask)
|| (dst && netmask) == (ifaddr && netmask)

Dann können Sie sicher sein, dass es lokal ist

http://www.opensource.apple.com/source/network_cmds/network_cmds-307/ifconfig.tproj/ifconfig.c

Ich denke, eine ungefähre Lösung: GetifadDRs kann verwendet werden, um Statistiken zur Netzwerknutzung zu erhalten.

Es kann separate Statistiken für Wi-Fi- und WWAN-Schnittstellen erhalten.

Möglicherweise finden Sie weitere Informationen von:

http://www.gsp.com/cgi-bin/man.cgi?section=3&topic=getifaddrs

Es hängt davon ab, wie Sie "lokal" definieren, aber eine gemeinsame Definition wäre, die Netzwerkmaske zu betrachten.

Wenn Sie beispielsweise Ihre IP (dh die IP der von Ihnen überwachten Schnittstelle ist

10.33.52.123
netmask 255.255.255.0

Das würde bedeuten, dass jede IP-Packet sowohl mit Quell-IP- als auch Ziel-IP-IP 10.33.52.xx lokal ist.

Ich kenne Kakao oder Objektiv-C nicht, aber Sie können wahrscheinlich einige dieser Funktionen verwenden, die Ihnen helfen, das Netzwerk aus einer IP-Addesse zu extrahieren: http://developer.apple.com/library/mac/#documentation/darwin/reference/Manpages/Man3/inet_network.3html

Ich weiß nicht, wie man es in Objective-C implementiert, aber die Idee ist, dass Sie die Adresse des Netzwerks erhalten, in dem Sie sich befinden (Sie können dies aus der Netzwerkklasse (a, b, c) herausfinden Bits in NetMask, wenn es nicht Standard ist), überprüfen Sie einfach die Adresse der ausgehenden Verbindung. Wenn sich das Ziel nicht in Ihrem lokalen Netzwerk befindet, berechnen Sie den Verkehr. Wenn es drin ist, mach einfach nichts.

Es gibt drei Bereiche nicht-adranierbarer IP-Adressen und werden üblicherweise als Adressbereich für NAT-Dienste verwendet. Jede Adresse, die sich nicht in einer der nicht adricable Adressbereiche befindet, ist eine externe Adresse.

Wenn Sie nicht hinter einem NAT -Router stehen, ist die Aufgabe natürlich schwieriger (und technisch gesehen sind alle Adressen von 127.0.0.1 zu diesem Zeitpunkt extern).

Die nicht adierbaren IP-Bereiche sind:

10.0.0.0 - 10.255.255.255

172.16.0.0 - 172.31.255.255

192.168.0.0 - 192.168.255.255

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top