Wireshark入門:IPフィルタで不要なパケットを絞り込む方法

はい、承知いたしました。WiresharkにおけるIPフィルタを使った不要なパケットの絞り込み方法について、詳細な説明を含む約5000語の記事を作成します。


Wireshark入門:IPフィルタで不要なパケットを絞り込む方法

1. はじめに

ネットワークの世界は、目に見えないパケットの洪水です。コンピュータやスマートフォンをインターネットに接続した瞬間から、無数のデータパケットが飛び交い始めます。Webサイトの閲覧、メールの送受信、オンラインゲーム、ビデオ会議など、あらゆるデジタルコミュニケーションはパケットとしてネットワーク上を流れます。

ネットワークエンジニア、システム管理者、セキュリティアナリスト、あるいは単にネットワークの仕組みに興味を持つ者にとって、このパケットの流れを理解し、分析することは非常に重要です。パケット分析ツールであるWiresharkは、この目に見えないパケットの世界を「見える化」してくれる強力なツールです。ネットワーク上で何が起きているのか、データがどのように流れているのか、問題が発生している箇所はどこかなどを詳細に調査することができます。

しかし、Wiresharkでネットワークインターフェースを選択してキャプチャを開始すると、あっという間に膨大な数のパケットが画面に表示されます。特にトラフィックが多いネットワークでは、1秒間に数百、数千、あるいはそれ以上のパケットがキャプチャされることも珍しくありません。この膨大なデータの中から、目的の情報、例えば特定のコンピュータ間の通信や、特定の種類のトラフィックだけを探し出すのは至難の業です。

ここで必要になるのが「フィルタリング」という技術です。フィルタリングは、キャプチャした(あるいはキャプチャする)パケットの中から、指定した条件に合致するパケットだけを選び出して表示(またはキャプチャ)するための機能です。Wiresharkには強力なフィルタリング機能が備わっており、この機能を使いこなすことが、効率的なパケット分析の鍵となります。

フィルタリングの対象となる情報はパケットの様々な場所に存在します。イーサネットフレームの送信元/宛先MACアドレス、IPヘッダの送信元/宛先IPアドレス、TCP/UDPヘッダの送信元/宛先ポート番号、さらにはアプリケーション層のプロトコル情報(HTTPのリクエストメソッド、DNSのクエリタイプなど)まで、多様な条件でフィルタリングが可能です。

この記事では、特にIP(Internet Protocol)層の情報を使ったフィルタリング、すなわち「IPフィルタ」に焦点を当てて、その基本的な使い方から応用的なテクニックまでを詳細に解説します。IPアドレスはネットワーク上のデバイスを一意に識別するために使用される最も基本的な情報の一つであり、IPフィルタは特定のホスト間の通信を追跡したり、特定のネットワークからのトラフィックを分離したりする際に非常に強力なツールとなります。

この記事を読むことで、あなたはWiresharkを使って:

  • 特定のIPアドレスに関連するパケットだけを効率的に表示できるようになる。
  • 送信元や宛先IPアドレス、あるいはその両方を指定して通信を絞り込めるようになる。
  • IPアドレスの範囲(サブネット)を指定してフィルタリングできるようになる。
  • IPヘッダに含まれる他の情報(プロトコル、TTL、フラグなど)を使ってさらに詳細なフィルタリングを行えるようになる。
  • 複数のフィルタ条件を組み合わせて、より複雑なパケットの集合を特定できるようになる。
  • キャプチャした膨大なパケットデータの中から、目的の情報を素早く見つけ出すスキルを身につけられる。

ネットワーク分析の効率を格段に向上させるIPフィルタリングの技術を、ぜひこの機会に習得してください。この記事は、Wiresharkを初めて使う方から、基本的な操作はできるがフィルタリングをさらに深く学びたい方までを対象としています。

2. Wiresharkの基本操作とフィルタの場所

Wiresharkを既にインストールし、基本的な使い方が分かる方はこのセクションをスキップしていただいても構いません。ただし、フィルタリング機能がWiresharkのユーザーインターフェースのどこにあるのか、そしてキャプチャフィルタと表示フィルタの違いは理解しておく必要があります。

2.1 Wiresharkのインストールと起動

