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

推薦する

CSS3 カテゴリメニュー効果

CSS3 カテゴリ メニューの効果は次のとおりです。 html <html> <ヘ...

Windows 10 Home Edition に Docker をインストールする方法

最近、プロジェクトをアップグレードするために Docker を使用しました。これまで使用したことがな...

純粋な CSS3 を使用して、円の動的な光る特殊効果アニメーションを実装するためのサンプル コード

この記事では、主に、円形のダイナミックな光る特殊効果アニメーションを実現するための純粋な CSS3 ...

ショートカットアイコンとアイコンコードの違いの紹介

ステートメント 1: <link rel="shortcut icon" ...

ES9の新機能の詳細な説明: 非同期反復

目次非同期トラバーサル非同期反復可能トラバーサル非同期反復生成非同期メソッドと非同期ジェネレーター非...

フロントエンドインタビューに必要なホモロジーとクロスドメインの詳細な説明

序文ご存知のとおり、ブラウザの相同性戦略とクロスドメイン方式も、フロントエンド面接で頻繁に遭遇する問...

Vue で Axios 非同期リクエスト API を使用する方法

目次基本的なHTTPリクエストの設定async/await を使用した Axios Axios によ...

Vue3 の emitting と attr の違いの分析

目次結論は実践分析拡張機能要約する結論は親コンポーネントでカスタム イベントが定義されている場合、子...

mysql エラー 1045 (28000) - ユーザーへのアクセスが拒否される問題を解決する方法

問題の説明 (以下の説明は Windows 環境に限定されます): D:\develop\ide\m...

Docker メモリ監視とストレステストの方法

起動していたDockerコンテナはメモリを使い果たした状態になっており、再起動せずにコンテナのメモリ...

CSSで背景ぼかしを設定する方法

ページを作成するときに、ページの見栄えを良くするために、背景画像を設定する必要があることがよくありま...

MySQL スライディングオーダー問題の原理と解決の例分析

この記事では、例を使用して、MySQL スライディング順序問題の原理と解決方法を説明します。ご参考ま...

標準的なHTMLの書き方は、Dreamweaverによって自動的に生成されるものとは異なります。

コードをコピーコードは次のとおりです。 <!--doctype はドキュメント タイプ htm...

CSSをインポートする方法に関する詳細な洞察の要約

CSS の開発履歴についてはここでは紹介しません。ブログを書いている理由の 1 つは、フロントエンド...

Vue は書籍管理ケースを実装します

この記事では、書籍管理を実装するためのVueの具体的なコードを例として紹介します。具体的な内容は次の...