Мониторинг использования сети, исключая локальный трафик

StackOverflow https://stackoverflow.com/questions/4281531

Вопрос

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

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

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

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

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

Это было полезно?

Решение 8

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

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

В качестве альтернативы:

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

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

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

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

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

Лучший способ - найти «внешний» IP-адрес через ETH0, ETH1 или любой адаптер с системным вызовом IFCONFIG. Затем потяните журналы для любой системы (сообщений, Syslog, что угодно) и напишите фильтр для этого внешнего IP-адреса. Чтобы сделать его более приятным и более портативным, напишите Regeex, которое будет фильтровать для публично маршрутизации только IPS, и просто фильтрация сообщений журнала для этого «внешний» IP-адрес.

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

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

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

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.

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

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

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

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

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

Например, если ваш IP (т.е. IP интерфейса, который вы мониторируете

10.33.52.123
netmask 255.255.255.0

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

Я не знаю какао или объектив, с, но вы, вероятно, можете использовать некоторые из этих функций, помогающие вам извлечь сеть из IP-адреса: http://developer.apple.com/library/mac/#documentation/darwin/reference/manpages/man3/inet_network.3.html.

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

Существует три диапазона непереворотных 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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top