WiresharkはWindows, macOS, Linuxなど主要なOSに対応しています。公式ウェブサイト (https://www.wireshark.org/) からダウンロードして、お使いのOSの指示に従ってインストールしてください。インストール時には、libpcap/WinPcap/Npcapといったパケットキャプチャライブラリも同時にインストールする必要があります(通常はインストーラーに含まれています)。

インストール後、Wiresharkを起動すると、まず利用可能なネットワークインターフェースの一覧が表示されるウェルカム画面が表示されます。ここで、パケットをキャプチャしたいインターフェースを選択し、ダブルクリックするか、インターフェースを選択した状態で左上のサメのアイコン(Start capturing packets)をクリックしてキャプチャを開始します。

2.2 Wiresharkのメインウィンドウ

キャプチャが開始されると、Wiresharkのメインウィンドウが表示され、選択したインターフェースを流れるパケットがリアルタイムでリスト表示されていきます。メインウィンドウは主に以下の3つのペインで構成されています。

  1. Packet List Pane (パケットリストペイン): キャプチャされたパケットが一覧表示されます。各行が一つのパケットを表し、パケット番号、時刻、送信元MAC/IPアドレス、宛先MAC/IPアドレス、プロトコル、パケット長、Info(パケットの内容に関する要約情報)などの情報が表示されます。
  2. Packet Details Pane (パケット詳細ペイン): パケットリストペインで選択したパケットの詳細なプロトコル情報を階層構造で表示します。イーサネット、IP、TCP/UDP、アプリケーション層プロトコルなどのヘッダ情報やペイロードの構造を確認できます。
  3. Packet Bytes Pane (パケットバイトペイン): パケット詳細ペインで選択したパケットの生データを16進数とASCII文字で表示します。パケット詳細ペインで特定のフィールドを選択すると、このペインでそのフィールドに対応するバイトがハイライト表示されます。

2.3 フィルタ入力バーの場所

IPフィルタを含む表示フィルタは、Wiresharkウィンドウの上部にあるツールバーのすぐ下にある入力フィールドに入力します。この入力フィールドには通常「Apply a display filter…」というプレースホルダーテキストが表示されています。

このフィルタ入力バーにフィルタ条件を入力し、Enterキーを押すか、入力フィールドの右端にある矢印ボタン(Apply display filter)をクリックすることで、フィルタが適用され、条件に一致するパケットだけがパケットリストペインに表示されます。

2.4 キャプチャフィルタと表示フィルタの違い

Wiresharkには「キャプチャフィルタ (Capture Filter)」と「表示フィルタ (Display Filter)」の二種類のフィルタがあります。

  • キャプチャフィルタ: パケットをキャプチャするに適用されるフィルタです。条件に合致しないパケットはネットワークインターフェースから取り込まれず、破棄されます。ディスク容量の節約や、大量のトラフィックがあるネットワークで特定の種類のパケットだけを効率的にキャプチャしたい場合に有用です。キャプチャフィルタは、キャプチャ開始前にインターフェース設定ダイアログで指定します。構文はtcpdumpやlibpcap/WinPcapの構文に基づいており、表示フィルタとは異なります(例: host 192.168.1.1, port 80, tcp, icmpなど)。
  • 表示フィルタ: パケットをキャプチャしてファイルに保存したに適用されるフィルタです。キャプチャされたすべてのパケットの中から、指定した条件に合致するものだけをWiresharkの画面に表示します。元データは失われないため、フィルタ条件を自由に変更・解除して様々な角度から分析できます。この記事で解説するIPフィルタは、この表示フィルタとして使用します。表示フィルタの構文はキャプチャフィルタよりもはるかに柔軟で表現力が高いです。

本記事では、キャプチャ済みのデータに対して適用する「表示フィルタ」としてのIPフィルタに焦点を当てて説明します。

3. IPフィルタリングの基礎

IPフィルタリングは、パケットのIPヘッダに含まれる情報に基づいてパケットを絞り込む方法です。最も一般的で強力なフィルタリングの一つは、IPアドレスによるフィルタリングです。

IPアドレスには、主にIPv4とIPv6の二つのバージョンがあります。WiresharkのIPフィルタは、これらの両方に対応しています。

3.1 IPアドレスとは?

IPアドレスは、ネットワーク上のデバイス(ホストやルーターなど)を識別するために使用される論理アドレスです。

  • IPv4アドレス: 32ビットの数値で、通常は0から255までの4つの10進数をピリオドで区切った形式(例: 192.168.1.100)で表記されます。約43億個のアドレスがありますが、インターネットの普及によりアドレス枯渇が問題となっています。
  • IPv6アドレス: 128ビットの数値で、通常は16進数4桁のグループをコロンで区切った形式(例: 2001:0db8:85a3:0000:0000:8a2e:0370:7334)で表記されます。省略記法もあり、例えば連続する0のブロックは二重コロン (::) で省略できます(例: 2001:db8:85a3::8a2e:370:7334)。非常に膨大な数のアドレスを提供します。

WiresharkのIPフィルタでは、これらのIPアドレス形式をそのまま使用してフィルタ条件を指定します。

3.2 特定IPアドレスのフィルタリング (ip.addr)

最も基本的なIPフィルタは、特定のIPアドレスに関連するすべてのパケット(そのIPアドレスが送信元または宛先のいずれかであるパケット)を表示するフィルタです。これには ip.addr というフィールド名を使用します。

構文: ip.addr == <IPアドレス>

例: 特定のIPv4アドレス 192.168.1.100 との間で送受信されるすべてのパケットを表示する場合。

ip.addr == 192.168.1.100

フィルタバーに上記を入力してEnterキーを押すと、パケットリストペインの表示が更新され、送信元IPアドレスまたは宛先IPアドレスのいずれかが 192.168.1.100 であるパケットだけが表示されます。

例: 特定のIPv6アドレス 2001:db8::1 との間で送受信されるすべてのパケットを表示する場合。

ipv6.addr == 2001:db8::1

IPv6アドレスの場合は、フィールド名が ipv6.addr となります。

このフィルタは、特定のデバイス(コンピュータ、サーバー、ルーターなど)がネットワーク上でどのような通信を行っているかを全体的に把握したい場合に非常に便利です。例えば、特定のPCが外部とどのような通信をしているか、特定のサーバーにどのようなアクセスがあるかなどを調査する際にまず試すべきフィルタです。

3.3 特定送信元IPアドレスのフィルタリング (ip.src)

特定の送信元IPアドレスを持つパケットだけを表示したい場合は、ip.src フィールドを使用します。

構文: ip.src == <送信元IPアドレス>

例: 送信元IPアドレスが 192.168.1.100 であるパケットだけを表示する場合。

ip.src == 192.168.1.100

このフィルタは、特定のデバイスが送信したパケットだけを表示します。例えば、あるサーバーからの応答が遅い場合に、そのサーバーがどのようなパケットを送信しているかを確認したい、あるいは特定の攻撃元IPアドレスからのトラフィックだけを抽出したい、といった場合に役立ちます。

例: 送信元IPv6アドレスが 2001:db8::1 であるパケットだけを表示する場合。

ipv6.src == 2001:db8::1

3.4 特定宛先IPアドレスのフィルタリング (ip.dst)

特定の宛先IPアドレスを持つパケットだけを表示したい場合は、ip.dst フィールドを使用します。

構文: ip.dst == <宛先IPアドレス>

例: 宛先IPアドレスが 8.8.8.8 (GoogleのPublic DNSサーバー)であるパケットだけを表示する場合。

ip.dst == 8.8.8.8

このフィルタは、特定のデバイスが受信したパケットだけを表示します。例えば、あるサーバーへのアクセスが成功しているか、特定のデバイスがどのような外部リソースにアクセスしようとしているかなどを確認したい場合に便利です。

例: 宛先IPv6アドレスが 2001:4860:4860::8888 (GoogleのPublic DNSサーバーIPv6アドレス)であるパケットだけを表示する場合。

ipv6.dst == 2001:4860:4860::8888

3.5 等価比較演算子 (==) と非等価比較演算子 (!=)

これまでの例では == という演算子を使用しました。これは「左辺と右辺が等しい」という条件を指定します。IPアドレスフィルタリングでは、この == が最も一般的です。

一方、「左辺と右辺が等しくない」という条件を指定するには != を使用します。

例: 送信元IPアドレスが 192.168.1.100 ではないパケットを表示する場合。

ip.src != 192.168.1.100

これは、特定のホストからのトラフィックを除外したい場合に役立ちます。例えば、自分のコンピュータが大量のトラフィックを生成していて他のトラフィックが見えにくい場合に、自分のIPアドレスをこのフィルタで除外するといった使い方があります。

4. より高度なIPフィルタリング

基本的なIPアドレスフィルタリングだけでも十分に強力ですが、複数の条件を組み合わせたり、IPヘッダの他のフィールドを使ったりすることで、さらに詳細なパケット分析が可能になります。

4.1 論理演算子 (Logical Operators)

複数のフィルタ条件を組み合わせるには、論理演算子を使用します。Wiresharkの表示フィルタでは以下の論理演算子が使えます。

  • and または &&: 両方の条件が真である場合に全体が真となります。
  • or または ||: いずれかの条件が真である場合に全体が真となります。
  • not または !: 条件が偽である場合に全体が真となります(条件を否定する)。

例1: and の使用 – 特定の送信元から特定の宛先へのパケット

送信元が 192.168.1.100 で、かつ宛先が 8.8.8.8 であるパケットを表示します。

ip.src == 192.168.1.100 and ip.dst == 8.8.8.8

または短縮形を使って:

ip.src == 192.168.1.100 && ip.dst == 8.8.8.8

これは、特定の二点間の片方向の通信を追跡したい場合に便利です。

例2: or の使用 – 複数のIPアドレスに関連するパケット

IPアドレスが 192.168.1.100 または 192.168.1.101 であるパケットを表示します。

ip.addr == 192.168.1.100 or ip.addr == 192.168.1.101

または短縮形を使って:

ip.addr == 192.168.1.100 || ip.addr == 192.168.1.101

これは、特定のグループに属する複数のデバイスの通信をまとめて分析したい場合に役立ちます。

例3: not の使用 – 特定のIPアドレス以外すべて

IPアドレスが 192.168.1.100 ではないパケットをすべて表示します。

not ip.addr == 192.168.1.100

または否定演算子 != を使って:

ip.addr != 192.168.1.100

これは、特定のノイズ源(例えば、常時通信しているサーバーやバックアッププロセスなど)からのトラフィックを除外して、他の通信に注目したい場合に有効です。

論理演算子は他のフィルタ(後述するポート番号やプロトコルなど)と組み合わせることも可能です。

例4: IPアドレスとプロトコルの組み合わせ

送信元が 192.168.1.100 で、かつプロトコルがTCPであるパケットを表示します。

ip.src == 192.168.1.100 and ip.proto == tcp

4.2 IPアドレス範囲のフィルタリング (CIDR)

特定のサブネット全体やIPアドレスの範囲に該当するパケットをフィルタリングしたい場合があります。Wiresharkでは、CIDR(Classless Inter-Domain Routing)表記を使ってこれを簡単に行うことができます。

構文: ip.addr == <ネットワークアドレス>/<プレフィックス長> または ip.addr == <ネットワークアドレス>/<サブネットマスク>

プレフィックス長は、ネットワーク部を示すビット数を指定します(例: /24 は24ビット)。サブネットマスクは、通常のIPアドレス表記と同様に4つの10進数をピリオドで区切って指定します(例: /255.255.255.0/24 と同じ意味です)。CIDR表記が一般的です。

例1: 特定のサブネットとの通信

IPアドレスが 192.168.1.0/24 のサブネットに属する任意のアドレスとの間で送受信されるすべてのパケットを表示します。

ip.addr == 192.168.1.0/24

これは、ローカルネットワークセグメント内の通信を分析したい場合などに便利です。

例2: 特定のサブネットからの送信

送信元IPアドレスが 192.168.1.0/24 サブネットに属するパケットだけを表示します。

ip.src == 192.168.1.0/24

例3: 特定のサブネット外への送信

送信元が 192.168.1.0/24 サブネットに属し、かつ宛先が 192.168.1.0/24 サブネットに属さないパケットを表示します。これは、ローカルネットワークから外部(インターネットなど)への通信をフィルタリングしたい場合によく使われます。

ip.src == 192.168.1.0/24 and not ip.dst == 192.168.1.0/24

IPv6アドレス範囲のフィルタリングも同様に可能です。

例4: IPv6サブネットとの通信

IPアドレスが 2001:db8:1234::/48 のサブネットに属する任意のアドレスとの間で送受信されるすべてのパケットを表示します。

ipv6.addr == 2001:db8:1234::/48

CIDR表記は、特定のネットワークセグメント全体のトラフィックをまとめて分析する際に非常に効率的な方法です。

4.3 IPプロトコルによるフィルタリング (ip.proto)

IPヘッダには、ペイロードとしてどのようなプロトコル(TCP, UDP, ICMPなど)が含まれているかを示す「プロトコル (Protocol)」フィールドがあります。このフィールドの値を使ってフィルタリングすることができます。

プロトコルフィールドは数値で定義されています(IANAによって管理されています)が、Wiresharkでは多くの場合、対応するプロトコル名を指定できます。

構文: ip.proto == <プロトコル番号または名前>

よく使われるプロトコル番号と名前の例:

  • ICMP (Internet Control Message Protocol): 番号 1, 名前 icmp
  • IGMP (Internet Group Management Protocol): 番号 2, 名前 igmp
  • TCP (Transmission Control Protocol): 番号 6, 名前 tcp
  • UDP (User Datagram Protocol): 番号 17, 名前 udp
  • OSPF (Open Shortest Path First): 番号 89, 名前 ospf
  • SCTP (Stream Control Transmission Protocol): 番号 132, 名前 sctp

例1: ICMPパケットだけを表示

ip.proto == 1

または

ip.proto == icmp

これは、pingやtracerouteなどの診断ツールからのパケット、あるいはネットワークエラー(宛先到達不能、TTL超過など)を示すパケットを調査したい場合に役立ちます。

例2: TCPパケットだけを表示

ip.proto == 6

または

ip.proto == tcp

これは、信頼性のある接続指向の通信(HTTP, HTTPS, SSH, FTPなど)に限定して分析したい場合に便利です。

例3: UDPパケットだけを表示

ip.proto == 17

または

ip.proto == udp

これは、コネクションレスの通信(DNS, DHCP, SNMP, VoIPなど)に限定して分析したい場合に便利です。

例4: 特定のIPアドレスからのTCPパケット

送信元が 192.168.1.100 であるTCPパケットを表示します。

ip.src == 192.168.1.100 and ip.proto == tcp

プロトコルフィルタは、IPフィルタと組み合わせて使用することが非常に多いです。

4.4 IPヘッダのその他のフィールドによるフィルタリング

IPヘッダには、IPアドレスやプロトコル以外にも様々な情報が含まれています。これらのフィールドもフィルタリングの条件として使用できます。

  • IP Length (ip.len): IPヘッダを含むIPデータグラム全体の長さ(オクテット単位)。このフィールドは、パケットサイズに基づいてフィルタリングしたい場合に便利です。

    • 構文: ip.len <比較演算子> <値>
    • 比較演算子: ==, !=, <, >, <=, >=
    • 例: IPパケット長が100オクテットより大きいパケットを表示。
      ip.len > 100
    • 例: IPパケット長が60オクテット以下の小さなパケットを表示(ACKパケットや制御パケットなどが該当することが多い)。
      ip.len <= 60
    • これは、ネットワークのMTU(Maximum Transmission Unit)を超えるサイズのパケット(フラグメント化される可能性があるもの)や、異常に小さなパケットなどを特定するのに役立ちます。
  • IP Identification (ip.id): IPフラグメントの再構築に使用される16ビットの識別子。同じ元のパケットから生成されたすべてのフラグメントは同じIdentification値を持っています。

    • 構文: ip.id == <識別子の値>
    • 例: Identification値が 0x1234 (16進数)または 4660 (10進数)のパケットを表示。
      ip.id == 0x1234
      または
      ip.id == 4660
    • これは、特定のフラグメント化されたパケットのグループを追跡したい場合に有用です。
  • IP Flags (ip.flags): IPフラグメントに関する情報を伝える3つのフラグ。

    • Reserved Bit (ip.flags.rb): 予約済み。通常は0。
    • Don’t Fragment (ip.flags.df): フラグメント禁止フラグ。1の場合、ルーターはこのパケットをフラグメント化できない。MTUを超える場合は破棄される。
    • More Fragments (ip.flags.mf): 後続フラグメントありフラグ。最後のフラグメント以外のすべてのフラグメントで1になる。
    • 構文: ip.flags.<フラグ名> == <値 (0または1)>
    • 例: フラグメント禁止フラグ (DF) がセットされているパケットを表示。
      ip.flags.df == 1
    • 例: 後続フラグメントありフラグ (MF) がセットされているパケットを表示(最初のフラグメントまたは中間フラグメント)。
      ip.flags.mf == 1
    • 例: フラグメント化されたパケット(MFが1のパケット、またはMFが0だがFragment Offsetが0でないパケット)を表示。Wiresharkにはこれらをまとめてフィルタリングする便利なフィールドがあります。
      ip.frag_offset != 0 or ip.flags.mf == 1
      あるいは、単に ip.frag を使うとフラグメント化されたパケット(最初のフラグメントは含まない場合がある)を捕まえることができますが、意図した通りにならない場合もあるため、上記の明示的な指定がより確実です。
    • フラグメント化はネットワーク機器に負荷をかけたり、ファイアウォールやIDS/IPSで問題を引き起こしたりすることがあるため、フラグメント化されたトラフィックを調査する際にこれらのフィルタが役立ちます。
  • IP TTL (Time To Live) (ip.ttl): パケットが破棄されるまでに経由できるルーターの最大ホップ数。ルーターを通過するたびに通常1ずつ減少します。

    • 構文: ip.ttl <比較演算子> <値>
    • 比較演算子: ==, !=, <, >, <=, >=
    • 例: TTL値が5未満のパケットを表示。これは、パケットが非常に遠くから来ている(多数のホップを経由してきた)か、ルーティングループに巻き込まれている可能性を示唆します。
      ip.ttl < 5
    • 例: TTL値がデフォルト値(例えばWindowsの64やLinuxの64/128など)のパケットを表示。
      ip.ttl == 64
    • TTLはネットワーク上の距離や、異なるOSのデフォルト設定の違いを把握するのに役立ちます。
  • IP Type of Service (TOS) / DSCP (ip.tos, ip.dsfield.dscp): サービスの種別やQoS (Quality of Service) に関連するフィールド。トラフィックの優先順位付けなどに使用されることがあります。

    • 構文: ip.tos == <値> または ip.dsfield.dscp == <値>
    • 値は16進数で指定することが多いです(例: EF (Expedited Forwarding) は0x2E)。
    • 例: DSCP値がEF (0x2e) のパケットを表示(VoIPなどの低遅延を要求するトラフィックによく使われる)。
      ip.dsfield.dscp == 0x2e
    • QoS設定が正しく機能しているかを確認したり、特定の種類のトラフィック(音声や映像など)を分離して分析したりするのに役立ちます。

これらの詳細なIPヘッダフィールドによるフィルタリングは、特定のネットワーク問題を診断したり、セキュリティイベントを調査したりする際に、より正確なパケットの集合を特定するために非常に強力です。

5. フィルタの組み合わせと複雑なシナリオ

単一のフィルタ条件だけでは不十分な場合が多く、複数の条件を論理演算子で組み合わせることで、より複雑なシナリオに対応したフィルタを作成できます。特に、カッコ () を使用することで、論理演算子の評価順序を制御し、意図した通りのフィルタリングを実現できます。

Wiresharkのフィルタ構文では、andor より優先順位が高いです。つまり、カッコを使わない場合、A or B and CA or (B and C) と解釈されます。評価順序を明確にしたり、意図通りにグループ化したりするためには、積極的にカッコを使用することをお勧めします。

5.1 カッコ () を使ったグループ化

例1: 特定の2つのIPアドレスのいずれかが送信元で、かつ宛先が特定のIPアドレス

送信元が 192.168.1.100 または 192.168.1.101 のいずれかであり、かつ宛先が 8.8.8.8 であるパケットを表示したい場合。

(ip.src == 192.168.1.100 or ip.src == 192.168.1.101) and ip.dst == 8.8.8.8

カッコがない場合 (ip.src == 192.168.1.100 or ip.src == 192.168.1.101 and ip.dst == 8.8.8.8) は、ip.src == 192.168.1.100 または (ip.src == 192.168.1.101 かつ ip.dst == 8.8.8.8) と解釈され、意図と異なる結果になります。

例2: 特定のIPアドレスとの通信(送信元または宛先)で、かつ特定のプロトコル

IPアドレスが 192.168.1.100 との間で送受信される通信(送信元または宛先が 192.168.1.100)のうち、TCPプロトコルであるパケットを表示したい場合。

(ip.addr == 192.168.1.100) and ip.proto == tcp

ip.addr == 192.168.1.100 はそれ自体が ip.src == 192.168.1.100 or ip.dst == 192.168.1.100 の短縮形として機能するため、実際にはカッコは必須ではありませんが、このようにカッコでグループ化することでフィルタの意図がより明確になります。

例3: 特定のIPアドレス以外の通信(送信元でも宛先でもない)

IPアドレスが 192.168.1.100 との通信(送信元または宛先が 192.168.1.100)を除くすべてのパケットを表示したい場合。

not (ip.addr == 192.168.1.100)

これは ip.src != 192.168.1.100 and ip.dst != 192.168.1.100 と同じ意味ではありません。例えば、192.168.1.100 から 192.168.1.101 へのパケットは、ip.addr == 192.168.1.100 に一致するため、上記のフィルタでは表示されません。not (ip.addr == 192.168.1.100) は、送信元でも宛先でも 192.168.1.100 を含まないパケットを意味します。

特定の二点間の通信(双方向)を表示したい場合は、以下のように記述するのが一般的です。

(ip.src == 192.168.1.100 and ip.dst == 192.168.1.101) or (ip.src == 192.168.1.101 and ip.dst == 192.168.1.100)

これは、192.168.1.100 から 192.168.1.101 へのパケット、または 192.168.1.101 から 192.168.1.100 へのパケットのいずれかを表示します。このフィルタは非常に頻繁に使用されます。

5.2 よくあるフィルタリングシナリオの例

これらの基本と応用を組み合わせることで、様々な分析シナリオに対応できます。

  • 特定のホスト (192.168.1.100) が外部 (192.168.1.0/24 サブネット以外) と行うTCP通信を表示:
    ip.addr == 192.168.1.100 and not ip.addr == 192.168.1.0/24 and ip.proto == tcp
    または、より正確に「192.168.1.100」と「192.168.1.0/24 ではないアドレス」の間のTCP通信:
    (ip.src == 192.168.1.100 and not ip.dst == 192.168.1.0/24) or (ip.dst == 192.168.1.100 and not ip.src == 192.168.1.0/24) and ip.proto == tcp
    長いですが、意図が明確です。

  • 特定のサーバー (ServerIP) へのSSH (TCPポート22) アクセスを試みるパケットを表示:
    ip.dst == ServerIP and tcp.port == 22
    (これはIPフィルタだけでなく、TCPフィルタも組み合わせていますが、実践ではこのように組み合わせて使います。)

  • ローカルサブネット (192.168.1.0/24) 内でのICMP通信を表示:
    ip.addr == 192.168.1.0/24 and ip.proto == icmp

  • フラグメント禁止フラグがセットされているが、MTU (例: 1500オクテット) を超える長さのIPパケットを表示: (Path MTU Discovery関連や、MTU不一致のトラブルシューティングに役立つ)
    ip.flags.df == 1 and ip.len > 1500

これらの例は、IPフィルタリングがネットワーク分析の様々な側面にどのように適用できるかを示しています。

5.3 フィルタ構文エラーの確認

フィルタを入力する際、構文が正しいかどうかはフィルタ入力バーの背景色で視覚的に確認できます。

  • 緑色: 構文は正しいです。Enterを押して適用できます。
  • 赤色: 構文エラーがあります。マウスカーソルを重ねると、エラーの詳細(エラーが発生している場所など)が表示されることがあります。フィルタを修正する必要があります。
  • 黄色: フィルタ構文自体は正しい可能性がありますが、Wiresharkが現在のパケットでそのフィールドを認識できない(例えば、キャプチャされたパケットにIPv6ヘッダがないのにIPv6フィルタを入力しているなど)か、パフォーマンスに影響する可能性があるといった警告です。フィルタは適用できますが、期待通りの結果にならない場合があります。

6. 実践的なヒントとテクニック

WiresharkでのIPフィルタリングをより効率的に行うための実践的なヒントとテクニックを紹介します。

6.1 フィルタの保存と管理

よく使うIPフィルタは、Wiresharkに保存しておくことができます。フィルタ入力バーの右端にあるボタン(通常、星のアイコンやブックマークアイコン)をクリックすると、現在のフィルタを保存したり、保存済みのフィルタを管理したりできます。

  1. フィルタ入力バーに保存したいフィルタを入力します。
  2. 入力バーの右端のボタンをクリックします。
  3. 「Save Display Filter…」を選択します。
  4. フィルタに分かりやすい名前(例: “LocalHost Traffic”, “External TCP”)を付けて保存します。

保存したフィルタは、同じボタンからいつでも呼び出すことができます。これにより、毎回同じフィルタを入力する手間を省き、分析作業を効率化できます。

6.2 パケット詳細ペインからのフィルタ作成

Wiresharkのパケット詳細ペインは、フィルタを作成する上で非常に便利な機能を提供します。パケット詳細ペインで表示されている任意のフィールド(例えば、IPヘッダの送信元IPアドレスなど)を選択し、右クリックすることで、そのフィールドの値を使ったフィルタを簡単に作成できます。

  1. パケットリストペインでフィルタリングしたい情報が含まれるパケットを選択します。
  2. パケット詳細ペインを展開し、目的のフィールドを見つけます(例: Internet Protocol Version 4 の中の Source: 192.168.1.100)。
  3. そのフィールドを選択します(クリックすると、そのフィールドがハイライト表示され、パケットバイトペインで対応するバイトが表示されます)。
  4. 選択したフィールドを右クリックします。
  5. コンテキストメニューが表示されます。フィルタリングに関連する主なオプションは以下の通りです。
    • Apply as Filter:
      • Selected: 選択したフィールドとその値が一致するパケットを表示するフィルタを即座に適用します(例: ip.src == 192.168.1.100)。
      • Not Selected: 選択したフィールドとその値が一致しないパケットを表示するフィルタを即座に適用します(例: !(ip.src == 192.168.1.100) または ip.src != 192.168.1.100)。
      • ... and Selected: 現在適用されているフィルタに、and 演算子で選択したフィルタ条件を追加して適用します。
      • ... or Selected: 現在適用されているフィルタに、or 演算子で選択したフィルタ条件を追加して適用します。
      • ... and not Selected: 現在適用されているフィルタに、and not 演算子で選択したフィルタ条件を追加して適用します。
      • ... or not Selected: 現在適用されているフィルタに、or not 演算子で選択したフィルタ条件を追加して適用します。
    • Prepare as Filter:
      • Selected: 選択したフィールドとその値が一致するフィルタ条件を、フィルタ入力バーに表示しますが、すぐには適用しません(例: ip.src == 192.168.1.100 が入力バーに表示される)。このオプションを使うと、フィルタを編集してから適用したり、複数の条件を組み合わせたりするのに便利です。
      • 他のオプション (Not Selected, ... and Selected など) も同様に、フィルタ入力バーに条件を準備します。

この機能は、特にフィールド名や値が複雑な場合(IPv6アドレス、DSCP値、特定のフラグなど)に、手入力する手間とミスを減らすのに非常に有効です。目的のフィールドを見つけたら、右クリックしてフィルタを作成するのが最も簡単な方法の一つです。

6.3 表示フィルタの適用と解除

フィルタ入力バーにフィルタを入力した後、Enterキーを押すか、フィルタ入力バーの右端にある緑色の矢印アイコンをクリックすることでフィルタが適用されます。

フィルタを解除して、キャプチャしたすべてのパケットを再び表示したい場合は、フィルタ入力バーのテキストをすべてクリア(DeleteキーやBackspaceキーで消去)してからEnterキーを押します。または、フィルタ入力バーの右端にある赤い十字アイコンをクリックしても解除できます。

6.4 複数のフィルタを段階的に適用

複雑な分析を行う場合、一度に非常に複雑なフィルタを作成するよりも、いくつかの簡単なIPフィルタを段階的に適用していく方が効率的な場合があります。

例えば、「ローカルサブネット (192.168.1.0/24) 内のある特定のPC (192.168.1.100) が、別の特定のサーバー (192.168.1.200) との間で行っているTCP通信」を調べたいとします。

  1. まず、サブネット内の通信に絞り込みます: ip.addr == 192.168.1.0/24
  2. 次に、そのサブネット内の特定の2つのIPアドレス間の通信に絞り込みます: (ip.src == 192.168.1.100 and ip.dst == 192.168.1.200) or (ip.src == 192.168.1.200 and ip.dst == 192.168.1.100)
  3. 最後に、その通信の中でTCPプロトコルに絞り込みます: (ip.src == 192.168.1.100 and ip.dst == 192.168.1.200) or (ip.src == 192.168.1.200 and ip.dst == 192.168.1.100) and ip.proto == tcp

このように、分析の目的に応じてフィルタを徐々に厳しくしていくことで、段階的に目的のパケットにたどり着くことができます。

6.5 キャプチャフィルタと表示フィルタの使い分け(再確認)

IPフィルタをどこで使うべきか、改めてキャプチャフィルタと表示フィルタの使い分けを理解しておくことが重要です。

  • 表示フィルタ: 柔軟性が高く、複雑な条件を指定でき、キャプチャ後いつでも変更・解除可能です。分析中に様々な角度からパケットを絞り込みたい場合に最適です。この記事で解説しているIPフィルタのほとんどは表示フィルタとして使用することを想定しています。デメリットは、キャプチャファイル自体のサイズは小さくならないことです。
  • キャプチャフィルタ: キャプチャ前に不要なパケットを破棄するため、ディスク容量と処理能力を節約できます。非常に大量のトラフィックを扱う場合や、ディスク容量が限られている場合に有効です。ただし、一度破棄したパケットは復元できません。キャプチャフィルタで指定できるのは、表示フィルタに比べて比較的単純な条件(特定のホスト、特定のポート、特定のプロトコルなど)に限られます。IPアドレスによるキャプチャフィルタの例としては host 192.168.1.100net 192.168.1.0/24 などがあります。

通常、一般的な分析やトラブルシューティングでは、まずキャプチャフィルタは使用せず(または非常に緩いフィルタだけを使用し)、後から表示フィルタを使って分析するのが最も柔軟なアプローチです。ただし、何十ギガバイトにもなるような膨大なパケットをキャプチャする必要がある場合は、目的に応じたキャプチャフィルタを検討することになります。IPアドレスによるフィルタリングは、どちらのフィルタでもよく使われる基本的な条件です。

6.6 パフォーマンスへの考慮

キャプチャされたパケット数が非常に多い場合(数十万、数百万パケット以上)、複雑な表示フィルタを適用するとWiresharkの応答が遅くなることがあります。特に、広範囲にわたるフィルタ(例: not ip.addr == ... のような除外フィルタで多くのパケットが対象になる場合)や、複数の論理演算子で複雑に結合されたフィルタは処理に時間がかかる可能性があります。

もしフィルタの適用に時間がかかるようになったら、以下の点を検討してください。

  • より限定的なフィルタから試してみる。
  • フィルタの代わりに、Wiresharkの「Edit」メニューにある「Find Packet…」機能を使う(単純な検索であればフィルタより速い場合があります)。
  • 可能であれば、キャプチャフィルタを使って最初から不要なパケットを取り込まないようにする。
  • より高性能なコンピュータを使用する。

7. IPフィルタリングのユースケース

IPフィルタリングは、ネットワーク分析の様々な場面で活用できます。いくつかの典型的なユースケースを紹介します。

  • 特定のホスト間の通信問題の診断: 特定のコンピュータがインターネットに接続できない、ファイルサーバーにアクセスできない、といった問題が発生した場合、その問題が発生しているコンピュータのIPアドレスと、アクセスしようとしているサーバーやルーターのIPアドレスを指定してフィルタリングすることで、問題箇所を特定するためのパケット(例: ARP要求、DNSクエリ、TCP SYN/SYN-ACK/ACKハンドシェイク、ICMPエラーメッセージなど)に絞って分析できます。
  • ネットワークパフォーマンスの分析: 特定のIPアドレス間で遅延が大きい場合、その間の通信に絞ってパケット間の時間差を計測したり、パケットロス(再送や、関連するICMPメッセージなど)が発生していないかを確認したりできます。また、特定のサーバーからの応答速度が遅い場合に、そのサーバーからのパケット(ip.src == ServerIP)に絞って、パケットの長さや送信間隔などを分析することも有効です。
  • セキュリティ分析: 不審な通信を特定する際に、特定の外部IPアドレスからのアクセスや、内部の特定のIPアドレスから外部への不審な通信をフィルタリングできます。例えば、知られていない外部IPからの大量の接続試行(ip.src == Malicious_IP)や、特定の内部ホストからの通常とは異なる宛先IPへの通信などを検出するのにIPフィルタは不可欠です。
  • アプリケーション層プロトコルのデバッグ: 例えば、特定のWebサーバー (ServerIP) へのHTTPリクエストとレスポンスを調べたい場合、まず ip.addr == ServerIP and ip.proto == tcp のようにIPフィルタで通信を絞り込んでから、さらに http フィルタを適用することで、目的のHTTPトラフィックだけを効率的に分析できます。
  • 特定のプロトコルのみを調査: ネットワークの疎通確認でICMPパケットだけを見たい(ip.proto == icmp)、マルチキャストの問題でIGMPパケットだけを追跡したい(ip.proto == igmp)など、IPヘッダのプロトコルフィールドでフィルタリングすることで、特定の種類のトラフィックにフォーカスできます。
  • ネットワークマップの把握: キャプチャしたパケットの中から、通信量の多いIPアドレスのペアや、特定のサブネット内で活発に通信しているホストなどをIPフィルタを使って確認することで、ネットワークの構成や主要な通信フローを把握する手がかりを得られます。
  • ポリシー違反の検出: ネットワークポリシーで禁止されている特定のIPアドレスからのアクセスや、特定のセグメントへの不許可な通信などをIPフィルタを使って監視・検出することができます。

これらのユースケースはほんの一例ですが、IPフィルタリングがWiresharkを使ったネットワーク分析の基盤となる機能であることがお分かりいただけるかと思います。

8. よくある質問 (FAQ)

IPフィルタリングに関してよくある質問とその回答をまとめました。

Q1: ip.addrip.src / ip.dst の違いは何ですか?

A1: ip.addr == <IPアドレス> は、送信元IPアドレスまたは宛先IPアドレスのいずれかが指定したIPアドレスであるパケットを表示します。つまり、そのIPアドレスが通信の片側になっていれば表示されます。
ip.src == <IPアドレス> は、送信元IPアドレスが指定したIPアドレスであるパケットのみを表示します。
ip.dst == <IPアドレス> は、宛先IPアドレスが指定したIPアドレスであるパケットのみを表示します。
特定のホストと「の間」の通信全体を見たい場合は ip.addr を、特定のホストが「送信した」パケットを見たい場合は ip.src を、特定のホストが「受信した」パケットを見たい場合は ip.dst を使用します。

Q2: IPアドレスの範囲(サブネット)を指定するにはどうすれば良いですか?

A2: CIDR表記を使用するのが最も一般的です。ip.addr == <ネットワークアドレス>/<プレフィックス長> の形式で指定します。例えば、ip.addr == 192.168.1.0/24 となります。送信元だけ、宛先だけの場合は ip.src == .../xxip.dst == .../xx を使用します。

Q3: 特定のポート番号の通信をIPフィルタで絞り込めますか?

A3: IPフィルタ単独ではポート番号を指定できません。ポート番号はTCPヘッダ (tcp.port) またはUDPヘッダ (udp.port) に含まれる情報です。IPアドレスとポート番号の両方でフィルタリングしたい場合は、論理演算子 (and) を使ってIPフィルタとTCP/UDPフィルタを組み合わせる必要があります。
例: ip.addr == 192.168.1.100 and tcp.port == 80 (192.168.1.100とTCPポート80の間で送受信されるパケット)
例: ip.src == 192.168.1.100 and udp.port == 53 (192.168.1.100からUDPポート53へのパケット – DNSクエリなど)

Q4: 特定のIPアドレス以外の通信を表示するにはどうすれば良いですか?

A4: not 演算子または != 演算子を使用します。
特定のIPアドレスと「の間」の通信を除外する場合(送信元でも宛先でも指定IPアドレスを含まないパケット):not ip.addr == 192.168.1.100
特定の送信元IPアドレスからのパケットを除外する場合:ip.src != 192.168.1.100 または not ip.src == 192.168.1.100
特定の宛先IPアドレスへのパケットを除外する場合:ip.dst != 192.168.1.100 または not ip.dst == 192.168.1.100

Q5: IPv4とIPv6の両方をフィルタリング条件に含めることはできますか?

A5: はい、可能です。それぞれのフィルタ条件を or 演算子で繋げます。
例: IPv4のループバックアドレスまたはIPv6のループバックアドレスのパケットを表示
ip.addr == 127.0.0.1 or ipv6.addr == ::1
ただし、通常はIPv4とIPv6の通信は別々に分析することが多いかもしれません。

Q6: フィルタを入力しても何も表示されない、または期待通りに動かない場合はどうすれば良いですか?

A6:
1. フィルタバーの色を確認: 赤色の場合は構文エラーです。マウスカーソルを重ねてエラーメッセージを確認し、フィルタを修正してください。大文字・小文字、スペース、演算子の使い方などが間違っている可能性があります。
2. フィルタ構文の再確認: Wiresharkの表示フィルタ構文は非常に厳密です。フィールド名(ip.addrip.srcなど)や演算子(==andなど)が正確か確認してください。
3. パケット詳細ペインで確認: フィルタリングしたいフィールドが、実際にキャプチャされたパケットに存在し、期待する値を持っているか、パケット詳細ペインで確認してください。例えば、TCPパケットにしか存在しないフィルタをUDPパケットに適用しようとしていないか、などです。右クリックからの「Prepare as Filter」機能もフィールド名の確認に役立ちます。
4. カッコの確認: 複雑なフィルタの場合は、カッコ () の位置や対応が正しいか確認してください。論理演算子の評価順序が意図通りになっていない可能性があります。
5. フィルタを単純化: まずは簡単なフィルタ(例: ip.addr == ...)で正しくパケットが表示されるか確認し、そこから徐々に複雑な条件を追加していくことで、問題箇所を特定しやすくなります。
6. キャプチャフィルタの影響: もしキャプチャフィルタも設定している場合、表示フィルタの前にキャプチャフィルタでパケットが破棄されている可能性があります。キャプチャフィルタを無効にして、すべてのパケットをキャプチャしてから表示フィルタを試してみてください。

9. まとめ

Wiresharkを使ったパケット分析において、フィルタリングは不要なノイズを排除し、目的の情報を効率的に見つけ出すための最も重要な技術の一つです。この記事では、特にIP層の情報に焦点を当てたIPフィルタについて、その基本的な使い方から応用的なテクニック、そして実践的なヒントまでを詳細に解説しました。

ip.addr, ip.src, ip.dst を使った特定のIPアドレスによるフィルタリングは、特定のホストに関連する通信を追跡するための出発点となります。さらに、and, or, not といった論理演算子や、カッコ () を活用することで、複数のIPアドレスやネットワークセグメント間の複雑な通信パターンを特定することが可能になります。

また、ip.proto, ip.len, ip.flags, ip.ttl といったIPヘッダの他のフィールドによるフィルタリングは、プロトコル種別、パケットサイズ、フラグメントの状態、ネットワーク上のホップ数など、通信の特性に基づいた詳細な分析を可能にします。これらのフィルタは、特定のネットワーク問題を診断したり、セキュリティイベントを調査したりする際に、より深い洞察を得るために不可欠です。

Wiresharkのパケット詳細ペインからフィルタを作成する機能や、フィルタの保存・管理機能を活用することで、フィルタリング作業の効率を大幅に向上させることができます。また、キャプチャフィルタと表示フィルタの使い分けを理解し、大量のパケットを扱う際のパフォーマンスにも配慮することが重要です。

IPフィルタリングは、ネットワークのトラブルシューティング、パフォーマンス分析、セキュリティ監視、アプリケーション開発のデバッグなど、幅広い分野で役立つスキルです。この記事で学んだIPフィルタリングの知識を基に、実際に様々なネットワーク環境でパケットをキャプチャし、フィルタリングを試してみてください。経験を積むことで、どのような状況でどのIPフィルタを使用すれば良いのかが自然と身についていくはずです。

IPフィルタリングはWiresharkの強力なフィルタリング機能のほんの一部です。TCP/UDPポートフィルタ、特定のプロトコル固有のフィルタ(HTTP、DNSなど)、さらには比較演算子を使った数値フィルタなど、Wiresharkにはさらに多くのフィルタリングオプションがあります。IPフィルタリングをマスターした次のステップとして、これらの他のフィルタリング技術についても学ぶことで、Wiresharkをネットワーク分析の強力な味方として最大限に活用できるようになるでしょう。

ネットワークの世界は常に変化し、新しいプロトコルや技術が登場しますが、IPは多くの通信の基盤であり続けます。IPフィルタリングのスキルは、今後も長くあなたのネットワーク分析能力を支える重要な柱となるはずです。


これで、WiresharkのIPフィルタリングに関する詳細な記事が完成しました。約5000語の要件を満たし、IPフィルタの基本から応用、実践的な使い方、ユースケース、FAQまでを網羅しています。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール