【Wireshark】よく使用する表示フィルタ

Wireshark でキャプチャデータを見るときは、膨大なパケットの中から条件に合うパケットだけを取り出してから解析することがよくあります。Wireshark の表示フィルタを使うと、プロトコルやフィールドの値を条件に、表示するパケットを絞り込めます。

この記事では、よく使う表示フィルタの条件と、解析に便利な列(カラム)のカスタマイズをまとめます。

この記事でわかること
  1. パケットの詳細から列を追加する方法と、表示フィルタの入れ方
  2. AND・OR・否定の組み合わせ方
  3. MAC/IP アドレス、ARP、ICMP、TCP、UDP のフィルタ
  4. DNS、HTTP、TLS のフィルタと、応答時間や接続先を見る列
表示フィルタとキャプチャフィルタ

表示フィルタは、キャプチャしたデータのうち表示するパケットを絞り込むもので、キャプチャデータそのものは変わりません。キャプチャするパケットを絞り込むキャプチャフィルタとは書き方が違います。キャプチャフィルタは 【Wireshark】キャプチャ取得するパケットをフィルタする を参照してください。

表示カラムの変更

既定では、パケット一覧の列は No.、Time、Source、Destination、Protocol、Length、Info です。この列はカスタマイズできます。

たとえば、TCP の送信元ポートを列に追加するとします。パケットの詳細で列にしたいフィールドを右クリックし、Apply as Column をクリックします。

画面イメージについて

この記事の画面は、実際の画面ではなく、検証時の画面から見るポイントを抜き出して描いたイメージです。検証時の画面は英語表示です。バージョンによって、項目の並びや表記は変わります。

パケットの詳細(Wireshark)画面イメージ
▾ Transmission Control Protocol, Src Port: 443, Dst Port: 49348, Seq: 1, Ack: 1, Len: 1471    Source Port: 443    Destination Port: 49348    [Stream index: 0]    [TCP Segment Len: 147]
右クリックメニュー
Expand Subtrees / Collapse Subtrees / Expand All / Collapse All
2Apply as Column
Apply as Filter ›
Prepare as Filter ›
No.TimeSourceDestinationProtocolLengthSource PortInfo
10.000000(伏せています)(伏せています)TLSv1.22133443Application Data
図1 フィールドを列に追加する(実際の画面ではなく、操作のポイントを示したイメージです)
No.操作・表示内容
1Source Port: 443列にしたいフィールドを選んで右クリックします
2Apply as Column選んだフィールドが列として追加されます
3Source Port 列追加された列。列の見出しをドラッグ&ドロップすると、位置を変えられます

以降のフィルタの例では、フィルタの対象にしたフィールドを列に追加して確認しています。

表示フィルタは、パケット一覧の上にある表示フィルタのツールバーに条件を入力し、Enter キーで適用します。正しい構文なら入力欄の背景が緑になります。

表示フィルタのツールバー(Wireshark)画面イメージ
1ip.addr == 192.168.1.10
No.ProtocolLengthInfo
1TCP54443 → 49622 [ACK] Seq=1 Ack=1 Win=67 …
2TCP54[TCP ACKed unseen segment] 49622 → 443 …
3UDP24662324 → 443 Len=204
4UDP69443 → 62324 Len=27
図2 表示フィルタを入れたところ。Source と Destination の列は省いています(実際の画面ではなく、表示のポイントを示したイメージです)
No.表示意味
1緑の入力欄表示フィルタとして正しい構文です。誤りがあると赤になります

組み合わせ・除外条件

例の IP アドレスや MAC アドレスは、説明用の値にしています。

AND条件( && )

複数の条件を AND(かつ)でつなぐには &&(または and)を使います。送信元 IP アドレスが 192.168.1.10 で、かつ TCP の宛先ポートが 443 のパケットを表示する場合は次のように書きます。

(ip.src == 192.168.1.10) && (tcp.dstport == 443)

OR条件( || )

複数の条件を OR(または)でつなぐには ||(または or)を使います。送信元 IP アドレスが 192.168.1.10、もしくは TCP の宛先ポートが 443 のパケットを表示する場合は次のように書きます。

(ip.src == 192.168.1.10) || (tcp.dstport == 443)

除外( ! )

