よく使うtcpdumpコマンド

# ■ よく使うオプションとexpression
[man tcpdump](https://nxmnpg.lemoda.net/ja/1/tcpdump)

```
tcpdump [options] [expression]
```

## オプション

自分的によく使うオプションは以下になります。

```
# -t             タイムスタンプを出力しない
# -n             アドレスを名前に変換しない
# -i <INTERFACE> パケットキャプチャ対象のネットワークインターフェースを指定
# -e             イーサネットヘッダを出力する
# -l             標準出力を行バッファリングする
# -A             パケット(イーサネットヘッダを除く)をASCIIで表示 (webページのキャプチャで便利)
# -x             パケット(イーサネットヘッダを除く)の内容を16進数で出力
# -xx            パケット(イーサネットヘッダを含む)の内容を16進数で出力
# -x             パケット(イーサネットヘッダを除く)の内容を16進数とASCIIで出力
# -XX            パケット(イーサネットヘッダを含む)の内容を16進数とASCIIで出力
# -v             出力情報を増やす
# -vv            出力情報をさらに増やす
# -vvv           出力情報をもっと増やす
```

## expression

expressionにはダンプするパケットを選択するための条件を指定します。複数指定する場合は `or` , `and` で接続します。


```
# ether dst <MAC_ADDR>  宛先が指定したMACアドレスの場合
# ether src <MAC_ADDR>  送信元が指定したMACアドレスの場合
# ether host <MAC_ADDR> 宛先もしくは送信元が指定したMACアドレスの場合
# dst host <HOST>       宛先が指定したホスト名もしくはIPアドレスの場合
# src host <HOST>       送信元が指定したホスト名もしくはIPアドレスの場合
# host <HOST>           宛先もしくは送信元が指定したホスト名もしくはIPアドレスの場合
# dst net <NETWORK>     宛先が指定したネットワークの場合 (例) 10.0.0.0/8
# src net <NETWORK>     送信元が指定したネットワークの場合 (例) 10.0.0.0/8
# net <NETWORK>         宛先もしくは送信元が指定したネットワークの場合 (例) 10.0.0.0/8
# dst port <PORT>       宛先が指定したポートの場合
# src port <PORT>       送信元が指定したポートの場合
# port <PORT>           宛先もしくは送信元がが指定したポートの場合
# <PROTOCOL>            ether, ip, icmp, arp, rarp, tcp, udp, etc...
# vlan [VLAN_ID]        パケットが IEEE 802.1Q VLAN パケットの場合
```

# ■ ユースケース別よく使う組み合わせ
## ARPのキャプチャ
```bash
# -t タイムスタンプを表示しない
# -n アドレスを名前に変換しない
# -e イーサネットのヘッダ情報を表示する
# -l 標準出力を行バッファリングする
tcpdump -tnel -i any arp
# 00:00:5e:00:53:01 > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 42: Request who-has 192.0.2.2 tell 192.0.2.1, length 28
# 00:00:5e:00:53:02 > 00:00:5e:00:53:01, ethertype ARP (0x0806), length 42: Reply 192.0.2.2 is-at 00:00:5e:00:53:02, length 28
```

## pingのキャプチャ

```bash
# -t タイムスタンプを表示しない
# -n アドレスを名前に変換しない
# -e イーサネットのヘッダ情報を表示する
# -l 標準出力を行バッファリングする
tcpdump -tnel -i any icmp
# 00:00:5e:00:53:01 > 00:00:5e:00:53:02, ethertype IPv4 (0x0800), length 98: 192.0.2.1 > 192.0.2.2: ICMP echo request, id 17365, seq 1, length 64
# 00:00:5e:00:53:02 > 00:00:5e:00:53:01, ethertype IPv4 (0x0800), length 98: 192.0.2.2 > 192.0.2.1: ICMP echo reply, id 17365, seq 1, length 64
```

## UDPのキャプチャ

```bash
# -i <interface> パケットキャプチャ対象のネットワークインターフェース
# -t タイムスタンプを表示しない
# -n アドレスを名前に変換しない
# -l 標準出力を行バッファリング
# -A キャプチャした内容をASCII文字として表示する
tcpdump -tnlA -i any "udp and port 54321"
# IP 127.0.0.1.43058 > 127.0.0.1.54321: UDP, length 12
# E..(0.@.@............2.1...'hello world
```

## TCPのキャプチャ

```bash
# -t タイムスタンプを表示しない
# -n アドレスを名前に変換しない
# -l 標準出力を行バッファリング
# -A キャプチャした内容をASCII文字として表示する
sudo tcpdump -tnlA  -i any "tcp and port 54321"
# === === === 3wayハンドシェイク === === ===
# IP 127.0.0.1.44760 > 127.0.0.1.54321: Flags [S], seq 1295360057, win 65495, options [mss 65495,sackOK,TS val 4208188012 ecr 0,nop,wscale 7], length 0
# E..<.5@.@.L............1M5.9.........0.........
# ...l........
# IP 127.0.0.1.54321 > 127.0.0.1.44760: Flags [S.], seq 3835090924, ack 1295360058, win 65483, options [mss 65495,sackOK,TS val 4208188012 ecr 4208188012,nop,wscale 7], length 0
# E..<..@.@.<..........1......M5.:.....0.........
# ...l...l....
# IP 127.0.0.1.44760 > 127.0.0.1.54321: Flags [.], ack 1, win 512, options [nop,nop,TS val 4208188012 ecr 4208188012], length 0
# E..4.6@.@.L............1M5.:.........(.....
# ...l...l
# === === === クライアントからデータの送信 === === ===
# IP 127.0.0.1.44760 > 127.0.0.1.54321: Flags [P.], seq 1:15, ack 1, win 512, options [nop,nop,TS val 4210427304 ecr 4208188012], length 14
# E..B.7@.@.L|...........1M5.:.........6.....
# .......lHello, World!
# === === === サーバーからの確認応答(ack) === === ===
# ※ ack の後ろの数字は確認応答番号で、15バイトまでは正常に受信できた旨をクライアントに応答する
# IP 127.0.0.1.54321 > 127.0.0.1.44760: Flags [.], ack 15, win 512, options [nop,nop,TS val 4210427304 ecr 4210427304], length 0
# E..4.k@.@.8W.........1......M5.H.....(.....
# ........
```