【保存版】Wiresharkの表示フィルタ ~論理否定編~

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

なお、「表示フィルタはどうやって設定するんだっけ?」と思った方は、まず以下のコンテンツからご覧ください。
【保存版】Wiresharkの表示フィルタ ~基本操作編~(Ver.3/4 機能比較付き)
【保存版】Wiresharkの表示フィルタ ~複数条件設定編~(Ver.3/4 機能比較付き)

2022年10月にWireshark Ver.4.0がリリースされました。記述にあるVer.3.xはVer.3.6.9、Ver.4.xは4.0.1でそれぞれ検証しています。

論理否定否の方法

論理否定方法は、2つの方法があります。

  • "!="(もしくは"ne")で条件を否定する方法
  • "!"(もしくは"not")で条件を否定する方法

これらの違いは検証結果を踏まえて解説します。

論理否定の検証

いろいろな論理否定の表現を設定し、どんなパケットが表示されるかの結果を検証してみます。
検証するトレースファイルには、以下の通信が含まれています。

プロトコル 送信元 宛先
ARP 00:00:00:00:00:00 ff:ff:ff:ff:ff:ff
TCP#1 192.168.0.1:100 192.168.0.255:1000
TCP#2 192.168.0.1:200 192.168.0.255:2000
UDP#1 192.168.0.1:100 192.168.0.255:1000
UDP#2 192.168.0.1:200 192.168.0.255:2000

この条件の中でTCP100番以外の通信をフィルタする方法を考えてみます。4通りの条件で検証した結果が以下です。

1."!="(もしくは"ne")の検証

tcp.port != 100

この条件でフィルタした場合は、TCPの100番ポート以外のTCP通信という意味になります。
つまり、表示されたパケットは、TCP#2のみです。

2."!"(もしくは"not")の検証

!tcp.port == 100

この条件でフィルタした場合は、TCPの100番以外のすべての通信、すなわちARP、TCP#2、UDP#1、UDP#2が表示されました。

3.組み合わせでの"!="(もしくは"ne")の検証

(tcp.srcport != 100) && (tcp.dstport != 100)

この条件でフィルタした場合も、TCPの送信元と宛先が100番ポート以外のTCP通信という意味になります。
つまり、表示されたパケットは、TCP#2のみです。

4.組み合わせでの"!"(もしくは"not")の検証

(!tcp.srcport == 100) && (!tcp.dstport == 100)

# ドモルガンの法則より以下も同様
!(tcp.srcport == 100 || tcp.dstport == 100)

この条件でフィルタした場合も、TCPの100番以外のすべての通信、すなわちARP、TCP#2、UDP#1、UDP#2が表示されました。

結果からの考察

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

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

では次に少し複雑な条件でフィルタを設定します。たとえば「TCP100番以外のTCP通信とARP」以外の通信をフィルタする方法を考えてみます。二重否定だとちょっと複雑ですね。
ようは、TCP#1、UDP#1、UDP#2を表示する方法です。

  • 条件A: tcp.port!=100
  • 条件B: arp

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

条件のベン図

この場合は、以下のように入力します。

!tcp.port !=100 and !arp

# ドモルガンの法則より以下も同様
!(tcp.port != 100 or arp)

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

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

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

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

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

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

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

フィルタ定義は、以下の通りです。

# マークしたパケットのみ表示
frame.marked == 1

# アンマークしたパケットのみ表示
frame.marked == 0

2.フィルタした結果の保存を繰り返す

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

フィルタ結果のみ保存

あとがき

今回は、Wiresharkの保存フィルタを論理否定に絞って解説しました。
パケット分析する際は、「この通信がどうなっているかを調べる」だけではなく、「この通信以外はどうなっているか調べる」機会にもよく遭遇します。
Wiresharkの論理否定フィルタは実際よく使用しますので、まとめてみました。

検証した内容における論理否定の定義については、Ver.3.xとVer.4.xの差分はありませんでした。あらたに差分を発見したときは、内容を更新したいと思います。