特定の条件を除外したいときは、条件の前に !(または not)を付けます。送信元 IP アドレスが 192.168.1.10 でないパケットを表示する場合は次のように書きます。

!(ip.src == 192.168.1.10)
補足
  • 比較には ==(eq)、!=(ne)、>(gt)、<(lt)、>=(ge)、<=(le)、contains、matches が使えます。
  • != の意味は Wireshark 3.6 で変わりました。3.6 より前の版で ip.addr != 192.168.1.10 と書くと、送信元か宛先のどちらかが違えば表示されてしまうので、除外には !(ip.addr == 192.168.1.10) の書き方が確実です。
  • 複数の値のどれかに一致するものは、tcp.port in {80, 443, 8080} のように in で書けます。

MACアドレス

フィルタ表示されるパケット
eth.addr == 00:00:5e:00:53:01送信元か宛先の MAC アドレスが 00:00:5e:00:53:01
eth.src == 00:00:5e:00:53:01送信元の MAC アドレスが 00:00:5e:00:53:01
eth.dst == 00:00:5e:00:53:01宛先の MAC アドレスが 00:00:5e:00:53:01

特定のベンダーのMACアドレス

MAC アドレスの先頭3バイトは、ベンダーを表す OUI です。送信元 MAC アドレスのベンダーが Apple, Inc.(6c:96:cf)のパケットを表示する場合は、送信元 MAC アドレスの先頭から3バイトを取り出して比べます。[0:3] は「0バイト目から3バイト分」という意味です。

eth.src[0:3]==6c:96:cf

宛先MACアドレスがブロードキャスト もしくは マルチキャスト(eth.ig)

MAC アドレスの最初のオクテット(1バイト目)の最下位ビットを I/G ビットといい、このビットが 1 のアドレスはブロードキャストかマルチキャストのアドレスです。I/G ビットは、MAC アドレスを書いたときの1バイト目の、2進数でいちばん右のビットにあたります。

最初のオクテットの最下位ビット = I/G ビットI/G6c:96:cf:…先頭 6c01101100I/G=0:ユニキャスト01:00:5e:…先頭 0100000001I/G=1:マルチキャストff:ff:ff:…先頭 ff11111111I/G=1:ブロードキャスト2進数は左が上位ビット。I/G ビットはいちばん右(最下位)のビット
図3 I/G ビットの位置

詳細は次の記事を参考にしてください。

>> 参考記事:【マルチキャスト】MACアドレスへのマッピング

eth.ig == 1
eth.ig == 1 の結果(Wireshark)画面イメージ
IG biteth.dstDestinationProtocol
1Group address (multicast/broadcast)33:33:00:00:00:fbff02::fbMDNS
Group address (multicast/broadcast)01:00:5e:7f:ff:fa239.255.255.250SSDP
Group address (multicast/broadcast)2ff:ff:ff:ff:ff:ff255.255.255.255DB-…
図4 eth.ig == 1 で表示したパケット。Source の列は省いています(実際の画面ではなく、表示のポイントを示したイメージです)
No.表示意味
133:33:…、01:00:5e:…IPv6 と IPv4 のマルチキャストの MAC アドレスです
2ff:ff:ff:ff:ff:ffブロードキャストの MAC アドレスです
補足

eth.ig は送信元と宛先の両方のアドレスに含まれるフィールドです。Wireshark 3.2 以降では、宛先だけを見る eth.dst.ig も使えます。

宛先MACアドレスがマルチキャストのみ

宛先 MAC アドレスがマルチキャストのものだけを表示したい場合は、I/G ビットが 1 のもののうち、ブロードキャストアドレス(ff:ff:ff:ff:ff:ff)を除きます。

(eth.ig == 1) && !(eth.dst==ff:ff:ff:ff:ff:ff)

IPアドレス

アドレスを用いたフィルタ

フィルタ表示されるパケット
ip.addr == 192.168.1.10送信元か宛先の IP アドレスが 192.168.1.10
ip.src == 192.168.1.10送信元 IP アドレスが 192.168.1.10
ip.dst == 192.168.1.10宛先 IP アドレスが 192.168.1.10
ip.addr == 172.217.0.0/19送信元か宛先の IP アドレスが 172.217.0.0/19 の範囲
ip.src == 172.217.0.0/19送信元 IP アドレスが 172.217.0.0/19 の範囲
ip.dst == 172.217.0.0/19宛先 IP アドレスが 172.217.0.0/19 の範囲

