質問

ネットワークの使用を監視するアプリに取り組んでいます。しかし、これを行う方法は多くの方法で、ローカルトラフィックの除外を許可していないことに気付きました(たとえば、タイムマシン)。

私は地元のトラフィックを除外する方法を探しています。そして、インターネットとの間で直接通る使用法のみを監視しています。

アップデート: :返信ありがとうございます。トラフィックがローカルであるかどうかを確認する方法はわかりましたが、合計イン/アウトバイトを計算する方法がわかりません(以前に詳しく説明しなかった場合は申し訳ありません)。一定期間中、またはOSが開始されてから、ローカル(またはインターネットに)送信/受信されるバイトの数を知る方法はありません。この問題は、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:@""]; いくつかの独特な状況で簡単に失敗する可能性がある迅速なハックですが、少なくともまだ誰も文句を言っていません。

他のヒント

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

「ローカル」の意味

「ローカルトラフィック」の最も簡単な意味は、たとえば、同じマシン上の2つのプログラムが互いに話し合う2つのプログラムを残していないトラフィックです。このトラフィックはすべてLOを超えています。これは、人々が地元のことを言うとき(そして私が答えたときに考えていたこと)を意味することの1つです。

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

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

別の意味は、「私の組織内のマシンに運命づけられたIPトラフィック」です。これは、ネットワークのセットアップ方法に応じて合理的な意味です(たとえば、場所の間に高速ファイバーがあるかもしれませんが、インターネット接続ははるかに遅く、またはGBごとに充電されます)。目的地がローカルになるかどうかを把握するには、ネットワークの詳細な知識が必要です。 時間とともに異なる場合があります。

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

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

ネットワークが非常にシンプルで、内部サブネットが1つしかなく、1つのルーターのみであり、その内部サブネットのすべてのトラフィックがインターネットトラフィックではない場合は、これをチートして解決できます。これはおそらく、ホームネットワークの大部分、および多くの中小企業にも当てはまります。

ファイアウォールルールを使用します

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

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

または、

  • 宛先IPアドレスはネットワークインターフェイスのサブネット内にありませんデフォルトのルートが出ます

おそらく、それらのいずれかを数えるためにファイアウォールルールを作成できます。少なくともLinux Iptablesを使用すると、BSD PF、そしておそらくMac OS Xがかなり確信しています。

代替アプローチ:SNMP

最後に、ファイアウォールルールを使用できない場合(ルートが必要な場合)、デフォルトのゲートウェイがSNMPコミュニティパブリックに応答し、そのすべてのインターフェイスを探索し、オフサブネットIPアドレスのあるインターフェイスを見つけてください。そして、それがインターネットリンクであると仮定します。次に、そのインターフェイスのトラフィックカウントについてルーターに尋ねることができます。

もちろん、多くのソーホールーターがSNMPをサポートしていないことがわかり、おそらくそれがオンになっていないことがわかります。

最良の方法は、ifconfigへのシステム呼び出しを備えたETH0、ETH1、またはあらゆるアダプターを介して「外部」IPアドレスを見つけることです。次に、あらゆるシステム(メッセージ、syslogなど)のログをプルし、その外部IPアドレスのフィルターを書き込みます。より良く、よりポータブルにするために、公開されているIPSのみをフィルタリングし、その「外部」IPアドレスのメッセージログをフィルタリングする正規表現を書きます。

添付されたすべてのネットワークインターフェイスのステータスを取得する方法について説明する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

おおよそのソリューション: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

これは、Source-IPとDestination-IP 10.33.52.xxの両方を備えたすべてのIPパケットがローカルであることを意味します。

CocoaやObjective-Cはわかりませんが、おそらくこれらの機能のいくつかを使用して、IPアドレスからネットワークを抽出するのに役立つことができます。 http://developer.apple.com/library/mac/#documentation/darwin/reference/manpages/man3/inet_network.3.html

Objective-Cでそれを実装する方法がわからないが、アイデアは、あなたがいるネットワークのアドレスを取得するということです(あなたはあなたのローカルIPまたはネットマスクのビットが標準でない場合は)、発信接続のアドレスを確認してください。目的地がローカルネットワークにない場合は、トラフィックを計算します。それが入っているなら、何もしないでください。

3つの範囲には、普及不可能なIPアドレスがあり、それらは一般にNATサービスのアドレス範囲として使用されます。不可能なアドレス範囲の1つにないアドレスは、外部アドレスです。

もちろん、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