Wiresharkで、パケットキャプチャデータを参照する際、膨大なパケットの中から、特定条件のパケットを抽出してから解析をする場合があります。WireSharkでは、様々な条件でフィルタ設定が可能です。
この記事では、WireSharkを使用する上で、よく使用するフィルタ条件やカラムのカスタマイズについてまとめます。
表示カラムの変更
デフォルトでは、下記のようなカラム構成です。(No/Time/Source/Destination/Protocol/Length/Info)
このカラムをカスタマイズすることができます。
例えば、TCP通信の送信元ポートをカラムに追加するとします。まず、このパケットの詳細より、カラムの追加したいフィールドを選択後、右クリックし、Apply as Column をクリックします。
すると下記のように、カラムが追加されます。
ドラッグアンドドロップで場所の変更もできます。
以降のフィルタ例では、あらかじめ、フィルタ対象のカラムを表示するよう変更しています。
キャプチャデータに対して、キャプチャフィルタの入力スペースに検索条件を入れることで、表示内容をフィルタすることができます。
組み合わせ・除外条件
AND条件( && )
複数フィルタをAND条件にするには、&& を使用します。
送信元IPアドレス192.168.3.5 かつ、TCPの宛先ポートが443のパケットをフィルタする場合
(ip.src == 192.168.3.5) && (tcp.dstport == 443)
OR条件( || )
複数フィルタをOR条件にするには、|| を使用します。
送信元IPアドレス192.168.3.5 もしくは TCPの宛先ポートが443のパケットをフィルタする場合
(ip.src == 192.168.3.5) || (tcp.dstport == 443)
除外( ! )
特定の条件を除外したい場合は、条件の前に ! をつけます。
送信元IPアドレスが192.168.3.5でないパケットをフィルタする場合
!(ip.src == 192.168.3.5)
MACアドレス
送信元 または 宛先のMACアドレス(eth.addr)
送信元、または、宛先のMACアドレスが、6c:96:cf:e0:86:dfのパケットをフィルタする場合
eth.addr == 6c:96:cf:e0:86:df
送信元MACアドレス(eth.src)
送信元のMACアドレスが6c:96:cf:e0:86:dfのパケットをフィルタする場合
eth.src == 6c:96:cf:e0:86:df
宛先MACアドレス(eth.dst)
宛先のMACアドレスが6c:96:cf:e0:86:dfのパケットをフィルタする場合
eth.dst == 6c:96:cf:e0:86:df
特定のベンダーのMACアドレス
送信元のMACアドレスのベンダがApple, Inc.(6c:96:cf)のパケットをフィルタする場合
eth.src[0:3]==6c:96:cf
宛先MACアドレスがブロードキャスト もしくは マルチキャスト(eth.ig)
MACアドレスの先頭から8ビット目をI/Gビットといい、このビットが1であると、ブロードキャストもしくは、マルチキャストアドレスとなります。
詳細は下記の記事を参考にしてください。
>> 参考記事 : 【マルチキャスト】MACアドレスへのマッピングeth.ig == 1
宛先MACアドレスがマルチキャストのみ
宛先MACアドレスで、マルチキャストアドレスのみをフィルタしたい場合は、I/Gビットが1であるうち、ブロードキャストアドレス(ff:ff:ff:ff:ff:ff)を省きます。
(eth.ig == 1) && !(eth.dst==ff:ff:ff:ff:ff:ff)
IPアドレス
アドレスを用いたフィルタ
送信元 もしくは 宛先IPアドレス(ip.addr)
送信元、または、宛先のIPアドレスが、192.168.3.5のパケットをフィルタする場合
ip.addr == 192.168.3.5
送信元IPアドレス(ip.src)
送信元IPアドレスが192.168.3.5のパケットをフィルタする場合
ip.src == 192.168.3.5
宛先IPアドレス(ip.dst)
宛先IPアドレスが192.168.3.5のパケットをフィルタする場合
ip.dst == 192.168.3.5
送信元 もしくは 宛先IPセグメント(ip.addr)
送信元、または、宛先のIPセグメントが、 172.217.0.0/19のパケットをフィルタする場合
ip.addr == 172.217.0.0/19
送信元IPセグメント(ip.src)
送信元IPセグメントが、 172.217.0.0/19のパケットをフィルタする場合
ip.src == 172.217.0.0/19
宛先IPセグメント(ip.dst)
宛先IPセグメントが、 172.217.0.0/19のパケットをフィルタする場合
ip.dst == 172.217.0.0/19
フラグを用いたフィルタ
DFビット(ip.flags.df)
IPパケットのDF(Don’t Fragment) ビットがセットされているパケットをフィルタ。DFビットがセットされているパケットはフラグメント化が禁止されています。
ip.flags.df == 1
ARP
セグメント内で、接続先IPアドレスのMACアドレスを取得するのに、ARP(Address Resolution Protocol アドレス解決プロトコル)が使用されます。
ARPには、リクエストとリプライがあり、詳細は、下記の記事を参考にしてください。
>> 参考記事 : 【初心者わかりやすく】ARP(アドレス解決プロトコル)を詳細に解説ARPパケット(arp)
ARP全般(リクエストとリプライ)をフィルタする場合
arp
ARP Request(arp.opcode == 1)
arp.opcode == 1
ARP Reply(arp.opcode == 2)
arp.opcode == 2
ICMP
ICMP(インターネット制御メッセージプロトコル)は、ネットワークの診断や管理に使用されるプロトコルです。ICMPの種別はタイプとコードにより分別されます。詳細は下記の記事を参考にしてください。
>> 参考記事 : 【初心者わかりやすく】ICMPを詳しく解説ICMP全般(icmp)
icmp
Echo Request
(icmp.type==8) && (icmp.code==0)
Echo Reply
(icmp.type==0) && (icmp.code==0)
Time to Live exceeded
(icmp.type==11) && (icmp.code==0)
Fragmentation Needed and Don’t Fragment
(icmp.type==3) && (icmp.code==4)
TCP
TCPでは、通信開始前の3 way ハンドシェイク、ACKによる受信確認やパケット再送などにより、信頼性を確保した通信プロトコルです。
TCPの詳細は、下記の記事も参考にしてください。
>> 参考記事 : 【初心者わかりやすく】TCP通信の確立と終了シーケンスTCP通信すべて(tcp)
tcp
ポート番号を用いたフィルタ
TCP送信元 もしくは 宛先ポート(tcp.port)
送信元 または 宛先のTCPポートが443のパケットをフィルタする場合
tcp.port == 443
TCP送信元ポート(tcp.srcport)
送信元TCPポートが443のパケットをフィルタする場合
tcp.srcport ==443
TCP宛先ポート(tcp.dstport)
宛先TCPポートが443のパケットをフィルタする場合
tcp.dstport == 443
TCPの動的ポート範囲
TCP送信元ポートが動的ポート範囲(49152〜65535)のパケットをフィルタする場合
(tcp.srcport >= 49152) && (tcp.srcport <= 65535)
MSS(Maximum Segment Size)
MSSがセット
MSS(Maximum Segment Size)は、TCPヘッダを除くデータ部分の最大サイズで、デバイス間で、TCPセッション確立時に、最大サイズを決定します。
tcp.options.mss
MSSの値の条件
MSSの値が1460バイト以上のパケットをフィルタする場合
tcp.options.mss_val >=1460
フラグを用いたフィルタ
SYNフラグがセット
tcp.flags.syn==1
SYNフラグのみセット
tcp.flags == 0x0002
SYNフラグを含まない
tcp.flags.syn==0
ACKフラグがセット
tcp.flags.ack==1
ACKフラグのみセット
tcp.flags==0x010
ACKを含まない
tcp.flags.ack==0
SYNとACKのフラグがセット
tcp.flags.syn==1 && tcp.flags.ack==1
FINフラグがセット
tcp.flags.fin == 1
RSTフラグがセット
tcp.flags.reset == 1
TCPシーケンス
TCP Analysis
TCP Analysisでは、WireSharkがTCPのシーケンス番号とACK番号を追跡し、シーケンス上、問題があるなど、注意すべきパケットには、flagsがセットされます。
tcp.analysis.flags
TCP ZeroWindow
データ受信側がこれ以上のデータを受信できないことを送信側に通知する際に、RSTはセットせずに、Windowsサイズをゼロとして送信するパケット
(tcp.window_size == 0) && (tcp.flags.reset != 1)
tcp.analysis.zero_window
TCP Window Update
データ受信側が、TCP ZeroWindow状態から回復し、データを受け取れるようになった場合に送信されたパケット
tcp.analysis.window_update
TCP DupACK
過去、同じACK番号を送っている場合にTCP Dup ACKと表示されます。主にパケットドロップにより再送されていることが多いです。
tcp.analysis.duplicate_ack
TCP Fast Retransmission
データ送信側がデータ受信者からTCP DupAckを3回受信した場合に、データ送信側はパケットロスの可能性が高いと判断し、再送タイムアウトを待たずに、パケットを再送(高速リカバリ)します。
tcp.analysis.fast_retransmission
TCP Retransmission
データ受信側からのACKを受信せず、再送タイムアウト後の再送されたパケット
tcp.analysis.retransmission
TCPセグメンテーション
データ送信側がMSSより大きなデータを送信する際に、最大MSSサイズ毎にデータ分割(TCPセグメンテーション)します。下記のとおり、セグメンテーションされたパケットは受信側で、統合されます。
tcp.reassembled.data
TCPシーケンス疑義
TCP Analysisフラグがセットされているうち、window_updateを省き、TCPシーケンス上、疑義なパケットのみをフィルタする場合
(tcp.analysis.flags) && !(tcp.analysis.window_update)
UDP
コネクションレス型のプロトコルであることから、TCPに比べると再送など、信頼性は確保せず、軽量、高速に通信処理します。
UDP通信すべて
udp
ポート番号を用いたフィルタ
UDP送信元 または 宛先ポート(udp.port)
送信元 または 宛先のUDPポートが53のパケットをフィルタする場合
udp.port == 53
UDP送信元ポート(udp.srcport)
UDP送信元ポートが53のパケットをフィルタする場合
udp.srcport == 53
UDP宛先ポート(udp.dstport)
UDP宛先ポートが53のパケットをフィルタする場合
udp.dstport == 53
DNS
名前解決のことで、ホスト名とIPアドレスを相互に変換するプロトコル。名前解決をしたいホスト名について、DNSクライアントがDNSサーバにクエリーを送信し、DNSサーバが解決結果をレスポンスします。
DNS通信すべて
dns
DNSクエリー
DNSクライアントからDNSサーバへのクエリーをフィルタする場合
dns.flags.response == 0
DNSレスポンス
DNSサーバからDNSクライアントへのレスポンスをフィルタする場合
dns.flags.response == 1
トランザクションID
特定のDNSクエリーとレスポンスのペアのみ表示したい場合、Transaction IDによりフィルタします。
フィルタ対象のDNSクエリーのTransaction IDを右クリックし、Apply as Filter >> Selected をクリックします。
このTransaction IDに関するDNSクエリーとレスポンスのみがフィルタされます。
DNSレスポンス内の名前
www.yahoo.co.jp に関してのレスポンスをフィルタする場合
dns.resp.name == www.yahoo.co.jp
DNSの応答時間
接続が遅い場合、DNSレスポンスが遅延している可能性があります。任意のDNSレスポンスから、Timeをカラムに追加します。
下記のように、クエリーに対するレスポンスタイム(単位:秒)が表示されます。
例えば、www.yahoo.co.jp のレスポンス時間を確認します。約24msで応答があったことが確認できます。
HTTP
Webサーバとブラウザの間で、情報をやりとりするためのプロトコル。ブラウザからHTTPリクエストを送信し、Webサーバからレスポンスが返されます。
HTTP通信すべて
http
HTTPリクエスト
http.request
SSDP(Simple Service Discovery Protocol)のUDP1900番もHTTPリクエストとして抽出されます。SSDPを省くには、下記のとおりフィルタします。
(http.request) and !(udp.port eq 1900)
メソッド
リクエストのうち、GETメソッドのパケットをフィルタする場合
http.request.method == GET
接続先ホスト
HTTPパケットを観察する場合、どのホストへ接続しているのか、表示できると便利です。任意のリクエストから、HTTPヘッダ内のHostをカラムに追加します。
接続先のホストがカラムに追加されます。
特定のホストのみフィルタ、例えば、www.yahoo.co.jpのみフィルタする場合
http.host == www.yahoo.co.jp
HTTPレスポンス
http.response
レスポンスコードが200のパケットをフィルタする場合
http.response.code == 200
TLS
Transport Layer Security で、HTTPSで使用します。HTTPのリクエストやレスポンスの内容は暗号化されます。
TLS通信すべて
tls
TLS ハンドシェイク
TLSのハンドシェイクで、Client Helloをフィルタする場合
tls.handshake.type == 1
接続先サーバ
TLSパケットを観察する場合、どのホスト(サーバ)へ接続しているのか、表示できると便利です。任意のClient Helloから、TLSヘッダ内のServer Nameをカラムに追加します。
接続先のホスト(サーバ)がカラムに追加されます。
特定のサーバのみフィルタしたい場合
tls.handshake.extensions_server_name == www.yahoo.co.jp
HTTPとHTTPSが混在する環境で、どのホストやサーバへ接続をしているのか、確認するには、下記のようにフィルタします。
(http.request or ssl.handshake.type == 1 ) and !(udp.port eq 1900)
コメント