まえがき
tcpdumpの使い方、TCPヘッダフラグの位置、その他雑多なものをメモしておく。
tcpdumpのよく使うやつ
やる前に気をつけたほうが良いこと
- 何のため、どういう状態であると仮定してを意識してから取得する
- 闇雲にとってもパケットおじさんじゃないと多分難しい
- ex. トラブル対応で特定のリクエストのコネクションの状態を確認するため
- APPサーバの処理時間は短かかった。WEBサーバのアクセスログの処理時間は長い
- sarの毎分の状況からWEBサーバのログ。システム負荷状況は問題なさそう(秒単位では待ちがある可能性はある)
- LB - WEBサーバ / WEBサーバ - APPサーバのコネクション確立から閉じるまでで待ちが発生していると仮定
- そのため、KeepAliveを切った上で、LB - WEB / WEB - APPの2つのコネクションの処理状況を調査する
- NW的に問題がなさそうであれば、LinuxKernel/Middlewareの設定やバグが疑われるため、straceを用いてコール状況を確認する
- 負荷に要注意
- アクセスログの処理時間/ステータスコード
- 基本的にはインターネットに一番近いところのログを確認する
- AWSのELBログならElasticのfilebeatで突っ込むのが非常に楽で良い
- www.elastic.co
- システム負荷:
dstat -af
- アクセスログの処理時間/ステータスコード
- KeepAliveを使ってると後でパケットを眺めるときにしんどいから、デバッグするときはリクエスト数を薄めて切ったほうが良い
コマンド
# 80ポートを60秒ごとに、ファイル名にタイムスタンプ入りで取得。-Zはローテートしたときにファイルのユーザーを指定 $ tcpdump -s0 -i any -A port 80 -G 60 -w tcpdump_%Y%m%d_%H%M.cap -Z root # ↑のやつをバックグラウンドで回し続ける $ tcpdump -s0 -i any -A port 80 -G 60 -w tcpdump_%Y%m%d_%H%M.cap -Z root > /dev/null 2>&1 &
tcpdumpでflagを指定する
↑の例でいうと
Ack: 16 Push: 8 なので、16 + 8 = 24 $ tcpdump 'tcp[13] = 24'
tcpdumpで色んなtcpヘッダーを指定するときの早見表
Wiresharkの使い方
filter
# Warning or Errorパケットを探す _ws.expert.severity == "Warning" or _ws.expert.severity == "Error" #
URLとかでざっくり検索する
Command + Fで検索画面を出して、ドロップボックスをStringにしてキーワード検索できる
multipart/form-dataのデータを確認する
デフォルトの設定だとエンコードされてるので、右クリックして設定すると見えるようにする
※基本的には暗号化されてるので開発環境等でのデバッグ用
参考
TCPヘッダオフセットについて
serverfault.com www.packetlevel.ch