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 に変換する詳細な手順

推薦する

VUE ユニアプリテンプレート構文についての簡単な説明

1.v-bind(略称:)コンポーネント プロパティのデータで定義されたデータ変数を使用するか、コン...

MySql 5.7.17 無料インストール構成チュートリアルの詳細な説明

1. mysql-5.7.17-winx64.zip インストール パッケージをダウンロードします ...

MySQL でよく使用されるステートメントの包括的な概要 (必読)

以下にまとめたナレッジポイントはどれもよく使われる貴重な情報ばかりですので、ぜひ上手に集めてください...

MySQL スロークエリログの有効化と設定

導入MySQL スロー クエリ ログは、問題のある SQL ステートメントのトラブルシューティングや...

Vue-router プログラムナビゲーションの 2 つの実装コード

ページをナビゲートする2つの方法宣言型ナビゲーション: リンクをクリックしてナビゲーションを実現する...

docker+devpi を使用してローカル pypi ソースをビルドする方法

以前、開発で頻繁に pip ダウンロードを使用する必要がありました。pip ソースを国産ソースに変更...

Python スクリプトを Ubuntu で直接実行する方法

翻訳プログラムを例に挙げてみます。前回はWindowsでのアプリケーションのパッケージ化についてお話...

VMware仮想マシンにdeepin20をインストールする最も完全で詳細なプロセス

仮想マシンソフトウェア: VMware Workstationイメージ: deepin-deskto...

XHTML 入門チュートリアル: シンプルな Web ページの作成

1 分で最初の Web ページを作成します。簡単な Web ページを作ってみましょう。ぜひフォローし...

Google ブラウザのラベルと入力間のスペースに関する小さな問題

最初にコード、次にテキストコードをコピーコードは次のとおりです。 <!DOCTYPE html...

チェックボックスの不確定プロパティの使用の紹介

Windows XP でフォルダーのプロパティ ダイアログ ボックスを使用すると、フォルダーの属性カ...

シンプルなタブバー切り替えケースを実現するJavaScript

この記事では、タブバーの切り替え効果を簡単に実現するためのJavaScriptの具体的なコードを参考...

CSS3 で高さと幅を不定にして垂直と水平に中央揃えするいくつかの方法

1. フレックスレイアウト 。父親 { ディスプレイ: フレックス; コンテンツの中央揃え: 中央;...

Webデザイナーの成長体験

<br />まず最初に、私はこのグループの中では完全な新人だということを述べなければなり...

CocosCreator クラシック エントリー プロジェクト flappybird

目次開発環境ゲームエンジンのコンセプトCocos Creatorについてプロジェクト構造コード編集環...