Linuxプロセスネットワークトラフィック統計の実装プロセス

Linuxプロセスネットワークトラフィック統計の実装プロセス

序文

Linux には、ネットワーク接続、プロセス、およびその他の情報をリアルタイムで収集するための対応するオープン ソース ツールがあります。ネットワーク接続には通常、最も基本的な 5 つのタプル情報 (送信元アドレス、宛先アドレス、送信元ポート、宛先ポート、プロトコル番号) に加えて、プロセス情報 (pid、exe、cmdline) などが含まれます。これら 2 つのデータのほとんどは、Linux /proc ディレクトリおよびプロセス ステータス ディレクトリ (/proc/pid/xx) 内のネットワーク ステータス接続ファイル (/proc/net/tcp、/proc/net/udp) から直接読み取ることができます。

一部のアプリケーション セキュリティ シナリオでは、プロセス ネットワーク接続、流入および流出トラフィックなどのデータを組み合わせて、イントラネット内で機密データの悪意のある送信があるかどうかを分析する必要があります。ネットワーク監視中に、大量のサーバー帯域幅が占有されていることがわかりますが、システム内のどのプロセスがそれを占有しているかは明確ではありません。これを実現するには、包括的な分析のために、よりきめ細かいプロセスレベルのネットワーク トラフィック データを取得する必要があります。

ホストレベルのネットワーク データは、Linux proc ディレクトリにあります。たとえば、/proc/net/snmp は、ホストの IP、ICMP、ICMPMsg、TCP、および UDP レイヤーに関する詳細なデータを提供します。/proc/net/netstat ファイルの InBcastPkts、OutBcastPkts、InOctets、および OutOctets フィールドは、送受信されたパケットの数と、受信パケットのバイト データを示します。残念ながら、プロセス レベルの受信および送信ネットワーク トラフィック データはありません。

この目的のために、nethogs の原理を参照して、プロセス レベルのネットワーク トラフィックをカウントする方法を実装します。

基本データ

関係するディレクトリまたはファイル: ネットワーク ステータス ファイル /proc/net/tcp、/proc/net/udp、およびプロセス ファイル記述子ディレクトリ /proc/pid/fd。

ネットワークステータスファイル /proc/net/tcp

それぞれ 2 列目、3 列目、4 列目、11 列目の 5 タプル + ステータス + inode 番号に注目します。

23列目はホストのバイトオーダーip:portです。たとえば、「0500000A:0016」->「10.0.0.5」、22

4 列目はステータス情報です。ステータス フィールドの意味は次のとおりです。

「01」:「確立」、
「02」: 「SYN_SENT」、
「03」:「SYN_RECV」、
“04″: “FIN_WAIT1″、
“05″: “FIN_WAIT2″、
「06」:「時間待ち」、
「07」:「閉じる」
「08」:「CLOSE_WAIT」、
「09」:「LAST_ACK」、
「0A」:「聞く」、
「0B」:「閉会」

11 列目は、ファイル、ディレクトリ、デバイス ファイル、ソケット、パイプなどのメタデータを含む、Linux システム ファイル システム内のファイル システム オブジェクトの inode 番号です。


ファイル記述子を処理する

/proc/pid/fd ディレクトリには、現在のプロセスによって開かれたファイル情報がリストされます。0、1、2 は標準入力、出力、エラーを表します。

ネットワーク接続は、socket: で始まるファイル記述子です。ここで、inode 番号は括弧 [] で囲まれており、これはネットワーク ステータス ファイル /proc/net/tcp 内の inode 番号に対応します。

pid:25133 プロセスを例にとると、ファイル記述子は 10 と 12 で、対応する inode 番号はそれぞれ 512505532 と 512473483 です。同時に、対応する接続​​の詳細情報は、下の図の /proc/net/tcp で確認できます。

上記のファイル情報に基づいて、/proc/net/tcp からネットワーク接続 5 重 -> inode のマッピングを確立でき、/proc/pid/fd から接続 inode -> プロセスのマッピングを確立できます。

このように、i ノード番号は、システム内のプロセスとネットワーク接続情報を関連付けるためのブリッジとして使用されます。

実装プロセス

ネットワーク接続トラフィックをリアルタイムで取得するために、Linux ホスト上でオープンソースの libpcap ライブラリを使用してネットワーク パケットをキャプチャします。実装フローチャート全体は次のようになります。これには次の 5 つの主要なステップが含まれます。

パケットキャプチャ

Libpcap ライブラリを使用して、ネットワーク パケット構造を取得します。

メッセージの解析

パケットの 5 つのタプル (送信元アドレス、宛先アドレス、送信元ポート、宛先ポート、プロトコル番号) 情報と現在のパケットのトラフィック サイズを解析します。

