前言

tcpdump是一个命令行包分析工具,很像 wireshark, 你可以使用tcpdump抓包、分析包、连接问题的 troubleshoot,和查找网络层上潜在的安全问题。

开始

首先,你可以使用-D 列出可以抓包的网络接口

$ sudo tcpdump -D
1.en0 [Up, Running]
2.bridge0 [Up, Running]
3.p2p0 [Up, Running]
4.awdl0 [Up, Running]
5.utun0 [Up, Running]
6.en1 [Up, Running]
7.en2 [Up, Running]
8.lo0 [Up, Running, Loopback]
9.vboxnet0 [Running]
10.gif0
11.stf0

Protocol filters

$ sudo tcpdump tcp

Port filters

$ sudo tcpdump port 80

# 端口范围
$ sudo tcpdump port 22-125
# Source port is 80
$ sudo tcpdump src port 80 

# Destination port is 80
$ sudo tcpdump dst port 80

Host filters

$ sudo tcpdump host 1.2.3.4

# Source host is 1.2.3.4
$ sudo tcpdump src host 1.2.3.4

# Destination host is 1.2.3.4
$ sudo tcpdump dst host 1.2.3.4

Net filters

sudo tcpdump net 192.168.1.0/24

Combining filters

$ sudo tcpdump "src port 80" and "dst host 1.2.3.4"
$ sudo tcpdump "src port 80" or "src port 443"
# 
$ sudo tcpdump -i eth0 src port not 22

: tcpdump 支持 andornot

保存输出

$ sudo tcpdump tcp -c 20 -w PATH_TO_FILE 

:

  • 可以使用-w, 保存抓包的数据至文件中。
  • -c count Exit after receiving count packets.

如果你即想保存至文件也想输出至屏幕,你可以添加

$ sudo tcpdump tcp -w - | tee PATH_TO_FILE | tcpdump -r -

保存的抓包文件可以通过 -r来读取

$ sudo tcpdump -r PATH_TO_FILE

解析包

tcpdump抓获的一个tcp的典型数据包输出类似于如下:

17:42:53.490718 IP 192.168.0.1.443 > 192.168.0.114.59508: Flags [.], ack 1, win 67, length 0
  • 第一字段 17:42:53.490718是抓包的时间戳, 下一个 IP代表的是网络层的协议,在这个例子中是 IPv4

  • 下一个字段是源地址和端口,这里是源地址是192.168.0.1,端口是443, 类似地,192.168.0.114.59508代表目的地址及端口。

  • Flags [.]表示 TCP 的标记,这个例子中,TCP ACK 的标记被设置,其后是ACK的编号“ACK 1”, 下一个字段是窗口大小“Win 67”,最后是分组长度“Length 0”。

: 不同协议类型的输出中有更多字段,有关详细信息,请查看tcpdump的文档。

阅读包

$ sudo tcpdump port 80 -A -c 1

您可以运行此命令,然后使用HTTP访问页面。 您将看到以纯文本打印出来的包内容。

Host: www.example.com
Connection: keep-alive
User-Agent: Chrome/80
Accept: image/webp,image/apng,image/*,*/*;q=0.8
Referer: http://www.example.com
Accept-Encoding: gzip, deflate
Accept-Language: en-US;q=0.8,en;q=0.7
Cookie: SESSID=71mapjkxxro59donut84n0cfms0

参考

  1. Manpage of TCPDUMP