WireSharkでキャプチャした結果を表示する際に、邪魔な特定のプロトコルだけを除外したい場合に落とし穴にハマったのでメモ。
#概要
WireSharkのディスプレイフィルタで、否定の比較演算子"!="を使うとハマることがある。ハマるケースと回避方法を紹介するよ。
#こんな時にハマるよ!
特定のプロトコルだけ除外して、残りの通信は表示したいときにはどうフィルタを記述すればいいのだろう。
例えば、あるWebサーバにブラウザでアクセスして処理を発生させ、流れてくるHTTP以外の通信をPCでキャプチャしたいとかの場合、HTTPは邪魔なのでWireSharkで表示したくないわけだ。
もし、HTTPだけを表示するのであればフィルタに下記のように書けば良いから、
tcp.port == 80
これを書き換えて下記のようにすれば良いように思える。
tcp.port != 80
残念ながらこれはうまくいかない。これを指定しても何もフィルタされず、SSHもそうでないものも表示されてしまう。
上記のフィルタの意味は、「SRCポート及びDSTポートの両方が80であるものを除外して、TCPであるもの」という意味だからだ。
では次のように書き換えたらどうだろう。
(tcp.srcport != 80) and (tcp.dstport != 80)
やはりこれでも意図したものとは違ってしまう。
上記のフィルタの意味は、「SRCポートかDSTポートのどちらかでもが80であるものを除外して、TCPであるもの」という意味だからだ。
上記のフィルタではUDPやARPなどTCPではない通信が表示されない。
#こうすると回避できるよ!
意図した通りのことを行おうとするならば、以下のように記述しなければならない。
(not tcp.srcport == 80) and (not tcp.dstport == 80)
これならばHTTP通信を除外し、残りの通信は表示される。
ポイントは比較演算子**!=を使わずに==を使うことだ。比較演算子==は、多分みんなが期待する通りのことをやってくれるのだが、!=は期待したのとはちょっと違う結果を出してしまうのだ。だから==**を使い、NOTでそれを反転させるのが良い。
#そうそう、こうやってもうまくいかないんだよね
そんな面倒なことをしなくてもポート番号指定ではなくプロトコル名httpを使って記述すればいいじゃないか、と思うかもしれない。
not http
この指定でも、なぜか一部のHTTPパケットが表示される。よく見るとHTTP通信の一部、ACKパケットやSYNパケットやらが表示される。多分、WireSharkがHTTPプロトコルとして処理する条件から漏れるものがあるのだろう。HTTP通信の大部分は非表示になるのだが、HTTPの場合は漏れ出てくるACKの数が結構多いのでやっぱり鬱陶しいままだ。
#結論
だから、ちゃんとフィルタしないと死ぬような場合には**!=**は使わない方がいい、NOTを使うべきだね!