このページの目次

tcpdump と Wireshark

ネットワークトラブルシューティングの最前線ツール——tcpdump は BPF フィルタを使用してカーネル空間でフィルタリングを行い(一致しないパケットはユーザー空間にコピーされず、grep よりも桁違いに高速)、Wireshark はプロトコルフィールドレベルの可視化分析を提供します。TLS 復号の鍵は SSLKEYLOGFILE です。

概要

ネットワークトラブルシューティングにおいて最も重要なツールはパケットキャプチャです。tcpdump はサーバー側で BPF フィルタを使用してトラフィックをフィルタリングし、Wireshark は可視化分析を提供します。BPF フィルタはカーネルレベルのフィルタプログラムにコンパイルされ、パケットがユーザー空間にコピーされる前に一致しないトラフィックを破棄します。これは grep を使用してフィルタリングを行うよりも桁違いに効率的です。Wireshark の display filter は、すでにキャプチャされたパケット上で動作し、任意のプロトコルフィールドに対する詳細なフィルタリングをサポートします。TLS 復号には SSLKEYLOGFILE が鍵となります。

BPF フィルタ

BPF (Berkeley Packet Filter) はカーネルレベルのフィルタプログラムにコンパイルされ、パケットキャプチャの前に一致しないパケットを破棄し、ユーザー空間へのコピーを回避します。

host 192.168.1.1
net 192.168.0.0/24
port 443
portrange 8000-9000
tcp, udp, icmp, arp
and / or / not / && / || / !

TCP フラグ:
  'tcp[tcpflags] & tcp-syn != 0'       SYN
  'tcp[tcpflags] == tcp-syn'           SYN のみ (SYN+ACK は除く)
  'tcp[tcpflags] & tcp-rst != 0'       RST

組み合わせ:
  '(host 1.1.1.1 or host 8.8.8.8) and tcp port 443'

実践的なコマンド

# ファイルへのパケットキャプチャ:
tcpdump -i eth0 -w capture.pcap -s 0 'host 192.168.1.1 and port 443'

# DNS:
tcpdump -i any -nn 'port 53'

# TCP SYN (すべての接続確立):
tcpdump -i any -nn 'tcp[tcpflags] & tcp-syn != 0'

# HTTP Host ヘッダー:
tcpdump -A -s 0 'tcp port 80' | grep -i 'Host:'

# tshark (Wireshark CLI):
tshark -r capture.pcap -Y 'tcp.analysis.retransmission'
tshark -r capture.pcap -Y 'tcp.analysis.zero_window'
tshark -r capture.pcap -z conv,tcp               # 接続統計

# TLS 復号:
# Wireshark: Edit - Preferences - TLS - (Pre)-Master-Secret log filename = SSLKEYLOGFILE

参考

  • BPF 構文⁠: tcpdump.org/manpages/pcap-filter.7
  • Wireshark: wiki.wireshark.org/DisplayFilters

キーワード: tcpdump, BPF フィルタ, Wireshark, tshark, パケットキャプチャ, 再送