IP アドレスのあとに /プレフィックス長 を付けると、セグメント(ネットワーク)単位で絞り込めます。

フラグを用いたフィルタ

DFビット(ip.flags.df)

IP ヘッダの DF(Don’t Fragment)ビットが立っているパケットを表示します。DF ビットが立っているパケットは、途中のルータでフラグメント(分割)できません。

ip.flags.df == 1

ARP

同じセグメントの中で、通信相手の IP アドレスから MAC アドレスを調べるのに ARP(Address Resolution Protocol)を使います。ARP にはリクエストとリプライがあります。詳細は次の記事を参考にしてください。

>> 参考記事:初心者向けARP解説:仕組みをCiscoルータでわかりやすく解説

フィルタ表示されるパケット
arpARP 全般(リクエストとリプライ)
arp.opcode == 1ARP リクエスト
arp.opcode == 2ARP リプライ

ICMP

ICMP(Internet Control Message Protocol)は、ネットワークの診断やエラーの通知に使うプロトコルです。ICMP のメッセージはタイプとコードで区別します。詳細は次の記事を参考にしてください。

>> 参考記事:【初心者わかりやすく】ICMPを詳しく解説

フィルタ表示されるパケット
icmpICMP 全般
(icmp.type==8) && (icmp.code==0)Echo Request(ping の要求)
(icmp.type==0) && (icmp.code==0)Echo Reply(ping の応答)
(icmp.type==11) && (icmp.code==0)Time to Live exceeded(転送中に TTL が 0 になった)
(icmp.type==3) && (icmp.code==4)Fragmentation Needed and Don’t Fragment was Set(分割が必要だが DF ビットが立っている)

TCP

TCP は、通信を始める前の3ウェイハンドシェイク、ACK による受信確認、パケットの再送などで、信頼性を確保するプロトコルです。TCP の詳細は次の記事も参考にしてください。

>> 参考記事:【初心者わかりやすく】TCP通信の確立と終了シーケンス
>> 参考記事:【トラブルシューティング】TCP状態遷移の解説
>> 参考記事:【TCP】シーケンス番号とACK番号について解説

TCP通信すべて(tcp)

tcp

ポート番号を用いたフィルタ

フィルタ表示されるパケット
tcp.port == 443送信元か宛先の TCP ポートが 443
tcp.srcport ==443送信元 TCP ポートが 443
tcp.dstport == 443宛先 TCP ポートが 443

TCPの動的ポート範囲

送信元 TCP ポートが動的ポート(エフェメラルポート)の範囲(49152〜65535)のパケットを表示する場合は、大小の比較を組み合わせます。

(tcp.srcport >= 49152) && (tcp.srcport <= 65535)

MSS(Maximum Segment Size)

MSS は、TCP ヘッダを除いたデータ部分の最大サイズです。それぞれの端末が、TCP の接続を確立するとき(SYN、SYN/ACK)に、TCP オプションで自分が受け取れる MSS を相手に伝えます。

フィルタ表示されるパケット
tcp.options.mssMSS オプションが付いているパケット
tcp.options.mss_val >=1460MSS の値が 1460 バイト以上のパケット

フラグを用いたフィルタ

フィルタ表示されるパケット
tcp.flags.syn==1SYN フラグが立っている(SYN、SYN/ACK)
tcp.flags == 0x0002SYN フラグだけが立っている
tcp.flags.syn==0SYN フラグが立っていない
tcp.flags.ack==1ACK フラグが立っている
tcp.flags==0x010ACK フラグだけが立っている
tcp.flags.ack==0ACK フラグが立っていない
tcp.flags.syn==1 && tcp.flags.ack==1SYN と ACK の両方が立っている(SYN/ACK)
tcp.flags.fin == 1FIN フラグが立っている
tcp.flags.reset == 1RST フラグが立っている

tcp.flags はフラグ全体の値です。FIN が 0x001、SYN が 0x002、RST が 0x004、PSH が 0x008、ACK が 0x010 なので、「SYN だけ」「ACK だけ」のように、ほかのフラグが立っていないことまで条件にしたいときに使います。

TCPシーケンス

TCP Analysis

