はじめに
本稿では、WinPcapで提供されるRPCAPプロトコルに対応したプログラムを作成し、リモートで別ネットワークのパケットをキャプチャする方法について紹介します。また、.NET FrameworkのマネージコードからWinPcapを利用する例となるように、サンプルプログラムはC#で作成しました。
対象読者
- .NET Frameworkを用いてWindowsアプリケーションを開発している方。
- ネットワーク関連のプログラムを作成される方。
必要な環境
サンプルはVisual Studio .NET 2003で作成し、.NET Framework 1.1で動作確認をしています。
サンプルプログラムは、WindowsXP SP2・WinPcap 3.1で動作を確認しています。
リモートキャプチャ
リモートキャプチャは、Remote Capture Protocol(以降「RPCAP」と表記)というプロトコルを使用し、サーバおよびクライアント上で動作する2つのプロセスで構成されています。
クライアントで動作するプロセス(以降「RPCAPクライアント」と表記)は、WinPcapを利用した通常のプログラムです。そして、サーバ側で動作するプロセス(以降「RPCAPサーバ」と表記)は、rpcapdと呼ばれるリモートデーモンであり、実際のモジュールは「rpcapd.exe」です。
RPCAPを使用すると、RPCAPサーバが動作する端末でのネットワーク・トラフィックをモニタして、RPCAPクライアントが動作する別のマシンで、そのパケットを処理(表示・保存など)することができます。
WinPcapでは、このRPCAPを階層下に組み込むことで、WinPcapを使用するプログラムが特に意識することなく、このリモートキャプチャ機能を利用できるようになっています。
今回作成したサンプルプログラムでは、従来のパケットモニターのようにローカルのインターフェースをモニタする「ローカル接続」モードと、RPCAPサーバに接続してRPCAPサーバのインターフェースをモニタする「リモート接続」モードの2つのモードで動作するようにしました。
なお、今後のバージョンで仕様が変更される可能性は十分にありますので、ご利用の際は最新のドキュメントを確認していただく事をお勧めします。
RPCAPサーバの起動
RPCAPサーバは、セキュリティ上のリスクを回避するためインストール時点では動作していません。そのため、これを使用するには利用者が起動する必要があります。
PRCAPサーバは、標準的なWin32実行ファイルであり、サービスおよびコマンドラインのどちらからでも動作します。
サービスによる起動
WinPcapをインストールすると、同時にサービスとしてRPCAPサーバが登録されます。[コントロールパネル]→[管理ツール]→[サービス]を選択すると、Remote Packet Capture Protocol v.0 (experimental)「Allows to capture traffic on this machine from a remote machine.」という行を確認することができます。インストールした時点では、スタートアップの種類は「手動」で、サービス状態は「停止」になっています。
これを「開始」にするだけで、デフォルト設定でRPCAPサーバが起動します。
サービスのプロパティで「実行ファイルのパス」を確認すると分かりますが、WinPcapをインストールしたフォルダにある「rpcapd.exe」というプログラムを-d「デーモン起動」で実行しているだけです。
"C:\Program Files\WinPcap\rpcapd.exe" -d -f "C:\Program Files\WinPcap\rpcapd.ini"
また、パラメータを受け取るファイルは、同フォルダの「rpcapd.ini」になっており、このファイルを編集することで「rpcapd.exe」に起動パラメータを渡すことが可能になっています。
コマンドラインからの起動
WinPcapインストールしていないコンピュータであっても、「rpcapd.exe」をコピーしてコマンドラインから起動することが可能です。
ここでWinPcapドキュメントから、「rpcapd.exe」パラメータについて簡単に紹介しておきます。
スイッチ | 解説 |
-b <address> | バインドするアドレス(デフォルトでは、すべてのローカルアドレスにバインドされます) |
-p <port> | バインドするポート番号(デフォルトでは、2002番ポートにバインドします) |
-l <host_list_file> | 接続を許可するホストのリストを保存するファイル指定 |
-n | NULL認証の許可(デフォルトでは、認証が必要になっています) |
-a <host, port> | デーモンをアクティブモードで実行 |
-d | デーモンをバックグラウンド(サービス)で実行 |
-s <file> | 現在の設定をファイルに保存 |
-f <file> | 設定をファイルから読み込む |
-h | ヘルプ表示 |