Мониторинг использования сети за исключением локального трафика - PullRequest
10 голосов
/ 26 ноября 2010

Я работаю над приложением, которое отслеживает использование сети. Однако я заметил, что многие способы сделать это не позволяют исключить локальный трафик (скажем, Time Machine).

Я ищу способ исключить локальный трафик и отслеживаю только использование, которое идет непосредственно в / из Интернета.

Обновление : Спасибо за ваши ответы, теперь я знаю, как определить, является ли трафик локальным, но я до сих пор не знаю, как рассчитать общее количество входящих / исходящих байтов (извините, если я не уточнял ранее). У меня нет возможности узнать, сколько байтов отправлено / получено локально (или в Интернет) за определенный период времени или с момента запуска ОС. Эта проблема еще более осложняется тем фактом, что процессы запускаются или завершаются во время работы ОС.

Ответ на вопрос Как получить статистику сетевого адаптера в linux / Mac OSX? дает интересный способ суммировать общее использование, но это не помогает, потому что суммируемое использование является статистикой интерфейса ,

Обновление 2 : я опубликовал свое окончательное решение для этого. Пожалуйста, прокрутите вниз, чтобы увидеть.

Ответы [ 8 ]

2 голосов
/ 01 апреля 2011

Ответить на ваш комментарий о том, какие интерфейсы переносят локальный трафик, на самом деле сложно, потому что это зависит от того, что вы подразумеваете под локальным трафиком.

Что означает «местное»

Самое простое значение «локального трафика» - это трафик, который не покидает машину, на которой он был создан (например, две программы на одной машине общаются друг с другом). Этот трафик все идет через вот. Это то, что люди имеют в виду, когда говорят на местном (и о чем я думал, когда отвечал).

Следующим самым простым значением будет «IP-трафик, предназначенный для машин в одной подсети». Это будет трафик с адресом назначения в локальной подсети. Самым простым способом подсчета этого будет либо таблица маршрутизации (если Mac OS X подсчитывает статистику трафика по маршруту, маршруты через различные шлюзы будут давать вам нелокальный трафик), либо с помощью правила брандмауэра. Это, вероятно, не хочет, чтобы кто-то имел в виду, когда они говорят "местный трафик".

Другим значением будет «IP-трафик, предназначенный для машин в этом (физическом) расположении». Например, в моем офисе у нас есть несколько подсетей, между которыми есть маршрутизаторы, но трафик из одной подсети в другую по-прежнему явно локальный. С этим определением вам необходимы знания сети, чтобы отличать локальный трафик от нелокального.

Другим значением будет «IP-трафик, предназначенный для компьютеров в моей организации». Это разумное значение в зависимости от того, как настроена ваша сеть (например, возможно, у вас есть быстрое оптоволокно между вашими местоположениями, но ваши интернет-соединения намного медленнее, или плата за ГБ). Требует глубокого знания сети, чтобы понять, будет ли пункт назначения локальным или нет, а с такими вещами, как VPN, может изменяться со временем.

Наконец, «интернет-трафик» не является противоположностью любым из них. Иногда, например, то, что выглядит как локальный компьютер в вашем сегменте Ethernet, на самом деле через VPN, через Интернет (это не сумасшествие, это очень полезно, когда удаленным пользователям необходимо использовать различные службы Windows). Трафик внутри вашей организации может легко передаваться через Интернет VPN.

Обман в простых сетях

Если сеть очень простая, поскольку имеется только одна внутренняя подсеть, только один маршрутизатор, и весь трафик, не относящийся к этой внутренней подсети, является интернет-трафиком, вы можете обмануть и решить эту проблему. Это, вероятно, относится к подавляющему большинству домашних сетей, а также ко многим сетям малого бизнеса.

Использование правил брандмауэра

В простой сетевой настройке вы, вероятно, можете сделать некоторые предположения и получить достаточно точный ответ, считая трафик как нелокальный, если:

  • MAC-адрес получателя является MAC-адресом шлюза по умолчанию; и
  • IP-адрес назначения , а не IP-адрес шлюза по умолчанию

