【Wireshark】キャプチャ取得するパケットをフィルタする

音声で聞く

読む前にこの記事のポイントを音声で確認できます。この音声は本記事をもとにAIツール(NotebookLM)で自動生成したもので、発音や言い回しが不自然な箇所や、内容の誤りが含まれる可能性があります。理解の補助としてご利用ください。

Wireshark では、キャプチャを始める前にキャプチャオプションで、キャプチャするパケットを絞り込んだり、長時間取得に備えてファイルを分割したりできます。この記事では、キャプチャオプションのうち、キャプチャするパケットを絞り込む「キャプチャフィルタ」を確認します。

この記事でわかること
  1. キャプチャオプションの入力タブで、インタフェースとキャプチャフィルタを指定する
  2. キャプチャフィルタ(BPF 構文)の書き方:修飾子・ID文字列・演算子
  3. アドレス・ポート・プロトコルで絞り込むフィルタの例
  4. ヘッダのフィールド(TTL、ICMP タイプ、TCP フラグ)で絞り込むフィルタの例

キャプチャオプション(入力)

キャプチャオプションは、メニューの キャプチャ ›› オプション(Ctrl+K)で開きます。画面は「入力」「出力」「オプション」の3つのタブに分かれていて、キャプチャフィルタは入力タブで設定します。

画面イメージについて

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

Wireshark・キャプチャオプション画面イメージ
入力 出力 オプション
インターフェーストラフィックリンク層ヘッダプロミスキャスキャプチャ長
1Intel(R) Wi-Fi 6 AX201 160MHz: Wi-Fi2___∧__Ethernet3☑デフォルト
☑ すべてのインターフェースにおいてプロミスキャスモードを有効化しますインターフェース管理…
4選択したインタフェースのキャプチャフィルタキャプチャフィルタ … を入力 BPF形式をコンパイル
開始閉じるヘルプ
図1 キャプチャオプションの入力タブ(実際の画面ではなく、設定項目のポイントを示したイメージです)
No.項目内容
1インターフェースキャプチャするインタフェースを選びます
2トラフィックそのインタフェースに通信があるかどうかが、小さなグラフで表示されます
3プロミスキャスチェックすると、プロミスキャス(無差別)モードになり、自分宛てのパケットだけでなく、インタフェースに届いたほかの宛先のパケットもキャプチャします
4キャプチャフィルタキャプチャするパケットの条件を書きます

キャプチャフィルタ

キャプチャフィルタを使うと、条件に合うパケットだけをキャプチャできます。通信量が多い環境で、取りたいパケットがはっきりしているときに有効です。条件に合わないパケットは保存されないので、あとから表示フィルタで探すこともできなくなります。

インタフェースを選んでから、「選択したインタフェースのキャプチャフィルタ」にフィルタを書くと適用されます。構文が正しければ入力欄の背景が緑に、誤りがあれば赤になります。

キャプチャフィルタの入力欄画面イメージ
1正しい構文tcp
2誤りのある構文http
図2 入力欄の背景で構文の正誤がわかる(実際の画面ではなく、表示のポイントを示したイメージです)
No.表示意味
1緑:tcpキャプチャフィルタとして正しい構文です
2赤:httpキャプチャフィルタでは使えない書き方です。http は表示フィルタの書き方で、キャプチャフィルタでは tcp port 80 のようにポート番号で指定します

よく使うフィルタはあらかじめ登録されていて、値を変えて使えます。入力欄の左にある緑のマークをクリックすると、登録されているフィルタの一覧が表示されます。

キャプチャフィルタのメニュー画面イメージ
このフィルタを保存
このフィルタを削除
1キャプチャフィルタ管理
2Ethernet address 00:00:5e:00:53:00: ether host 00:00:5e:00:53:00
Ethernet type 0x0806 (ARP): ether proto 0x0806
No Broadcast and no Multicast: not broadcast and not multicast
No ARP: not arp
IPv4 only: ip
IPv4 address 192.0.2.1: host 192.0.2.1
IPv6 only: ip6
IPv6 address 2001:db8::1: host 2001:db8::1
TCP only: tcp
UDP only: udp
Non-DNS: not port 53
TCP or UDP port 80 (HTTP): port 80
HTTP TCP port (80): tcp port http
No ARP and no DNS: not arp and port not 53
Non-HTTP and non-SMTP to/from www.wireshark.org: not port 80 and not port 25 and host www.wireshark.org
図3 登録済みのキャプチャフィルタ(実際の画面ではなく、表示のポイントを示したイメージです)
No.表示意味
1キャプチャフィルタ管理フィルタの追加や削除をする画面を開きます
2フィルタ名: フィルタ式選ぶと、コロンのあとのフィルタ式が入力欄に入ります

