読む前にこの記事のポイントを音声で確認できます。この音声は本記事をもとにAIツール(NotebookLM)で自動生成したもので、発音や言い回しが不自然な箇所や、内容の誤りが含まれる可能性があります。理解の補助としてご利用ください。
Wireshark では、キャプチャを始める前にキャプチャオプションで、キャプチャするパケットを絞り込んだり、長時間取得に備えてファイルを分割したりできます。この記事では、キャプチャオプションのうち、キャプチャするパケットを絞り込む「キャプチャフィルタ」を確認します。
- キャプチャオプションの入力タブで、インタフェースとキャプチャフィルタを指定する
- キャプチャフィルタ(BPF 構文)の書き方:修飾子・ID文字列・演算子
- アドレス・ポート・プロトコルで絞り込むフィルタの例
- ヘッダのフィールド(TTL、ICMP タイプ、TCP フラグ)で絞り込むフィルタの例
キャプチャオプション(入力)
キャプチャオプションは、メニューの キャプチャ ›› オプション(Ctrl+K)で開きます。画面は「入力」「出力」「オプション」の3つのタブに分かれていて、キャプチャフィルタは入力タブで設定します。
この記事の画面は、実際の画面ではなく、検証時の画面から設定する項目(見るポイント)を抜き出して描いたイメージです。バージョンによって、項目の並びや表記は変わります。
| インターフェース | トラフィック | リンク層ヘッダ | プロミスキャス | キャプチャ長 |
|---|---|---|---|---|
| 1Intel(R) Wi-Fi 6 AX201 160MHz: Wi-Fi | 2___∧__ | Ethernet | 3☑ | デフォルト |
| ☑ すべてのインターフェースにおいてプロミスキャスモードを有効化します | インターフェース管理… |
| 4選択したインタフェースのキャプチャフィルタ | キャプチャフィルタ … を入力 BPF形式をコンパイル |
| No. | 項目 | 内容 |
|---|---|---|
| 1 | インターフェース | キャプチャするインタフェースを選びます |
| 2 | トラフィック | そのインタフェースに通信があるかどうかが、小さなグラフで表示されます |
| 3 | プロミスキャス | チェックすると、プロミスキャス(無差別)モードになり、自分宛てのパケットだけでなく、インタフェースに届いたほかの宛先のパケットもキャプチャします |
| 4 | キャプチャフィルタ | キャプチャするパケットの条件を書きます |
キャプチャフィルタ
キャプチャフィルタを使うと、条件に合うパケットだけをキャプチャできます。通信量が多い環境で、取りたいパケットがはっきりしているときに有効です。条件に合わないパケットは保存されないので、あとから表示フィルタで探すこともできなくなります。
インタフェースを選んでから、「選択したインタフェースのキャプチャフィルタ」にフィルタを書くと適用されます。構文が正しければ入力欄の背景が緑に、誤りがあれば赤になります。
| 1正しい構文 | tcp |
| 2誤りのある構文 | http |
| 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 |
| No. | 表示 | 意味 |
|---|---|---|
| 1 | キャプチャフィルタ管理 | フィルタの追加や削除をする画面を開きます |
| 2 | フィルタ名: フィルタ式 | 選ぶと、コロンのあとのフィルタ式が入力欄に入ります |
「キャプチャフィルタ管理」をクリックすると次の画面が開き、「+」でフィルタを追加、「-」で削除できます。
| フィルタ名 | フィルタ式 |
|---|---|
| Ethernet 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 |
| No. | ボタン | 内容 |
|---|---|---|
| 1 | + | フィルタを追加します。フィルタ名とフィルタ式を入力します |
| 2 | - | 選んだフィルタを削除します |
キャプチャフィルタの書き方(BPF 構文)
キャプチャフィルタは、BPF(Berkeley Packet Filter)構文で書きます。tcpdump と同じ libpcap のフィルタ言語で、Wireshark の表示フィルタとは書き方が違います。
BPF 構文の基本単位は「プリミティブ」で、修飾子と ID 文字列(アドレスやポート番号などの値)の組み合わせでできています。複数のプリミティブを演算子でつなぐと、複数の条件を組み合わせられます。
修飾子には次の3種類があり、組み合わせて使えます。
| 修飾子 | 意味 | 主な値 | 省略したとき |
|---|---|---|---|
| type | ID 文字列が何を表すか | host net port portrange | host とみなされます |
| 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 MAC | Ethernet ヘッダの送信元か宛先が、指定した MAC アドレスのパケット |
ポートによるフィルタ
特定のポート番号の通信だけをキャプチャ
port 443
port は送信元と宛先のどちらかが指定したポート番号のパケットにマッチし、TCP と UDP の両方が対象になります。検証でも、TCP 443 のほかに UDP 443 の通信がキャプチャされました。
| No. | Protocol | Length | Info |
|---|---|---|---|
| 1 | 1UDP | 75 | 50992 → 443 Len=33 |
| 2 | UDP | 68 | 443 → 50992 Len=26 |
| 3 | UDP | 75 | 50992 → 443 Len=33 |
| 4 | 2TCP | 54 | 53659 → 443 [FIN, AC… |
| 5 | UDP | 75 | 50992 → 443 Len=33 |
| No. | 表示 | 意味 |
|---|---|---|
| 1 | UDP 50992 → 443 | UDP のポート 443 の通信もキャプチャされています |
| 2 | TCP 53659 → 443 | TCP のポート 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
| No. | Source | Destination | Protocol | Info |
|---|---|---|---|---|
| 1 | (伏せています) | 8.8.8.8 | ICMP | Echo (ping) request |
| 2 | 8.8.8.8 | (伏せています) | ICMP | Echo (ping) reply |
| 3 | (伏せています) | 8.8.8.8 | ICMP | Echo (ping) request |
| 4 | 8.8.8.8 | (伏せています) | ICMP | Echo (ping) reply |
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 を参照)
TTL が 60 より小さい通信だけをキャプチャする場合は、オフセット 8 の値が 60 未満であることを条件にします。
ip[8] < 60
| No. | Protocol | Time to Live | Info |
|---|---|---|---|
| 1 | TLSv1… | 157 | Application Data |
| 2 | TCP | 57 | 443 → 52196 [PSH, … |
| 3 | TLSv1… | 57 | Application Data |
| 4 | UDP | 59 | 443 → 60403 Len=25… |
| 5 | DNS | 58 | Standard query res… |
| 6 | TCP | 57 | 443 → 52196 [ACK] |
| No. | 表示 | 意味 |
|---|---|---|
| 1 | Time to Live 57、58、59 | キャプチャされたパケットの TTL がすべて 60 未満です |
ICMP ヘッダ(タイプを参照)
ping のうち、エコー要求(タイプ 8)だけをキャプチャする場合は、オフセット 0 の値が 8 であることを条件にします。
icmp[0] == 8
| No. | Source | Destination | Protocol | Info |
|---|---|---|---|---|
| 1 | (伏せています) | 8.8.8.8 | ICMP | 1Echo (ping) request |
| 2 | (伏せています) | 8.8.8.8 | ICMP | Echo (ping) request |
| 3 | (伏せています) | 8.8.8.8 | ICMP | Echo (ping) request |
| 4 | (伏せています) | 8.8.8.8 | ICMP | Echo (ping) request |
| No. | 表示 | 意味 |
|---|---|---|
| 1 | Echo (ping) request | エコー要求だけがキャプチャされ、エコー応答(reply)は入っていません |
エコー要求(タイプ 8)とエコー応答(タイプ 0)の両方をキャプチャする場合は、オフセット 0 の値が 8 か 0 であることを条件にします。検証では、図7と同じように request と reply が交互にキャプチャされました。
icmp[0] == 8 || icmp[0] == 0
ICMP のタイプについては、次の記事も参考にしてください。
>> 参考記事:【初心者わかりやすく】ICMPを詳しく解説
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)と論理積を取ります。
RST/ACK のパケットと 4 の論理積は 4(00000100)になり、RST が立っていなければ 0(00000000)になります。つまり、tcp[13] & 4 が 0 以外なら RST が立っています。
tcp[13] & 4 != 0
tcp[13] & 4 == 4 と書いても同じ結果になります。
| No. | Protocol | Length | Info |
|---|---|---|---|
| 1 | TCP | 54 | 1443 → 53458 [RST] Seq=1 Win=0 Len=0 |
| 2 | TCP | 54 | 253496 → 443 [RST, ACK] Seq=1 Ack=1 … |
| 3 | TCP | 54 | 53502 → 443 [RST, ACK] Seq=1 Ack=1 … |
| 4 | TCP | 54 | 53503 → 443 [RST, ACK] Seq=1 Ack=1 … |
| 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 port | TCP だけ、UDP だけのポート番号の通信 |
| icmp / tcp / udp | そのプロトコルの通信 |
| !条件 | 条件に合わない通信(ARP など、ほかのプロトコルも含む) |
| ip[8] < 60 | TTL が 60 未満の IPv4 の通信 |
| icmp[0] == 8 | ICMP エコー要求 |
| tcp[13] & 4 != 0 | RST が立っている TCP の通信 |
| tcp[13] == 18 | SYN と ACK だけが立っている TCP の通信 |
キャプチャフィルタで落としたパケットは、あとから見ることができません。条件に迷うときは少し広めにキャプチャし、表示フィルタで絞り込むと安全です。
コメント