альтернативный вариант:

  • IP-адрес назначения не входит в подсеть сетевого интерфейса, маршрут по умолчанию исчезает

Вероятно, вы можете создать правило брандмауэра для подсчета любого из них. По крайней мере, с Linux iptables вы можете, и я уверен, что BSD pf, и, вероятно, Mac OS X.

Альтернативный подход: SNMP

Наконец, если вы не можете использовать правило брандмауэра (так как для этого требуется root), вы можете надеяться, что шлюз по умолчанию отвечает общедоступному сообществу SNMP, изучит все его интерфейсы и найдет тот, у которого отключена подсеть. IP-адрес, а затем предположим, что это интернет-ссылка. Затем вы можете запросить у маршрутизатора счетчик трафика на этом интерфейсе.

Конечно, вы обнаружите, что многие SOHO-маршрутизаторы не поддерживают SNMP, а те, которые, вероятно, не поддерживают его.

1 голос
/ 25 февраля 2011

вам нужно прочитать исходный код ifconfig (8), который описывает, как получить статус каждого подключенного сетевого интерфейса.

обратите особое внимание на in_status (), который получает адрес inet и маску интерфейса.

когда адрес источника или назначения в трафике имеет тот же хост, что и локальный интерфейс

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

тогда вы можете быть уверены, что это локально

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

1 голос
/ 25 февраля 2011

Лучший способ - найти «внешний» IP-адрес через eth0, eth1 или любой другой адаптер с системным вызовом ifconfig.Затем извлеките журналы для любой системы (сообщения, системный журнал и т. Д.) И напишите фильтр для этого внешнего IP-адреса.Чтобы сделать его более привлекательным и портативным, напишите регулярное выражение, которое будет фильтровать только общедоступные IP-адреса и просто фильтровать журнал сообщений для этого «внешнего» IP-адреса.

0 голосов
/ 04 ноября 2011

Последнее рабочее решение, которое у меня есть, это использование 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:@""]; - это просто быстрый взлом, который может легко потерпеть неудачу при некоторых особых обстоятельствах, но эй, никто не жалуется, по крайней мере, пока.

0 голосов
/ 05 марта 2011

Существует три диапазона не маршрутизируемых IP-адресов, и они обычно используются в качестве диапазонов адресов для служб NAT.Любой адрес, который не входит ни в один из диапазонов немаршрутизируемых адресов, является внешним адресом.

Конечно, если вы не находитесь за маршрутизатором NAT, задача сложнее (и технически все адреса, за исключением 127.0.0.1 являются внешними в этой точке).

Не маршрутизируемые диапазоны IP:

10.0.0.0 - 10.255.255.255

172.16.0.0 - 172.31.255.255

192.168.0.0 - 192.168.255.255

0 голосов
/ 25 февраля 2011

Не знаю, как реализовать это в target-c, но идея в том, что вы получаете адрес сети, в которой вы находитесь (вы можете выяснить это из класса сети (A, B, C) на основе вашего локального ip или из битов в маске сети, если это не стандартно), тогда просто проверьте адрес исходящего соединения. Если пункт назначения отсутствует в вашей локальной сети, рассчитайте трафик; если он включен, просто ничего не делайте.

0 голосов
/ 25 февраля 2011

Это зависит от того, как вы определяете «локальный», но общим определением будет смотреть на маску сети.

Например, если ваш IP (то есть IP-адрес отслеживаемого интерфейса * 1003)*

10.33.52.123
netmask 255.255.255.0

, что означает, что каждый IP-пакет с исходным и целевым IP-адресами 10.33.52.xx является локальным.

Я не знаю какао или цель-c, но выВозможно, вы сможете использовать некоторые из этих функций, которые помогут вам извлечь сеть из IP-адреса: http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man3/inet_network.3.html

0 голосов
/ 19 февраля 2011

Я думаю, приблизительное решение: getifaddrs можно использовать для получения статистики по использованию сети.

Может получать отдельную статистику для интерфейсов Wi-Fi и WWAN.

Вы можете найти больше информации от:

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

...