Wiresharkの表示フィルタ ~論理否定編~

エンジニアノート

 

Wiresharkの表示フィルタの設定で、一度はつまずくポイントが「論理否定」の使い方です。誤った方法でフィルタを設定してしまうと、意図していない結果が表示され、パケット解析の判断に大きく影響を及ぼします。十分注意して設定するようにしましょう。
今回は、実験的にいろいろな論理否定を設定した際の結果をふまえ、どのように設定したらよいかを解説します。

「表示フィルタはどうやって設定するんだっけ?」と思った方は、まず以下のコンテンツからご覧ください。
Wiresharkの表示フィルタ ~基本操作編~
Wiresharkの表示フィルタ ~複数条件設定編~

論理否定

いろいろな論理否定の定義で、最終的にどんなパケットが残るのかを検証してみます。
検証するトレースファイルには、以下の通信が含まれています。

  • TCP80番の通信
  • TCP80番以外の通信
  • UDP80番の通信
  • UDP80番以外の通信
  • ARP

この条件の中でTCP80番以外の通信をフィルタする方法を考えてみます。

Case1: tcp.port==80

はい、これはもちろんTCP80番の通信のみ表示されました。あたりまえですが。

Case2: tcp.port!=80

ではこの場合はどうでしょう?この場合は、TCP80番以外のTCP通信のみ表示されました。
つまり、UDP通信やARP通信は表示されませんでした。

Case3: !tcp.port==80

この条件で、目的のTCP80番以外の通信がすべて表示されました。

Case4: (!tcp.srcport==80) && (!tcp.dstport==80)

今度はあえて、送信元と宛先のポート番号で指定してみました。
この条件でも、目的のTCP80番以外の通信がすべて表示されました。

Case5: (tcp.srcport!=80) && (tcp.dstport!=80)

これは、予想通り、Case2と同じ結果で、TCP80番以外のTCP通信のみ表示されました。

Case6: !(tcp.srcport==80 || tcp.dstport==80)

これでも目的のTCP80番以外の通信がすべて表示されました。
Case4と意味は一緒ですからね。

結果からいえること

条件を否定する際は、パラメータの前に"!"を置くこと、"!="はそのパラメータのそれ以外の値という意味となってしまい、全体の論理否定にはなりません。
今回は"!"や"!="を使用しましたが、"not"や"ne"を使用しても同じ結果が得られます。ただしその場合は、半角スペースを入れる必要があります。
個人的には、記号のほうがスペースを入れても入れなくてもよいですし、打鍵が少なくてすむのでおすすめです。

インバートマッチ(条件の反転)

では次に少し複雑な条件でフィルタを設定します。たとえば「TCP80番以外のTCP通信とARP」以外の通信をフィルタする方法を考えてみます。二重否定だとちょっと複雑ですねぇ。
検証トレースファイルでこの条件を設定した場合、「TCP80番の通信、UDP80番の通信、UDP80番以外の通信」が表示されれば望む結果となります。

  • 条件A: tcp.port!=80 (Case2の条件)
  • 条件B: arp

条件A or Bのインバートマッチ、すなわち"not(A or B)"です。ド・モルガンの法則より、"notA and notB"でも同様の結果が得られます。
ベン図で表示するとこんな感じです。

条件のベン図

Case7: !tcp.port!=80 and !arp

意図通りに設定できました。結果として、TCP80番の通信、UDP80番の通信、UDP80番以外の通信が表示されました。

Case8: !(tcp.port!=80 or arp)

この場合も、Case7と同じ結果でした。

複雑な条件を使用する際の裏技

そうは言ってもフィルタをしながらパケットを除外していく作業をしているとだんだんわからなくなってしまうときがあります。
そのような場合、以下の手段が有効です。

マークパケットのみ(もしくはマークパケット以外)をフィルタする

たまにこのパケットだけフィルタして保存したい、もしくはこのファイルからこのパケットだけを除いてフィルタしたい、ということはあります。
その場合は、パケットにマークをつけて、そのパケットだけをフィルタすることができます。
マーク/アンマークは選択したパケットに対して行うこともできますし、表示されているパケット全体に対しても行うことができます。

マーク/アンマークの方法

パケットを選択して「Ctrlキー+M」を押下するか、[Edit] menu > "Mark/Unmark Packet(s)"を選択します。
表示されているパケット全体に対しては、[Edit] menu > "Mark All Displayed"、"Unmark All Displayed"を選択します。

マーク/アンマークしたパケットのフィルタ定義

マークしたパケットのみ表示するフィルタは、このようになります。

frame.marked == 1

アンマークしたパケットのみ表示する場合は、"1"を"0"にします。

フィルタした結果のみのファイルを保存していく

はい、ひたすら地味な作業です...。でも結局この作業にまさるものはないような気がします。
パケット解析する際、大量のパケットからこれではない、これではないとフィルタで除く作業をしていきますが、一気フィルタするより、段階的にファイルを作成していったほうが結局は近道の場合もあります。
フィルタしたパケットだけでファイルを作成する方法は、[File] menu > "Export Specofied Packets..."を選択して、下図の赤枠の"Displayed"のを選択した状態で保存します。

フィルタ結果のみ保存

今回のまとめ

今回は、論理否定に絞ってWiresharkの保存フィルタを解説しました。
トラブルシューティングは、「この通信を調べる」ということだけではなく、「この通信以外はどうなっているか調べる」ということも多くあります。
論理否定はよく使うと思いますので、まとめてみました。

関連記事

note_addWireshark TIPS

Wiresharkべしべからず集

Wiresharkのおすすめ表示設定

Wiresharkの表示フィルタ ~基本操作編~

Wiresharkの表示フィルタ ~複数条件設定編~

Wiresharkのキャプチャフィルタ ~設定方法と注意点~

Wiresharkの表示フィルタ ~論理否定編~(本記事)

Wiresharkのライフサイクル Ver.4.0のリリースはいつ?