Question

Je travaille sur une application qui surveille de l'utilisation du réseau. Cependant, je remarque beaucoup de façons de le faire ne permet pas d'exclure le trafic local (par exemple, Time Machine).

Je cherche un moyen d'exclure le trafic local, et que l'utilisation des moniteurs qui va directement à / de l'Internet.

Mise à jour : Merci pour vos réponses, maintenant je sais comment trouver si le trafic est local, mais je ne sais pas comment je peux encore calculer le total in / out octets (désolé si je n'a pas précisé plus tôt). Je n'ai aucun moyen de savoir combien d'octets sont envoyés / reçus localement (ou Internet) dans un certain laps de temps, ou depuis le système d'exploitation démarre. Ce problème est encore compliqué par le fait des processus sont lancés ou tués lorsque le système d'exploitation est en cours d'exécution.

La réponse à la question Comment obtenir réseau adaptateur stats dans linux / Mac OSX? donne un moyen intéressant de résumer l'utilisation totale, mais il n'a pas d'aide parce que l'utilisation, il résume les statistiques sont d'interface.

Mise à jour 2 : J'ai posté ma solution finale à ce sujet. S'il vous plaît faites défiler vers le bas pour voir.

Était-ce utile?

La solution 8

La solution finale de travail j'est d'utiliser libpcap pour y parvenir. Bien sûr, il y a quelques inconvénients, qui comprend elle requiert des privilèges élevés et doit capturer tous les paquets filtrés aux statistiques de calculer, mais au moins il fonctionne parfaitement bien.

De nombreux tutoriels sur les documentations et libpcap est assez complète et claire, je vous suggère tous intéressés par cette solution à regarder ceux qui ont relativement peu d'effort-fu google.

il peut aussi intéresser un peu que mon filtre pour le trafic Internet est tout simplement le suivant -

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

Le filtre est conçu avec quelques-unes des réponses sur ce qui compte comme « trafic local », je sais que cela ne comprenait pas la certains cas de pointe tels que la double configurations NAT, etc., mais je voudrais voir des suggestions à ce sujet.

Je sais net = [net stringByReplacingOccurrencesOfString:@".0" withString:@""]; est juste un hack qui pourrait facilement échouer dans certaines circonstances particulières mais bon personne ne se plaint, du moins pas encore.

Autres conseils

Répondre à vous faire des commentaires sur les interfaces qui transportent le trafic local est en fait compliqué, parce que cela dépend de ce que vous entendez par le trafic local.

Qu'est-ce que « Local » Moyens

Le plus sens du mot « trafic local » est le trafic qui ne laisse pas la machine de son produit sur (deux programmes sur la même machine de parler à l'autre, par exemple). Ce trafic va partout lo. C'est une chose que les gens veulent dire quand ils disent local (et ce que je pensais quand je répondais).

La signification suivante serait plus facile « trafic IP destiné aux machines sur le même sous-réseau ». Ce serait le trafic qui a une adresse de destination à l'intérieur du sous-réseau local. La meilleure façon de compter cela va être soit la table de routage (si Mac OS X compte les statistiques de trafic par route, les routes sur les différentes portes d'entrée vous donnera le trafic non local) ou avec une règle de pare-feu. Ceci est probablement pas envie de moyens de qui que ce soit quand ils disent "trafic local".

Une autre sens serait « le trafic IP destiné aux machines à cet endroit (physique) ». Par exemple, à mon bureau, nous avons plusieurs sous-réseaux utilisés, avec des routeurs entre eux, mais le trafic d'un sous-réseau à l'autre est encore clairement locale. Vous avez besoin de connaissances réseau pour établir une distinction locale du trafic non local avec cette définition.

Une autre sens serait « le trafic IP destiné aux machines dans mon organisation ». Ceci est un sens raisonnable en fonction de la façon dont votre réseau est mis en place (par exemple, peut-être vous avez la fibre rapide entre vos emplacements, mais vos connexions Internet sont beaucoup plus lents, ou facturé par Go). Nécessite une connaissance approfondie du réseau à la figure si une destination va être local ou non et, avec des choses comme réseaux privés virtuels, que peut varier au fil du temps.

Enfin, "le trafic Internet" est pas le contraire de any de ceux-ci. Parfois, par exemple, ce qui semble être une machine locale sur votre segment Ethernet est en fait sur un réseau privé virtuel, sur Internet (ce n'est pas fou, il est très utile lorsque les utilisateurs distants ont besoin d'utiliser différents services Windows). Le trafic intérieur de votre organisation peut facilement se déplacer sur un VPN Internet.

Tricher dans les réseaux simples

Si le réseau est très simple, qu'il n'y ait qu'un sous-réseau interne, un seul routeur, et tout le trafic pas à ce sous-réseau interne étant le trafic Internet, vous pouvez tricher et résoudre ce problème. Cela vaut probablement la grande majorité des réseaux domestiques, et beaucoup de petites entreprises, et.

Utilisation des règles de pare-feu

Dans une configuration simple du réseau, vous pouvez probablement faire quelques hypothèses, et d'obtenir une réponse assez proche par le trafic de comptage non local si:

  • l'adresse MAC de destination est l'adresse MAC de la passerelle par défaut; et
  • l'adresse IP de destination est pas Adresse IP de la passerelle par défaut

alternativement:

  • l'adresse IP de destination ne sont pas dans le sous-réseau du réseau l'interface la route par défaut sort

Vous pouvez probablement créer une règle de pare-feu pour compter soit de ceux-ci. Au moins, avec Linux, vous pouvez iptables, et je suis sûr que BSD pf, et probablement Mac OS X.

Autre approche: SNMP

Enfin, si vous ne pouvez pas utiliser une règle de pare-feu (comme qui aurait besoin racine), vous pouvez espérer que les répond de la passerelle par défaut à public communautaire SNMP, explorer toutes ses interfaces, et de trouver celui avec un hors sous-réseau adresse IP, puis supposer que le lien Internet. Ensuite, vous pouvez demander au routeur pour comptages de trafic sur cette interface.

Bien sûr, vous trouverez que de nombreux routeurs SOHO ne prennent pas en charge SNMP, et ceux qui n'ont probablement pas sous tension.

La meilleure façon est de trouver l'adresse IP « externe » à travers le eth0, eth1, ou tout autre adaptateur avec un appel système à ifconfig. Ensuite, tirez les journaux pour tout système (messages, syslog, peu importe) et d'écrire un filtre pour cette adresse IP externe. Pour le rendre plus agréable et plus facile à transporter, écrire un regex qui filtrera pour les adresses IP routables seulement et seulement filtrer les messages journal pour cette adresse ip « externe ».

vous avez besoin de lire la source de ifconfig (8), qui décrit comment obtenir le statut de chaque interface réseau connecté.

accorder une attention particulière à in_status (), qui obtient l'adresse de iNet et d'une interface netmask.

lorsque la source ou l'adresse de destination dans le trafic a le même hôte que d'une interface locale

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

alors vous pouvez être sûr qu'il est local

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

Je pense que, une solution approchée. Getifaddrs peut être utilisé pour obtenir des statistiques sur l'utilisation du réseau

Il peut obtenir des statistiques séparées pour les interfaces Wi-Fi et WWAN.

Vous trouverez peut-être plus d'informations:

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

Cela dépend de la façon dont vous définissez « locale », mais une définition commune serait de regarder le masque de réseau.

Par exemple, si votre adresse IP (par exemple l'adresse IP de l'interface vous moniteur est

10.33.52.123
netmask 255.255.255.0

qui signifie tous les paquets IP à la fois IP source et destination IP 10.33.52.xx est locale.

Je ne sais pas de cacao ou Objective-C, mais vous pouvez probablement utiliser certaines de ces fonctions vous aider à extraire le réseau à partir d'une adresse IP: http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man3 /inet_network.3.html

Je ne sais pas comment le mettre en œuvre en c objective, mais l'idée est que vous obtenez l'adresse du réseau auquel vous êtes (vous pouvez comprendre cela de la classe de réseau (A, B, C) en fonction de votre région iP ou de bits dans netmask si ce n'est pas standard), puis il suffit de vérifier l'adresse de la connexion sortante. Si la destination est pas dans votre réseau local, le trafic calculate; si elle est dedans, simplement ne rien faire.

Il y a trois plages d'adresses IP non routables, et ils sont couramment utilisés comme les plages d'adresses pour les services NAT. Toute adresse qui ne sont pas dans l'une des plages d'adresses non routable est une adresse externe.

Bien sûr, si vous n'êtes pas derrière un routeur NAT, la tâche est plus difficile (et techniquement toutes les adresses courtes de 127.0.0.1 sont externes à ce point).

Les plages d'adresses IP non routables sont:

10.0.0.0 - 10.255.255.255

172.16.0.0 - 172.31.255.255

192.168.0.0 - 192.168.255.255

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top