Pregunta

Estoy trabajando en una aplicación que monitoriza el uso de la red.Sin embargo, me di cuenta de muchas formas de hacerlo no permiten la exclusión de tráfico local (por ejemplo, la Máquina del Tiempo).

Estoy buscando una manera de excluir el tráfico local, y sólo supervisa el uso que va directamente a/desde internet.

Actualización:Gracias por sus respuestas, ahora sé cómo encontrar si el tráfico es local, pero aún no sé cómo puedo calcular el total de in/out bytes (lo siento si no me elaborar anterior).No tengo manera de saber el número de bytes enviados/recibidos a nivel local (o a internet) en un determinado período de tiempo, o desde que se inicie el sistema operativo.Este problema se complica aún más por el hecho de que los procesos están en marcha o se mató cuando el sistema operativo se está ejecutando.

La respuesta a la pregunta Cómo obtener adaptador de red estadísticas en linux/Mac OSX? le da una interesante forma de resumir el uso total, pero no ayuda porque el uso que se resume están las estadísticas de la interfaz.

Actualización 2:He publicado mi solución final a este.Por favor, desplácese hacia abajo un poco para ver.

¿Fue útil?

Solución 8

El trabajo final de la solución que tengo es que uso libpcap para lograr esto.Por supuesto, hay algunos aspectos negativos, que incluye requiere privilegios elevados y debe capturar todos los filtrados de paquetes para el cálculo de estadísticas, pero al menos funciona perfectamente bien.

Muchos documentación y tutoriales sobre libpcap es bastante completo y claro, sugiero a cada uno de los interesados en esta solución para mirar a aquellos con relativamente poco google-fu esfuerzo.

También es posible que el interés de unos pocos que mi filtro para el tráfico de internet es simplemente el siguiente -

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

El filtro está diseñado con algunas de las respuestas sobre lo que cuenta como "tráfico local', sé que no comprenden algunos casos límite como el doble de configuraciones de NAT, etc., pero me gustaría ver sugerencias acerca de este.

net = [net stringByReplacingOccurrencesOfString:@".0" withString:@""]; es sólo un truco rápido que fácilmente podría fallar en algunas peculiares circunstancias pero bueno nadie se queja, al menos no todavía.

Otros consejos

Responder a su comentario sobre qué interfaces llevan el tráfico local es realmente complicado, porque depende de lo que quiere decir con tráfico local.

¿Qué significa "local"?

El significado más fácil del "tráfico local" es el tráfico que no deja la máquina que se genera (dos programas en la misma máquina que hablan entre sí, por ejemplo). Todo este tráfico pasa sobre lo. Esto es algo que las personas quieren decir cuando dicen locales (y en lo que estaba pensando cuando respondí).

El próximo significado más fácil sería el "tráfico IP destinado a máquinas en la misma subred". Ese sería el tráfico que tiene una dirección de destino dentro de la subred local. La forma más fácil de contar esto será la tabla de enrutamiento (si Mac OS X cuenta las estadísticas de tráfico por ruta, las rutas en las diversas puertas de enlace le darán tráfico no local) o con una regla de firewall. Probablemente esto no quiera que nadie significa cuando dicen "tráfico local".

Otro significado sería "tráfico IP destinado a máquinas en esta ubicación (física)". Por ejemplo, en mi oficina tenemos varias subredes en uso, con enrutadores entre ellos, pero el tráfico de una subred a otro todavía es claramente local. Necesita el conocimiento de la red para distinguir el tráfico local de no local con esta definición.

Otro significado sería "tráfico IP destinado a máquinas en mi organización". Este es un significado razonable, dependiendo de cómo esté configurada su red (por ejemplo, tal vez tenga fibra rápida entre sus ubicaciones, pero sus conexiones a Internet son mucho más lentas o cargadas por GB). Requiere un conocimiento profundo de la red para calcular si un destino va a ser local o no, y con cosas como VPN, que puede variar con el tiempo.

Finalmente, el "tráfico de Internet" no es lo contrario de ningún de aquellos. A veces, por ejemplo, lo que parece ser una máquina local en su segmento Ethernet es en realidad sobre una VPN, a través de Internet (esto no es una locura, es muy útil para cuando los usuarios remotos necesitan usar varios servicios de Windows). El tráfico dentro de su organización puede viajar fácilmente a través de una VPN de Internet.