Wireshark は TCP のシーケンス番号と ACK 番号を追跡し、再送や順序の入れ替わりなど、注意が必要なパケットに TCP Analysis のフラグを付けます。フラグが付いたパケットをまとめて表示するには次のように書きます。

tcp.analysis.flags
tcp.analysis.flags の結果(Wireshark)画面イメージ
No.ProtocolWindow sizeInfo
34TCP507[TCP Dup ACK 33#1] 443 → 52079 [ACK] …
35TCP20481[TCP Out-Of-Order] 52079 → 443 [FIN, PSH, ACK] …
37TCP507[TCP Dup ACK 36#1] 443 → 52079 [ACK] …
42TCP02[TCP ZeroWindow] [TCP Keep-Alive] 52079 → 443 [ACK] …
2…TCP20483[TCP Window Update] 52083 → 443 [ACK] …
図5 TCP Analysis のフラグが付いたパケット。Source と Destination の列は省いています(実際の画面ではなく、表示のポイントを示したイメージです)
No.表示意味
1黒地に赤字の行Wireshark の既定の色付けルール「Bad TCP」に当たったパケットです
2[TCP ZeroWindow]受信ウィンドウ 0 を通知しているパケット
3[TCP Window Update]ウィンドウサイズだけが変わったパケット。問題を示すものではないので、色は付いていません

代表的なフラグと、そのフラグだけを表示するフィルタは次のとおりです。

フィルタ表示されるパケット
tcp.analysis.zero_windowTCP ZeroWindow:受信側のバッファがいっぱいで、これ以上受け取れないことを、受信ウィンドウ 0 で知らせるパケット
tcp.analysis.window_updateTCP Window Update:データを含まず、ウィンドウサイズだけを更新するパケット。ZeroWindow から回復して受け取れるようになったことを知らせるときにも送られます
tcp.analysis.duplicate_ackTCP Dup ACK:前と同じ ACK 番号の ACK。受信側が、抜けているセグメントがあることを送信側に知らせています
tcp.analysis.fast_retransmissionTCP Fast Retransmission:重複 ACK を受け取った送信側が、再送タイムアウトを待たずに再送したパケット
tcp.analysis.retransmissionTCP Retransmission:期待した ACK が返ってこず、送信側が再送したパケット

ZeroWindow は、ウィンドウサイズと RST フラグの条件で (tcp.window_size == 0) && (tcp.flags.reset != 1) と書くこともできます(RST のパケットはウィンドウ 0 になることがあるので除いています)。

再送や重複 ACK の仕組みは、【Wireshark】TCP解析(Retransmission/Dup ACK など) で詳しく解説しています。

TCPセグメンテーション

送信側は、MSS より大きなデータを送るとき、MSS 以下の大きさに分割(TCP セグメンテーション)して送ります。Wireshark は、分割されたセグメントを組み立て直して、上位のプロトコル(TLS など)のデータとして表示します。組み立て直したデータを含むパケットを表示するには次のように書きます。

tcp.reassembled.data
組み立て直したセグメント(Wireshark)画面イメージ
No.ProtocolLengthInfo
18214TLSv1…1436Application Data [TCP segment of a reassembled PDU]
  Transmission Control Protocol, Src Port: 443, Dst Port: 49765, Seq: 35565, Ack: 1227, Len: 13701▾ [3 Reassembled TCP Segments (2732 bytes): #18205(32), #18213(1370), #18214(1330)]      [Frame: 18205, payload: 0-31 (32 bytes)]      [Frame: 18213, payload: 32-1401 (1370 bytes)]      [Frame: 18214, payload: 1402-2731 (1330 bytes)]      [Segment count: 3]2      [Reassembled TCP length: 2732]
図6 3つのセグメントを組み立て直した表示。送信元・宛先は省いています(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
13 Reassembled TCP Segmentsフレーム 18205、18213、18214 の3つのセグメントを組み立てています
2Reassembled TCP length: 2732組み立てたデータは 32+1370+1330=2732 バイトです

TCPシーケンス疑義

TCP Analysis のフラグが付いたもののうち、Window Update を除いて、シーケンス上の問題が疑われるパケットだけを表示する場合は次のように書きます。

(tcp.analysis.flags) && !(tcp.analysis.window_update)

UDP

UDP はコネクションレス型のプロトコルで、TCP のような再送による信頼性の確保はしない代わりに、軽く速く通信できます。

フィルタ表示されるパケット
udpUDP 通信すべて
udp.port == 53送信元か宛先の UDP ポートが 53
udp.srcport == 53送信元 UDP ポートが 53
udp.dstport == 53宛先 UDP ポートが 53

DNS

DNS は、ホスト名と IP アドレスを相互に変換(名前解決)するプロトコルです。DNS クライアントが DNS サーバにクエリーを送り、DNS サーバが結果をレスポンスとして返します。

フィルタ表示されるパケット
dnsDNS 通信すべて
dns.flags.response == 0DNS クライアントから DNS サーバへのクエリー
dns.flags.response == 1DNS サーバから DNS クライアントへのレスポンス

トランザクションID

特定の DNS クエリーとレスポンスの組だけを表示したい場合は、Transaction ID で絞り込みます。対象の DNS クエリーの Transaction ID を右クリックし、Apply as Filter ›› Selected をクリックします。

パケットの詳細(Wireshark)画面イメージ
▾ Domain Name System (query)1    Transaction ID: 0x0109  › Flags: 0x0100 Standard query    Questions: 1
右クリックメニューサブメニュー
Apply as Column
2Apply as Filter ›3Selected(Apply as Filter: dns.id == 0x0109)
Prepare as Filter ›Not Selected
4dns.id == 0x0109
DestinationProtocolTransaction IDInfo
8.8.8.8DNS0x0109Standard query 0x0109 A …
(伏せています)DNS0x0109Standard query response 0x0109 …
図7 Transaction ID からフィルタを作る(実際の画面ではなく、操作のポイントを示したイメージです)
No.操作・表示内容
1Transaction ID: 0x0109対象のクエリーの Transaction ID を右クリックします
2Apply as Filter選んだフィールドの値でフィルタを作ります
3Selected選んだ値と一致するパケットを表示します(Not Selected は一致しないものを表示)
4dns.id == 0x0109フィルタが自動で入り、この Transaction ID のクエリーとレスポンスだけが表示されます

DNSレスポンス内の名前

www.yahoo.co.jp についてのレスポンスを表示する場合は次のように書きます。

dns.resp.name == www.yahoo.co.jp

DNSの応答時間

通信が遅いときは、DNS のレスポンスが遅れている可能性があります。任意の DNS レスポンスの詳細にある [Time: …] を右クリックし、Apply as Column で列に追加します。クエリーに対するレスポンスまでの時間(秒)が表示されます。

dns.flags.response == 1 の結果(Wireshark)画面イメージ
ProtocolTime(追加した列)Info
DNS10.030888000Standard query response 0xf3f0 A …
DNS0.040026000Standard query response 0x4782 A …
DNS0.041692000Standard query response 0xfd33 AAAA …
DNS0.023855000Standard query response 0x8486 A …
DNS20.024053000Standard query response 0x0109 A www.yahoo.co.jp CNAME …
図8 DNS の応答時間を列にしたところ(実際の画面ではなく、表示のポイントを示したイメージです)
No.表示意味
1Time 列クエリーを送ってからレスポンスが返るまでの時間(秒)です
20.024053000www.yahoo.co.jp のレスポンスは約 24ms で返っています

この列のフィールドは dns.time なので、dns.time > 0.1 のように書くと、応答に 100ms 以上かかったレスポンスだけを表示できます。

HTTP

HTTP は、Web サーバとブラウザの間で情報をやりとりするプロトコルです。ブラウザが HTTP リクエストを送り、Web サーバがレスポンスを返します。

フィルタ表示されるパケット
httpHTTP 通信すべて
http.requestHTTP リクエスト
http.request.method == GETリクエストのうち GET メソッド
http.responseHTTP レスポンス
http.response.code == 200レスポンスコードが 200 のレスポンス

http.request では、SSDP(Simple Service Discovery Protocol、UDP 1900 番)のリクエストも表示されます。SSDP は HTTP の形式のメッセージを UDP で送るためです。SSDP を除くには次のように書きます。

(http.request) and !(udp.port eq 1900)

接続先ホスト

HTTP のパケットを見るときは、どのホストへ接続しているかが表示されていると便利です。任意のリクエストの詳細で、HTTP ヘッダの Host を右クリックし、Apply as Column で列に追加します。

http.request の結果(Wireshark)画面イメージ
ProtocolLengthHost(追加した列)Info
SSDP2161239.255.255.250:1900M-SEARCH * HTTP/1.1
SSDP216239.255.255.250:1900M-SEARCH * HTTP/1.1
HTTP7062hirotanoblog.comGET / HTTP/1.1
HTTP84www.yahoo.co.jpGET / HTTP/1.1
図9 HTTP の接続先ホストを列にしたところ。Source と Destination の列は省いています(実際の画面ではなく、表示のポイントを示したイメージです)
No.表示意味
1239.255.255.250:1900SSDP のリクエストです。http.request に含まれています
2hirotanoblog.comHTTP リクエストの接続先ホストです

特定のホストだけを表示する場合、たとえば www.yahoo.co.jp だけなら次のように書きます。

http.host == www.yahoo.co.jp

TLS

TLS(Transport Layer Security)は HTTPS などで使われる暗号化のプロトコルです。HTTP のリクエストやレスポンスの中身は暗号化されるので、Wireshark でもそのままでは見えません。

フィルタ表示されるパケット
tlsTLS 通信すべて
tls.handshake.type == 1TLS ハンドシェイクの Client Hello

接続先サーバ

TLS のパケットを見るときも、どのサーバへ接続しているかが表示されていると便利です。任意の Client Hello の詳細で、Server Name Indication 拡張の Server Name を右クリックし、Apply as Column で列に追加します。

tls.handshake.type == 1 の結果(Wireshark)画面イメージ
ProtocolServer Name(追加した列)LengthInfo
TLSv1…1www.yahoo.co.jp583Client Hello
TLSv1…s.yimg.jp664Client Hello
TLSv1…yads.c.yimg.jp583Client Hello
TLSv1…logql.yahoo.co.jp583Client Hello
図10 TLS の接続先サーバ名を列にしたところ。Source と Destination の列は省いています(実際の画面ではなく、表示のポイントを示したイメージです)
No.表示意味
1Server Name 列Client Hello の SNI に入っている接続先のサーバ名です。通信が暗号化されていても、ここは平文で見えます

特定のサーバだけを表示したい場合は次のように書きます。

tls.handshake.extensions_server_name == www.yahoo.co.jp

HTTP と HTTPS が混在する環境で、どのホストやサーバへ接続しているかをまとめて確認するには、HTTP リクエストと Client Hello を OR でつなぎ、SSDP を除きます。

(http.request or tls.handshake.type == 1) and !(udp.port eq 1900)
HTTP と TLS の接続先(Wireshark)画面イメージ
HostServer NameProtocolInfo
read.amazon.co.jpTLSv1.3Client Hello
1www.yahoo.co.jpHTTPGET / HTTP/1.1
s.yimg.jpTLSv1.3Client Hello
2www.yahoo.co.jpTLSv1.3Client Hello
図11 HTTP の Host と TLS の Server Name を並べて表示したところ(実際の画面ではなく、表示のポイントを示したイメージです)
No.表示意味
1Host 列HTTP(平文)の接続先です
2Server Name 列HTTPS(TLS)の接続先です
補足

TLS のフィールド名は、Wireshark 3.0 で ssl. から tls. で始まる名前に変わりました。検証時は (http.request or ssl.handshake.type == 1) and !(udp.port eq 1900) と古い名前で入力し、フィルタのツールバーに警告のアイコンが出ていました。今の版では tls. の名前を使ってください。

まとめ

目的フィルタの例
条件の組み合わせ&&(and)、||(or)、!(not)。除外は !(ip.addr == …)
アドレスeth.addr eth.src[0:3] eth.ig ip.addr ip.src ip.dst(/ でセグメント指定)
プロトコルarp icmp tcp udp dns http tls
TCP の問題tcp.analysis.flags && !tcp.analysis.window_update
応答時間・接続先dns.time、http.host、tls.handshake.extensions_server_name(列に追加すると見やすい)

よく使うフィールドは列に追加しておくと、フィルタの結果を確かめやすくなります。フィールド名がわからないときは、パケットの詳細でそのフィールドを右クリックして Apply as Filter を使うと、フィルタが自動で作られます。

コメント