10

ネットワークの使用状況を監視するアプリに取り組んでいます。ただし、これを行う多くの方法では、ローカル トラフィック (Time Machine など) を除外できないことに気付きました。

ローカル トラフィックを除外する方法を探しており、インターネットと直接やり取りする使用状況のみを監視しています。

更新:返信ありがとうございます。トラフィックがローカルかどうかを確認する方法はわかりましたが、合計の入出力バイト数を計算する方法はまだわかりません (以前に詳しく説明していなかったら申し訳ありません)。一定期間内、または OS の起動以降に、ローカル (またはインターネット) で送受信されたバイト数を知る方法がありません。この問題は、OS の実行中にプロセスが起動または強制終了されるという事実によってさらに複雑になります。

Linux/Mac OSX でネットワーク アダプタの統計情報を取得する方法は? 総使用量を合計する興味深い方法を提供しますが、合計される使用量はインターフェース統計であるため、役に立ちません。

更新 2 : これに対する最終的な解決策を投稿しました。少し下にスクロールしてご覧ください。

4

8 に答える 8

2

どのインターフェイスがローカル トラフィックを運ぶかについてのコメントに答えるのは、ローカル トラフィックの意味に依存するため、実際には複雑です。

「ローカル」とは

「ローカル トラフィック」の最も簡単な意味は、生成されたマシンを離れないトラフィックです (たとえば、同じマシン上の 2 つのプログラムが互いに通信している場合など)。このトラフィックはすべて行き過ぎます。これは、人々がローカルと言うときに意味することの 1 つです (そして、私が答えたときに考えていたことです)。

次に簡単な意味は、「同じサブネット上のマシン宛ての IP トラフィック」です。これは、ローカル サブネット内の宛先アドレスを持つトラフィックです。これをカウントする最も簡単な方法は、ルーティング テーブル (Mac OS X がルートごとにトラフィック統計をカウントする場合、さまざまなゲートウェイのルートが非ローカル トラフィックを提供します) またはファイアウォール ルールを使用することです。これはおそらく、「ローカル トラフィック」と言うときに誰もが意味するものではありません。

もう 1 つの意味は、「この (物理的な) 場所にあるマシン宛ての IP トラフィック」です。たとえば、私のオフィスでは複数のサブネットが使用されており、それらの間にルーターがありますが、一方のサブネットから他方のサブネットへのトラフィックは依然として明らかにローカルです。この定義でローカル トラフィックと非ローカル トラフィックを区別するには、ネットワークの知識が必要です。

もう 1 つの意味は、「組織内のマシン宛ての IP トラフィック」です。これは、ネットワークがどのように設定されているかによっては妥当な意味です (たとえば、2 つの場所の間に高速なファイバーがある場合でも、インターネット接続がはるかに遅いか、GB ごとに課金される場合など)。宛先がローカルであるかどうかを判断するには、ネットワークに関する深い知識が必要です。また、VPN などの場合、時間の経過とともに変化する可能性があります。

最後に、「インターネット トラフィック」はこれらのどれとも反対ではありません。たとえば、イーサネット セグメント上のローカル マシンのように見えるものが、実際には VPN 経由、つまりインターネット経由である場合があります (これはおかしなことではなく、リモート ユーザーがさまざまな Windows サービスを使用する必要がある場合に非常に役立ちます)。組織内のトラフィックは、インターネット VPN を介して簡単に移動できます。

単純なネットワークでの不正行為

ネットワークが非常に単純で、内部サブネットが 1 つしかなく、ルーターも 1 つしかなく、その内部サブネット以外のすべてのトラフィックがインターネット トラフィックである場合は、ごまかしてこれを解決できます。これはおそらく、ホーム ネットワークの大部分に当てはまり、多くの小規模ビジネス ネットワークにも当てはまります。

ファイアウォール ルールの使用

単純なネットワーク設定では、おそらくいくつかの仮定を行い、次の場合にトラフィックを非ローカルとしてカウントすることで、十分に近い答えを得ることができます。

  • 宛先 MAC アドレスは、デフォルト ゲートウェイの MAC アドレスです。と
  • 宛先 IP アドレスがデフォルト ゲートウェイの IPアドレスではない

または:

  • 宛先 IP アドレスがネットワーク インターフェイスのサブネット内にない デフォルト ルートが送信される

おそらく、それらのいずれかをカウントするファイアウォール ルールを作成できます。少なくとも Linux の iptables では可能です。BSD pf と、おそらく Mac OS X.

別のアプローチ: SNMP

最後に、(ルートが必要なため) ファイアウォール ルールを使用できない場合は、デフォルト ゲートウェイが SNMP コミュニティ パブリックに応答し、そのすべてのインターフェイスを調べて、サブネット外の IP アドレスを持つインターフェイスを見つけることを期待できます。次に、それがインターネット リンクであると想定します。次に、そのインターフェイスのトラフィック数をルーターに問い合わせることができます。

もちろん、多くの SOHO ルーターは SNMP をサポートしていません。

于 2011-04-01T18:05:04.553 に答える
2

ifconfig(8) のソースを読む必要があります。このソースには、接続されているすべてのネットワーク インターフェイスのステータスを取得する方法が記述されています。

インターフェイスの inet アドレスとネットマスクを取得する in_status() に特に注意してください。

トラフィックの送信元または宛先アドレスがローカル インターフェイスと同じホストを持っている場合

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

于 2011-02-25T16:37:46.023 に答える
1

最善の方法は、ifconfig へのシステム コールを使用して、eth0、eth1、または任意のアダプターを介して「外部」IP アドレスを見つけることです。次に、どのシステム (メッセージ、syslog など) のログを取得し、その外部 IP アドレスのフィルターを書き込みます。より適切で移植性を高めるには、パブリックにルーティング可能な IP のみをフィルター処理し、その「外部」IP アドレスのメッセージ ログのみをフィルター処理する正規表現を記述します。

于 2011-02-25T12:51:08.920 に答える
0

Objective-cで実装する方法はわかりませんが、現在のネットワークのアドレスを取得するという考え方です(これは、ローカルIPまたはからのネットワーククラス(A、B、C)から把握できます)。標準でない場合はネットマスクのビット)、発信接続のアドレスを確認するだけです。宛先がローカルネットワークにない場合は、トラフィックを計算します。入っている場合は、何もしません。

于 2011-02-25T15:03:31.043 に答える
0

おおよその解決策だと思います。 getifaddrs を使用して、ネットワーク使用状況に関する統計を取得できます。

Wi-Fi および WWAN インターフェイスの個別の統計を取得できます。

詳細については、次を参照してください。

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

于 2011-02-19T19:24:36.220 に答える
0

「ローカル」をどのように定義するかによって異なりますが、一般的な定義はネットワーク マスクを調べることです。

たとえば、あなたのIP(つまり、監視するインターフェースのIPが

10.33.52.123
netmask 255.255.255.0

これは、送信元 IP と宛先 IP の両方が 10.33.52.xx であるすべての IP パケットがローカルであることを意味します。

cocoa や Objective-C についてはわかりませんが、IP アドレスからネットワークを抽出するのに役立つこれらの関数のいくつかを使用できる可能性があります: http://developer.apple.com/library/mac/#documentation/Darwin/リファレンス/ManPages/man3/inet_network.3.html

于 2011-02-25T07:32:03.427 に答える
0

ルーティング不可能な IP アドレスには 3 つの範囲があり、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

于 2011-03-04T22:01:01.067 に答える
0

私が持っている最終的な実用的な解決策は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:@""];いますが、少なくともまだ誰も文句を言っていません.

于 2011-11-03T23:32:27.577 に答える