以下所有示例都是在 macbook 下测试. 局域网地址为: 10.0.0.68

查看哪个网卡可以被监听

sudo tcpdump -D

输出结果:
1.en0 [Up, Running]
2.p2p0 [Up, Running]
3.awdl0 [Up, Running]
4.bridge0 [Up, Running]
5.utun0 [Up, Running]
6.en1 [Up, Running]
7.utun1 [Up, Running]
8.en2 [Up, Running]
9.lo0 [Up, Running, Loopback]
10.gif0
11.stf0
12.XHC20

那些 Up, Running 状态的, 就表示可以被监听的.

监听指定网卡的所有流量

sudo tcpdump -i en0

监听所有可以被监听的网卡

sudo tcpdump -i any

查看详细的输出

sudo tcpdump -v
sudo tcpdump -vv
sudo tcpdump -vvv

查看比较少的输出

-q

sudo tcpdump -i lo0 tcp port 8080 -q
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo0, link-type NULL (BSD loopback), capture size 262144 bytes
17:08:42.635649 IP localhost.52460 > localhost.http-alt: tcp 0
17:08:42.635720 IP localhost.http-alt > localhost.52460: tcp 0
17:08:42.635735 IP localhost.52460 > localhost.http-alt: tcp 0

可以看到, 它只是输出连接地址, 以及数据tcp 数据包的长度.

将数据包以十六进制以及ASCII输出

sudo tcpdump -i lo0 -v -X

只抓取 N 个数据包

sudo tcpdump -c 100

将记录输出到文件

sudo tcpdump -v -w capture.cap

从输出的文件中读取数据

sudo tcpdump -vvv -r capture.cap

不进行域名解析

sudo tcpdump -n

只捕获所有发送到指定IP的数据

sudo tcpdump -i en0 dst host 10.0.0.68

10.0.0.68 替换为你想捕获的目的地IP数据地址即可

只捕获所有从某IP发出的数据

sudo tcpdump -i en0 src host 10.0.0.68

10.0.0.68 替换为你想捕获的源IP数据地址即可

捕获所有主机为指定IP的数据

sudo tcpdump -n host 10.0.0.68

这意味着, 获取所有 10.0.0.68 接收或发送出的所有数据.

只捕获所有指定网段的源IP发送的数据

sudo tcpdump -n src net 10.0.0.0/24

只捕获所有发送到指定网段的目的地IP的数据

sudo tcpdump -n dst net 10.0.0.0/24

只捕获所有指定网段的IP数据

sudo tcpdump -n net 10.0.0.0/24

这意味着, 不管是从这网段发出或接收的数据, 都进行捕获.

捕获指定目的地端口的数据

sudo tcpdump -i any -n dst port 8080

即不管目的地IP是多少, 只是接收的端口为 8080 的数据, 全进行捕获.

还可以指定端口范围

sudo tcpdump -i any -n dst portrange 1-8080

还可以指定协议类型

sudo tcpdump -i any -n tcp dst portrange 1-8080

tcp 表示为 TCP 类型

udp 表示为 UDP 类型

捕获目的地为指定IP 以及 指定端口的数据

sudo tcpdump -i any -n "dst port 8080 and dst host 10.0.0.68"

即: 所有发送到 10.0.0.68:8080 的数据都进行捕获

sudo tcpdump -i any -n "(dst port 8080 or dst port 443) and dst host 10.0.0.68"

即: 所有发送到 10.0.0.68 的数据, 并且端口为 8080443 都可以.

只捕获指定大小的数据包

默认是 68 bytes

sudo tcpdump -s 500

捕获所有数据包

sudo tcpdump -s 0

捕获 ARP 数据包

sudo tcpdump -v arp

捕获 ICMP 数据包

sudo tcpdump -v icmp

捕获HTTP 数据包

sudo tcpdump -i any -s 0 'tcp port http'

调试 HTTPS 数据包

虽然 tcpdump 目前还不支持 https 的数据进行明文处理. 但现在的服务器, 一般是使用 nginx 作为负载均衡, 然后后端使用 tomcat 来进行处理. 这样子, 我们就可以用 tcpdump 来捕获 tomcat 端口的数据即可~

假设, 服务器配置的 upstream 如下:

upstream web.request {
        server 127.0.0.1:8770;
        server 127.0.0.1:8078;
}

则可以这样子监听:

sudo tcpdump -i lo port 8770 or port 8078 -vvv -X