tcpdumpの使い方

まえがき

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を指定する

f:id:st1t:20200520005831p:plain

↑の例でいうと

Ack: 16
Push: 8
なので、16 + 8 = 24
$ tcpdump 'tcp[13] = 24'

tcpdumpで色んなtcpヘッダーを指定するときの早見表

f:id:st1t:20200525224637p:plain

Wiresharkの使い方

filter

# Warning or Errorパケットを探す
_ws.expert.severity == "Warning" or _ws.expert.severity == "Error"
# 

URLとかでざっくり検索する

Command + Fで検索画面を出して、ドロップボックスをStringにしてキーワード検索できる

f:id:st1t:20200520002752p:plain

multipart/form-dataのデータを確認する

デフォルトの設定だとエンコードされてるので、右クリックして設定すると見えるようにする ※基本的には暗号化されてるので開発環境等でのデバッグ用 f:id:st1t:20200520000026p:plain

参考

TCPヘッダオフセットについて

serverfault.com www.packetlevel.ch

コピペするときによく使うやつ

blog.livedoor.jp