キャッシュの更新

ConnInodeHash 内の 5 つのタプルで構成されるキーに対応する inode 番号を検索します。存在しない場合は、/proc/net/tcp と udp を再度読み取り、ConnInodeHash キャッシュを更新し、接続と inode 間のマッピングを確立し、/proc/pid/fd ディレクトリを再度読み取り、すべてのファイル記述子を走査して socket: で始まる接続をフィルターします。InodeProcessHash キャッシュを更新し、inode とプロセス間のマッピングを再確立します。

ハッシュ検索

見つかった inode 番号に従って、InodeProcessHash で対応するプロセス pid を見つけます。

トラフィック統計

メッセージアドレスに応じてネットワーク接続方向が決定され、プロセスの流入・流出データが蓄積されます。

要約する

Linux ホスト上のパケットをキャプチャし、ネットワーク ステータス ファイルとプロセス ファイル記述子を組み合わせて、きめ細かいプロセス レベルのネットワーク トラフィック収集方法を実装します。

Linux ファイルの inode 番号をブリッジとして使用することで、プロセスとネットワーク接続の関係を関連付けることができます。プロセスが受信/送信した合計量/平均値やその他のディメンション データをカウントし、プロセスの各ネットワーク接続のトラフィック データを分析することもできます。これらは、ホスト トラフィックのセキュリティ分析、ネットワークの監視とトラブルシューティングなどのシナリオの重要な基礎として役立ちます。ただし、libpcap を介してパケットを継続的にキャプチャすると、ホストのパフォーマンスに悪影響を与えることにも注意してください。

上記は、編集者が紹介した Linux プロセス ネットワーク トラフィック統計の実装プロセスです。皆様のお役に立てれば幸いです。ご質問がある場合は、メッセージを残してください。編集者がすぐに返信します。また、123WORDPRESS.COM ウェブサイトをサポートしてくださっている皆様にも感謝申し上げます。

<<:  Ubuntu 15.04 は MySQL リモート ポート 3306 を開きます

>>:  Navicat がリモートで SQL Server に接続し、MySQL に変換する詳細な手順

推薦する

ウェブサイトにファビコンを追加するためのヒント: URLの前の小さなアイコン

いわゆるファビコンは、Favorites Icon の略で、中国語ではウェブサイトアバターと呼ばれて...

ポートマッピング後に Docker コンテナが突然接続に失敗する問題のトラブルシューティング プロセス

1. 背景通常、外部サービスを提供する必要がある Docker コンテナの場合、起動時に -p コマ...

熟練デザイナーの7つの原則(2):色の使い方

<br />前回の記事:優秀なデザイナーの7つの原則(1):フォントデザイン 英語 原文...

CSS3で実装された水平ヘッダーメニュー

結果:実装コードhtml <nav class="dropdownmenu"...

Office ファイルのオンライン プレビュー用の Vue サンプル コード

最近、電子アーカイブに取り組んでおり、バックエンドではファイルの Huawei Cloud OSS ...

ウィンドウ表示効果を実現するJavaScript

この記事では、ウィンドウ表示効果を実現するためのJavaScriptの具体的なコードを参考までに紹介...

SSM VUE Axios の詳細な説明

目次SQL ログを表示するにはどうすればいいですか? ? SpringMVC でのパラメータ渡しの説...

フロントエンド開発者に何百万ドルもの価値をもたらす 10 のスキル

フロントエンド開発者が習得する必要のあるスキル。これらのスキルにより、フロントエンド開発者の価値は数...

MySQL のデフォルトのストレージ エンジンを変更する方法

mysql ストレージ エンジン: MySQL サーバーはモジュール スタイルを採用しており、特にス...

Vue でコミュニケーションを実装する 8 つの方法

目次1. コンポーネント通信1. Props 親コンポーネント ---> 子コンポーネント通信...

Javascript イベントキャプチャとバブリングメソッドの詳細な説明

目次1. イベント処理モデル1. イベントバブリング(1)3つのdiv要素にイベントをバインドする(...

CSS でインラインブロック要素間のギャップを削除するいくつかの方法の詳細な説明

最近、モバイルページを制作する際には、レイアウトにインラインブロック要素がよく使われますが、インライ...

MySQL はカスタムシーケンスを使用して row_number 関数を実装します (詳細な手順)

いくつかの記事を読んだ後、ようやく MySQL で row_number() ソートを実装する方法が...

Linuxカーネルをコンパイルする方法

1. 必要なカーネルバージョンをダウンロードする2. オペレーティングシステムにアップロードする3....

Dockerコンテナ内でホストDocker操作を呼び出して実行する

まず、この投稿は Docker 初心者向けです。もちろん、ベテランであれば記事中の分割線以降の操作方...