「キャプチャフィルタ管理」をクリックすると次の画面が開き、「+」でフィルタを追加、「-」で削除できます。

Wireshark・キャプチャフィルタ画面イメージ
フィルタ名フィルタ式
Ethernet address 00:00:5e:00:53:00ether host 00:00:5e:00:53:00
Ethernet type 0x0806 (ARP)ether proto 0x0806
No Broadcast and no Multicastnot broadcast and not multicast
No ARPnot arp
IPv4 onlyip
IPv4 address 192.0.2.1host 192.0.2.1
IPv6 onlyip6
IPv6 address 2001:db8::1host 2001:db8::1
TCP onlytcp
UDP onlyudp
Non-DNSnot port 53
1+2-OKキャンセルヘルプ
図4 キャプチャフィルタの管理画面(実際の画面ではなく、設定項目のポイントを示したイメージです)
No.ボタン内容
1+フィルタを追加します。フィルタ名とフィルタ式を入力します
2-選んだフィルタを削除します

キャプチャフィルタの書き方(BPF 構文)

キャプチャフィルタは、BPF(Berkeley Packet Filter)構文で書きます。tcpdump と同じ libpcap のフィルタ言語で、Wireshark の表示フィルタとは書き方が違います。

BPF 構文の基本単位は「プリミティブ」で、修飾子と ID 文字列(アドレスやポート番号などの値)の組み合わせでできています。複数のプリミティブを演算子でつなぐと、複数の条件を組み合わせられます。

プリミティブ = 修飾子 + ID文字列修飾子type / dir / protoID文字列アドレス・番号など演算子&& / || / !例:宛先が 192.168.1.1 で、TCP ポート 443 の通信プリミティブプリミティブdstdirhosttype192.168.1.1ID文字列&&演算子tcpprotoporttype443ID文字列
図5 プリミティブと演算子

修飾子には次の3種類があり、組み合わせて使えます。

修飾子意味主な値省略したとき
typeID 文字列が何を表すかhost net port portrangehost とみなされます
dir方向src dst送信元か宛先のどちらか(src or dst)とみなされます
protoプロトコルether ip ip6 arp tcp udp などtype に合うすべてのプロトコルが対象になります

演算子には、論理積(and または &&)、論理和(or または ||)、否定(not または !)があります。たとえば、宛先ホストが 192.168.1.1 で、かつ TCP ポート 443 の通信だけをキャプチャしたい場合は、次のように書きます。

dst host 192.168.1.1 && tcp port 443
演算子の優先順位

否定がいちばん優先され、論理積と論理和は同じ優先順位で左から順に評価されます。and と or を混ぜるときは、host 192.168.1.1 and (port 80 or port 443) のように括弧で区切ると、意図どおりの条件になります。

以降、フィルタの例を確認します。例の IP アドレスと MAC アドレスは、説明用の値にしています。

アドレス・ホストによるフィルタ

特定の IP アドレスの通信だけをキャプチャ

host 192.168.1.10

特定の送信元 IP アドレスの通信だけをキャプチャ

src host 192.168.1.10

type を省略して src 192.168.1.10 と書いても同じ意味です。

特定の宛先 IP アドレスの通信だけをキャプチャ

dst host 192.168.1.10

こちらも dst 192.168.1.10 と書けます。

特定の MAC アドレスの通信だけをキャプチャ

ether host 00-00-5e-00-53-01

MAC アドレスは 00:00:5e:00:53:01 のようにコロン区切りでも書けます。

フィルタ検証でキャプチャされた通信
host アドレスSource か Destination のどちらかが、指定したアドレスのパケット
src host アドレスSource がすべて指定したアドレスのパケット
dst host アドレスDestination がすべて指定したアドレスのパケット
ether host MACEthernet ヘッダの送信元か宛先が、指定した MAC アドレスのパケット

ポートによるフィルタ

特定のポート番号の通信だけをキャプチャ

port 443

port は送信元と宛先のどちらかが指定したポート番号のパケットにマッチし、TCP と UDP の両方が対象になります。検証でも、TCP 443 のほかに UDP 443 の通信がキャプチャされました。

