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

推薦する

Windows サーバー ファイルをローカルにバックアップする方法、Windows サーバー データ バックアップ ソリューション

重要なデータはバックアップする必要があり、リアルタイムでバックアップする必要があります。そうしないと...

mysql ワイルドカード (sql 高度なフィルタリング)

目次まず、値の一部と一致させるために使用される特殊文字であるワイルドカードについて簡単に紹介します。...

html ページ!--[IE の場合]...![endif]--使用方法の詳細な紹介

コードをコピーコードは次のとおりです。 <!--[IEの場合]><script t...

HTML テーブルタグチュートリアル (33): セルの垂直配置属性 VALIGN

垂直方向では、セルの配置を上、中央、下に設定できます。基本的な構文<TD VLIGN=&quo...

18 個のキラー JavaScript ワンライナー

序文JavaScript は習得が最も簡単な言語の 1 つであるため、成長と繁栄を続けており、市場に...

HTMLデザインパターンの日々の勉強ノート

HTML デザインパターン学習ノート今週は主にHTMLデザインパターンを学びました。学習内容をまとめ...

CSS フォーム検証機能の実装コード

レンダリング原理フォーム要素には、正規表現(携帯電話番号、メールアドレス、IDカードなど)をカスタマ...

element-ui 写真をアップロードした後、座標点をマークします

要素UIとはelement-ui は、Ele.me のフロントエンド チームが開発者、デザイナー、製...

Linuxの相対パスと絶対パスの使用

01. 概要絶対パスと相対パスはシェル環境でよく使用され、それぞれに独自の用途があります。相対パスの...

PID を作成できないために MySQL が起動できない問題を解決する方法

問題の説明MySQL 起動エラー メッセージは次のとおりです。 mysqld を起動します (sys...

MySQL における datetime と timestamp の違いと使い方

1. MySQL で現在の時刻を表現するにはどうすればよいでしょうか?実際、表現方法はいろいろありま...

mysqlは時間を自動的に追加し、時間を自動的に追加および更新する操作を実装します

時間フィールドは、データベースの使用時によく使用されます。よく使われるのは作成時間と更新時間です。し...

VirtualBoxにOpenSuseをインストールする方法

仮想マシンはホストマシンにインストールされます。 CPU とメモリはホスト マシンと共有する必要があ...

MySql ストアド プロシージャ パラメータの初歩的な使用法の詳細な説明

パラメータでのストアドプロシージャの使用IN パラメータは、プロシージャに情報を渡すためにのみ使用さ...

MySQLスローログに関する知識のまとめ

目次1. スローログの紹介2. スローログの練習1. スローログの紹介スロー ログの正式名称はスロー...