Hacer trampa en redes simples

Si la red es muy simple, con solo una subred interna, solo un enrutador y todo el tráfico no para que esa subred interna sea el tráfico de Internet, puede hacer trampa y resolverlo. Esto probablemente se aplica a la gran mayoría de las redes domésticas, y muchas pequeñas empresas también.

Usar reglas de firewall

En una configuración de red simple, probablemente pueda hacer algunos supuestos y obtener una respuesta lo suficientemente cercana contando el tráfico como no local si:

  • La dirección MAC de destino es la dirección MAC de la puerta de enlace predeterminada; y
  • La dirección IP de destino es no la dirección IP de la puerta de enlace predeterminada

alternativamente:

  • La dirección IP de destino no está dentro de la subred de la interfaz de red. La ruta predeterminada se apaga

Probablemente pueda crear una regla de firewall para contar cualquiera de esos. Al menos con Linux iptables puedes, y estoy bastante seguro de que BSD PF y probablemente Mac OS X.

Enfoque alternativo: SNMP

Finalmente, si no puede usar una regla de firewall (ya que eso requeriría root), podría esperar que la puerta de enlace predeterminada responda al público de la comunidad SNMP, explore todas sus interfaces y encuentre la que tenga una dirección IP fuera de la subnet, Y luego asuma que ese es el enlace de Internet. Luego puede pedirle al enrutador que los recuentos de tráfico en esa interfaz.

Por supuesto, encontrarás que muchos enrutadores SOHO no admiten SNMP, y aquellos que probablemente no lo tienen encendido.

La mejor manera es encontrar la dirección IP 'externa' a través de ETH0, ETH1 o cualquier adaptador con una llamada del sistema a Ifconfig. Luego, extraiga registros para cualquier sistema (mensajes, syslog, lo que sea) y escriba un filtro para esa dirección IP externa. Para que sea mejor y más portátil, escriba un Regex que se filtre solo para IP en rutas públicas solo y simplemente filtre el registro de mensajes para esa dirección IP 'externa'.

Debe leer la fuente de Ifconfig (8), que describe cómo obtener el estado de cada interfaz de red adjunta.

Preste especial atención a in_status (), que obtiene la dirección INET y la máscara de red de una interfaz.

Cuando la dirección de origen o destino en el tráfico tiene el mismo host que una interfaz local

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

Entonces puedes estar seguro de que es local

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

Creo que una solución aproximada: GetifadDRS se puede utilizar para obtener estadísticas sobre el uso de la red.

Puede obtener estadísticas separadas para las interfaces Wi-Fi y WWAN.

Es posible que encuentre más información de:

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

Depende de cómo defina "local", pero una definición común sería mirar la máscara de red.

Por ejemplo, si su IP (es decir, la IP de la interfaz que monitorea es

10.33.52.123
netmask 255.255.255.0

Eso significaría que cada paquete IP con IP de fuente y Destination-IP 10.33.52.xx es local.

No conozco el cacao u Objective-C, pero probablemente pueda usar algunas de estas funciones que lo ayudan a extraer la red de una dirección IP: http://developer.apple.com/library/mac/#documentation/darwin/reference/manpages/man3/inet_network.3.html

No sé cómo implementarlo en Objective-C, pero la idea es que obtenga la dirección de la red en la que se encuentra (puede resolver esto de la clase de red (A, B, C) basada en su IP local o desde bits en la máscara de red si no es estándar), simplemente verifique la dirección de la conexión saliente. Si el destino no está en su red local, calcule el tráfico; Si está dentro, solo no hagas nada.

Hay tres rangos de direcciones IP no rutizables, y se usan comúnmente como rangos de dirección para los servicios NAT. Cualquier dirección que no esté en uno de los rangos de dirección no enrutables es una dirección externa.

Por supuesto, si no está detrás de un enrutador NAT, la tarea es más difícil (y técnicamente todas las direcciones de 127.0.0.1 son externas en este punto).

Los rangos de IP no enroutables son:

10.0.0.0 - 10.255.255.255

172.16.0.0 - 172.31.255.255

192.168.0.0 - 192.168.255.255

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top