「ソフテックだより」では、ソフトウェア開発に関する情報や開発現場における社員の取り組みなどを定期的にお知らせしています。
さまざまなテーマを取り上げていますので、他のソフテックだよりも、ぜひご覧下さい。
ソフテックだより(発行日順)のページへ
ソフテックだより 技術レポート(技術分野別)のページへ
ソフテックだより 現場の声(シーン別)のページへ
現在のシステムはPC単体やマイコン単体といった単体構成は珍しく、多くはPC・マイコン・PLCなど多機種かつ複数台で構成されています。
弊社が得意とする制御系システム・監視システムも例外ではありません。
それらの機器はさまざまな通信方式で接続されますがそのなかでもEthernetが使われることが多いです。
通信の内容は目に見えないためテストするときや不適合が発生したときにはプロトコルアナライザーを使って通信内容を可視化しつつ原因となる範囲を切り分ける必要があります。
今回はフリーのプロトコルアナライザーとして有名なWiresharkでモニタリングする方法をまとめたいと思います。
なお、Wiresharkのダウンロード、インストールおよび基本的な使い方はさまざまなホームページで解説されていますので本稿では説明を割愛いたします。
Wiresharkについて簡単に説明します。
Wiresharkはフリーのプロトコルアナライザーで以下の特徴があります。
図1. TCP/IPプロトコル階層図
次から不適合の再現待ち調査など長時間モニタリングする時に便利な[接続]と[設定]方法を説明します。
多くのシステムはスイッチングHUBを使ってPCなどの機器を接続するため、そのままWiresharkのPCを接続してもそのPCが接続されたポートに入ってくるパケットしかモニタリング出来ません(図2参照)。
そこで他のポートもモニタリング出来るようにWiresharkを調査ターゲットシステムへ接続する方法を説明します。
PC1・PC3の送信データはそれぞれ送信相手のポートだけに送られる。
そのためPC5にWiresharkを入れたとしてもPC1→PC4のデータもPC3→PC2のデータも見ることは出来ない。
図2. スイッチングHUBの通信経路イメージ
スイッチングHUBにはプロトコルアナライザーの接続を考慮したポートミラーリング(※1)と呼ぶ機能を持つものがあります。
HUBの設定方法は商品別に異なりますが、専用ツールソフトやブラウザーなどから複数のモニタリング対象ポートとアナライザー接続ポートを指定するものが多いです。
稼働中システム構成のまま、簡単な設定だけでモニタリングできるメリットがあります。
なお、システム開発で機器を選択するときはあらかじめポートミラーリング可能なHUBを選定して置くのが良いです。
モニタリング対象をスイッチングHUBから切り離してリピータHUB(※2)へ接続する方法です。
これでリピータHUB全ポートに流れるパケットをモニタリング出来ます。
ただし以下の注意点がありますのでこれらが問題にならないときは方法としては簡単です。
PC1がPC3へ送信したデータは全てのポートに送られる。
そのためどのPCにWiresharkを入れても全ポートの通信データを見ることが出来る。
例えばPC5にWiresharkを入れてもPC1→PC3のデータを見ることが出来る。
図3. リピータHUBの通信経路イメージ
電気信号を分岐させる『タップ』(※3)と呼ぶアナライザーをつなぐためのHUBのような機器を用いてアナライザー側PCを接続します。
自分では使ったことはありませんが、以下のメリットがありそうなため是非使いたいと思います。
調査ターゲットシステムにPCがあればそのPCにWiresharkをインストールしてモニタリングする方法です。
ターゲットシステムのPCのみがモニタリング対象の場合には一番簡単な方法です。
デフォルトの設定でモニタリングを続けると物理メモリと仮想メモリを大量に使ってしまい最終的にアプリケーションエラーになって異常終了することがあります。
以下に長時間モニタリングに向いた設定を説明します。
ポイントはパケットをもれなくしキャプチャーし続け、その結果がファイルに一定量保存されるようにすることです。
基本的なことですが、忘れてしまうとモニタリングのログ解析が面倒になります。
パケットのキャプチャー漏れを極力防ぐためにメモリのバッファサイズを増やしておきます。
NIC毎にバッファサイズを設定でき、デフォルトは2Mbytesです。これを可能な範囲で増やします。
[手順]
図4. メモリのバッファサイズ設定
無制限にモニタリングした結果アプリケーションエラーなどで異常終了することが無いよう、保存されるファイルが一定になる設定をします。
[手順]
古いPCや性能が低いPCでモニタリングするときはパケットのキャプチャー漏れが発生する可能性があるため、モニタリング中にパケットリスト画面を表示更新させない設定をしておきます。
負荷を抑えてパケットのキャプチャー漏れを発生させないようにするのが目的です。
[手順]
モニタリングする条件を設定出来ますがここでは設定しないようにします。
どうしてもファイル保存量を減らす必要があるときのみ設定します。
理由はCPUに負荷を掛けるためパケットのキャプチャー漏れが発生する可能性があるためです。
モニタリングしたログの表示時点でもFiler条件を指定出来るため無理に設定する必要はありません。
図5. ファイル保存設定と画面更新禁止設定
設定は以上です。次はモニタリングしたパケットの解析方法を説明します。
モニタリングしたファイルをWiresharkに読込み解析します。
確認する量を減らすためにDisplay Filterで表示のフィルタリング設定をします。
これによりパケットを絞り込み出来ます。
例えばtcp && ip.addr == 192.168.8.1&& tcp.port==28000とすると、
TCPプロトコルかつIPアドレスが192.168.8.1かつポート番号が28000の電文のみを表示させられます。
このあとに不適合が発生した日付・時刻の付近を手掛かりにして解析するパケットを決めると効率的に解析出来ます。
図6. パケットリスト画面の表示フィルタリング設定
上記のあとパケットを解析します。
パケットリストをダブルクリックするとパケット詳細画面が開きます。
アプリケーションが送受信するフィールドはDataです。
Dataをクリックするとその下にバイト単位で表示されます。
ここでアプリケーションの仕様通りかどうかを確認出来ます。
図7. パケット詳細表示
単位時間あたりのパケット数を図8のように確認出来ます。
ここでも上記『5-1パケットの絞り込み設定』と同じくフィルターを設定することで条件別のトラフィックを見ることが出来ます。
以下に設定例を示します。
[手順]
図8. 単位時間あたり送受信パケット数表示
通信シーケンスを図で確認出来ます。
デフォルトでは全電文の表示になりますので下図9オプション選択により『5-1パケットの絞り込み設定』で設定したフィルター結果のみを表示させることが出来ます。
なお電文を示す矢印をクリックすると図6画面で対応するパケットが選択されます。そのパケットをダブルクリックすると図7パケット詳細表示に移行して詳細を確認することが出来ます。
[手順]
図9. 通信シーケンス図表示オプション設定
図10. 通信シーケンス表示
今回はWiresharkによる長時間モニタリングとモニタリング結果の解析についてまとめてみました。
私自身も開発したソフトが現場で運用になってから発生した問題の調査・解析でこのように設定して使った経験がありますが、そのときの症状は平常時ごく稀に伝送異常が発生するというもので、どこからか異常なデータが送られて来ている可能性がありました。
そこで再現するまでWiresharkでモニタリングさせておき、再現時にデータを引き上げて調査し原因を明確にすることが出来ました。
このように発生頻度の低い不適合の再現待ちや、大量にモニタリングしたデータを解析するときに是非今回紹介した方法を活用して頂きたいと思います。
今後も便利な使い方や活用シーンがあれば紹介していきたいと思います。
(N.K.)
関連ページへのリンク
関連するソフテックだより