port 443 の結果(Wireshark)画面イメージ
No.ProtocolLengthInfo
11UDP7550992 → 443 Len=33
2UDP68443 → 50992 Len=26
3UDP7550992 → 443 Len=33
42TCP5453659 → 443 [FIN, AC…
5UDP7550992 → 443 Len=33
図6 port 443 でキャプチャした結果。Source と Destination の列は省いています(実際の画面ではなく、表示のポイントを示したイメージです)
No.表示意味
1UDP 50992 → 443UDP のポート 443 の通信もキャプチャされています
2TCP 53659 → 443TCP のポート 443 の通信です

TCP だけに絞りたいときは tcp port 443、UDP だけなら udp port 443 と proto 修飾子を付けます。

特定の宛先ポート番号の通信だけをキャプチャ

dst port 443

特定の送信元ポート番号の通信だけをキャプチャ

src port 443

特定のポート番号を除く通信だけをキャプチャ

!port 443

否定の場合は、ポート番号を持たないパケットもキャプチャされます。検証では、DNS や TCP のほかに、ARP や SSDP もキャプチャされました。

フィルタ検証でキャプチャされた通信
port 443送信元か宛先のポートが 443 の TCP と UDP
dst port 443宛先ポートが 443 のパケット(Info が … → 443)
src port 443送信元ポートが 443 のパケット(Info が 443 → …)
!port 443ポート 443 以外の DNS、TCP、SSDP と、ポートを持たない ARP

プロトコルによるフィルタ

ICMP の通信だけをキャプチャ

icmp
icmp の結果(Wireshark)画面イメージ
No.SourceDestinationProtocolInfo
1(伏せています)8.8.8.8ICMPEcho (ping) request
28.8.8.8(伏せています)ICMPEcho (ping) reply
3(伏せています)8.8.8.8ICMPEcho (ping) request
48.8.8.8(伏せています)ICMPEcho (ping) reply
図7 icmp でキャプチャした結果(実際の画面ではなく、表示のポイントを示したイメージです)

TCP の通信だけをキャプチャ

tcp

UDP の通信だけをキャプチャ

udp

TCP 以外の通信だけをキャプチャ

!tcp

検証では、tcp で TCP(TLS を含む)、udp で UDP、!tcp で UDP、ICMP、DNS、mDNS(IPv6 を含む)がキャプチャされました。

プロトコルフィールドによるフィルタ

プロトコルのヘッダをバイト単位で区切り、そのフィールドの値を条件にできます。プロトコル名のあとの [ ] にオフセットを書き、条件となる値と比べます。オフセットはヘッダの先頭からの位置で、先頭の1バイト目を 0 と数えます。[ ] にオフセットだけを書いた場合は、その位置の1バイトの値になります。

ここでは IP、ICMP、TCP のヘッダを例にします。図の各マスの左上の数字がオフセットです。

IP ヘッダ(TTL を参照)

IPv4 ヘッダ(オフセットはバイト単位)0〜7 ビット8〜15 ビット16〜23 ビット24〜31 ビット+0+4+8+12+160Ver/ヘッダ長1ToS23全長45識別子67フラグ/フラグメントオフセット8TTL9プロトコル1011ヘッダチェックサム12131415送信元 IP アドレス16171819宛先 IP アドレスオプションがある場合は、オフセット 20 以降に続きます
図8 IPv4 ヘッダのオフセット

TTL が 60 より小さい通信だけをキャプチャする場合は、オフセット 8 の値が 60 未満であることを条件にします。

ip[8] < 60
ip[8] < 60 の結果(Wireshark)画面イメージ
No.ProtocolTime to LiveInfo
1TLSv1…157Application Data
2TCP57443 → 52196 [PSH, …
3TLSv1…57Application Data
4UDP59443 → 60403 Len=25…
5DNS58Standard query res…
6TCP57443 → 52196 [ACK]
図9 ip[8] < 60 でキャプチャした結果。列に TTL を追加しています(実際の画面ではなく、表示のポイントを示したイメージです)
No.表示意味
1Time to Live 57、58、59キャプチャされたパケットの TTL がすべて 60 未満です

ICMP ヘッダ(タイプを参照)

ICMP ヘッダ(オフセットはバイト単位)0〜7 ビット8〜15 ビット16〜23 ビット24〜31 ビット+00タイプ1コード23チェックサム
図10 ICMP ヘッダのオフセット

ping のうち、エコー要求(タイプ 8)だけをキャプチャする場合は、オフセット 0 の値が 8 であることを条件にします。

icmp[0] == 8
icmp[0] == 8 の結果(Wireshark)画面イメージ
No.SourceDestinationProtocolInfo
1(伏せています)8.8.8.8ICMP1Echo (ping) request
2(伏せています)8.8.8.8ICMPEcho (ping) request
3(伏せています)8.8.8.8ICMPEcho (ping) request
4(伏せています)8.8.8.8ICMPEcho (ping) request
図11 icmp[0] == 8 でキャプチャした結果(実際の画面ではなく、表示のポイントを示したイメージです)
No.表示意味
1Echo (ping) requestエコー要求だけがキャプチャされ、エコー応答(reply)は入っていません

エコー要求(タイプ 8)とエコー応答(タイプ 0)の両方をキャプチャする場合は、オフセット 0 の値が 8 か 0 であることを条件にします。検証では、図7と同じように request と reply が交互にキャプチャされました。

icmp[0] == 8 || icmp[0] == 0

ICMP のタイプについては、次の記事も参考にしてください。

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

TCP ヘッダ(フラグを参照)

TCP ヘッダ(オフセットはバイト単位)0〜7 ビット8〜15 ビット16〜23 ビット24〜31 ビット+0+4+8+12+1601送信元ポート23宛先ポート4567シーケンス番号891011確認応答番号12データオフセット等13フラグ1415ウィンドウサイズ1617チェックサム1819緊急ポインタオプションがある場合は、オフセット 20 以降に続きます
図12 TCP ヘッダのオフセット

SYN や RST などの TCP フラグは、オフセット 13 の1バイトに入っています。各ビットが1つのフラグに対応していて、ビットの重みは FIN が 1、SYN が 2、RST が 4、PSH が 8、ACK が 16 です。

たとえば RST が立っている通信だけをキャプチャするとします。RST だけのパケットもあれば RST と ACK が両方立ったパケットもあるので、tcp[13] == 4 では RST/ACK を取りこぼします。そこで、RST のビットだけを1にした値(00000100:4)と論理積を取ります。

tcp[13](フラグのバイト)の見方CWR128ECE64URG32ACK16PSH8RST4SYN2FIN1RST/ACK の例00010100& 400000100結果00000100結果が 0 以外(=4)なら、ほかのフラグに関係なく RST が立っているCWR128ECE64URG32ACK16PSH8RST4SYN2FIN1SYN/ACK0001001016(ACK)+ 2(SYN)= 18。tcp[13] == 18 は、SYN と ACK だけが立っているパケット
図13 フラグのバイトと論理積

RST/ACK のパケットと 4 の論理積は 4(00000100)になり、RST が立っていなければ 0(00000000)になります。つまり、tcp[13] & 4 が 0 以外なら RST が立っています。

tcp[13] & 4 != 0

tcp[13] & 4 == 4 と書いても同じ結果になります。

tcp[13] & 4 != 0 の結果(Wireshark)画面イメージ
No.ProtocolLengthInfo
1TCP541443 → 53458 [RST] Seq=1 Win=0 Len=0
2TCP54253496 → 443 [RST, ACK] Seq=1 Ack=1 …
3TCP5453502 → 443 [RST, ACK] Seq=1 Ack=1 …
4TCP5453503 → 443 [RST, ACK] Seq=1 Ack=1 …
図14 RST が立ったパケットをキャプチャした結果。Source と Destination の列は省いています(実際の画面ではなく、表示のポイントを示したイメージです)
No.表示意味
1[RST]RST だけが立ったパケット
2[RST, ACK]RST と ACK が立ったパケット。論理積を使ったので、こちらもキャプチャされています

SYN と ACK だけが立っているパケット(SYN/ACK)をキャプチャする場合は、16(ACK)+2(SYN)=18 なので、tcp[13] が 18 であることを条件にします。

tcp[13] == 18
補足
  • オフセットの数字の代わりに名前も使えます。tcp[tcpflags] & tcp-rst != 0、icmp[icmptype] == icmp-echo は、それぞれ上の tcp[13] & 4 != 0、icmp[0] == 8 と同じ意味です。
  • tcp[ ] や icmp[ ] のようにヘッダの値を参照するフィルタは、IPv6 のパケットにはマッチしません。IPv6 の通信を対象にするときは注意してください。

まとめ

フィルタキャプチャする通信
host / src host / dst host指定した IP アドレスの通信(送信元・宛先を限定できる)
ether host指定した MAC アドレスの通信
port / src port / dst port指定したポート番号の通信(TCP と UDP の両方)
tcp port / udp portTCP だけ、UDP だけのポート番号の通信
icmp / tcp / udpそのプロトコルの通信
!条件条件に合わない通信(ARP など、ほかのプロトコルも含む)
ip[8] < 60TTL が 60 未満の IPv4 の通信
icmp[0] == 8ICMP エコー要求
tcp[13] & 4 != 0RST が立っている TCP の通信
tcp[13] == 18SYN と ACK だけが立っている TCP の通信

キャプチャフィルタで落としたパケットは、あとから見ることができません。条件に迷うときは少し広めにキャプチャし、表示フィルタで絞り込むと安全です。

コメント