Tcpdump 是一个 TCP / UDP 的抓包工具,配合 Wireshark 阅读抓包后的报文,是网络问题排查的重要手段。由于工作中大部分人都不了解 tcpdump 命令的用法,或者使用的过程中因为不常用老是忘记,所以这篇文章分享的主旨在于 tcpdump 命令常见用法,方便日常的查阅。

使用说明

可用网口

  1. tcpdump -D
  1. 1.docker0
  2. 2.nflog (Linux netfilter log (NFLOG) interface)
  3. 3.nfqueue (Linux netfilter queue (NFQUEUE) interface)
  4. 4.ens192
  5. 5.veth380b884
  6. 6.any (Pseudo-device that captures on all interfaces)
  7. 7.lo [Loopback]

命令格式

  1. tcpdump -i <网口名称(tcpdump -D)> [options] <express>

[options] 可以参考 man tcpdump 的帮助文档
可以参考 https://biot.com/capstats/bpf.html

监听网络报文

0. 参数说明

-i <网口名称> 监听特定的网口,lo 属于环回地址网口
-w <文件名.pcap> 将抓取后的报文保存到指定文件中
-c <数字> 抓取指定报文次数后停止

1. 监听本地环回网口网络包

适合于带有反向代理的服务器,如下以 Nginx(80) -> Tomcat(8080) 为例,并将报文保存到 result.pcap 文件。

tcpdump -i lo -w ./result.pcap port 8080

2. 监听特定网口的网络包

还是以 Nginx(80) -> Tomcat(8080) 为例,80 端口是对外提供服务的,假设网口是 eth(可通过 tcpdump -D 获取),并将报文保存到 result.pcap 文件。

tcpdump -i eth -w ./result.pcap port 80

3. 监听特定 Host 访问网络包

以监听 host 为 www.websocket.org 访问为例,假设网口是 eth(可通过 tcpdump -D 获取),并将报文保存到 result.pcap 文件。

tcpdump -i eth -w ./result.pcap host www.websocket.org

4. 监听特定数量的网络包

以监听 100 个网络包为例,假设网口是 eth(可通过 tcpdump -D 获取),并将报文保存到 result.pcap 文件。

tcpdump -i eth -w ./result.pcap -c 100

5. 监听特定协议的网络包

可监听的协议包括,ether、fddi、tr、wlan、ip、ip6、arp、rarp、decnet、tcp、udp 等。依然假设网口是 eth,且将报文保存到 result.pcap 文件,以下是以监听 tcp 协议为例,其中增加了 host / port 的过滤条件。

tcpdump -i eth -w ./result.pcap tcp and host www.websocket.org and port 80

读取网络报文

0. 参数介绍

-r 分析抓包文件
-S 显示 SYN / ACK 序列的绝对值
-n 显示 IP 地址,而非 Host 名称
-A 显示 ASCII 形式的报文
-X 显示 Hex 和 ASCII 形式的报文

1. 读取网络报文

显示最基本的报文请求,如下的三次握手过程所示。

tcpdump -r result.pcap
20:38:14.333800 IP 192.168.101.70.57806 > ec2-174-129-224-73.compute-1.amazonaws.com.http: Flags [S], seq 2624614245, win 65535, options [mss 1460,nop,wscale 6,nop,nop,TS val 462965745 ecr 0,sackOK,eol], length 0
20:38:14.561353 IP ec2-174-129-224-73.compute-1.amazonaws.com.http > 192.168.101.70.57806: Flags [S.], seq 3346469533, ack 2624614246, win 26847, options [mss 1412,sackOK,TS val 1256455003 ecr 462965745,nop,wscale 7], length 0
20:38:14.561467 IP 192.168.101.70.57806 > ec2-174-129-224-73.compute-1.amazonaws.com.http: Flags [.], ack 1, win 2056, options [nop,nop,TS val 462965971 ecr 1256455003], length 0

上面显示的三次握手中的 ack 1 实在无法确定是响应那一条的 TCP 请求,这时候我们需要增加 -S 参数显示 SYN / ACK 的序列绝对值。

tcpdump -r result.pcap -S
20:38:14.333800 IP 192.168.101.70.57806 > ec2-174-129-224-73.compute-1.amazonaws.com.http: Flags [S], seq 2624614245, win 65535, options [mss 1460,nop,wscale 6,nop,nop,TS val 462965745 ecr 0,sackOK,eol], length 0
20:38:14.561353 IP ec2-174-129-224-73.compute-1.amazonaws.com.http > 192.168.101.70.57806: Flags [S.], seq 3346469533, ack 2624614246, win 26847, options [mss 1412,sackOK,TS val 1256455003 ecr 462965745,nop,wscale 7], length 0
20:38:14.561467 IP 192.168.101.70.57806 > ec2-174-129-224-73.compute-1.amazonaws.com.http: Flags [.], ack 3346469534, win 2056, options [nop,nop,TS val 462965971 ecr 1256455003], length 0

ack 1 改为显示 ack 3346469534 后,我们就能知道 ACK 响应的是序列为 seq 3346469533 的 TCP 请求,ack 3346469534 则是 seq 3346469533 + 1 计算而来。

如果我们想要服务器显示 IP 地址呢?可以使用 -n 参数。

tcpdump -r result.pcap -n
20:38:14.333800 IP 192.168.101.70.57806 > 174.129.224.73.80: Flags [S], seq 2624614245, win 65535, options [mss 1460,nop,wscale 6,nop,nop,TS val 462965745 ecr 0,sackOK,eol], length 0
20:38:14.561353 IP 174.129.224.73.80 > 192.168.101.70.57806: Flags [S.], seq 3346469533, ack 2624614246, win 26847, options [mss 1412,sackOK,TS val 1256455003 ecr 462965745,nop,wscale 7], length 0
20:38:14.561467 IP 192.168.101.70.57806 > 174.129.224.73.80: Flags [.], ack 1, win 2056, options [nop,nop,TS val 462965971 ecr 1256455003], length 0

从 ec2-174-129-224-73.compute-1.amazonaws.com.http 改为显示 174.129.224.73.80(80 是端口)

2. 读取网络报文(ASCII)

以 ASCII 文本格式解析抓包后的报文,常用于解析 HTTP 或基于文本的协议。

tcpdump -A -r result.pcap
16:45:40.909755 IP localhost.56178 > localhost.iua: Flags [P.], seq 1:716, ack 1, win 342, options [nop,nop,TS val 1342233968 ecr 1342233968], length 715
E...j.@.@..h.........r&.q....|Kk...V.......
P..pP..pGET / HTTP/1.1
X-FORWARDED-FOR: 192.168.201.42
X-FORWARDED-PROTO: http
Host: xyz.com
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Purpose: prefetch
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
... ...(已忽略)

3. 读取网络报文(Hex/ASCII)

以 Hex/ASCII 文本格式解析抓包后的报文,常用于解析基于字节流的协议或者是定制的私有协议。

tcpdump -X -r result.pcap
16:45:40.909755 IP localhost.56178 > localhost.iua: Flags [P.], seq 1:716, ack 1, win 342, options [nop,nop,TS val 1342233968 ecr 1342233968], length 715
        0x0000:  4500 02ff 6a8e 4000 4006 cf68 7f00 0001  E...j.@.@..h....
        0x0010:  7f00 0001 db72 26ac 71c2 b7fd 837c 4b6b  .....r&.q....|Kk
        0x0020:  8018 0156 00f4 0000 0101 080a 5000 dd70  ...V........P..p
        0x0030:  5000 dd70 4745 5420 2f20 4854 5450 2f31  P..pGET./.HTTP/1
        0x0040:  2e31 0d0a 582d 464f 5257 4152 4445 442d  .1..X-FORWARDED-
        0x0050:  464f 523a 2031 3932 2e31 3638 2e32 3031  FOR:.192.168.201
        0x0060:  2e34 320d 0a58 2d46 4f52 5741 5244 4544  .42..X-FORWARDED
        0x0070:  2d50 524f 544f 3a20 6874 7470 0d0a 486f  -PROTO:.http..Ho
        0x0080:  7374 3a20 7874 350d 0a55 7067 7261 6465  st:.xt5..Upgrade
        0x0090:  2d49 6e73 6563 7572 652d 5265 7175 6573  -Insecure-Reques
        0x00a0:  7473 3a20 310d 0a55 7365 722d 4167 656e  ts:.1..User-Agen
        0x00b0:  743a 204d 6f7a 696c 6c61 2f35 2e30 2028  t:.Mozilla/5.0.(
        0x00c0:  4d61 6369 6e74 6f73 683b 2049 6e74 656c  Macintosh;.Intel
        0x00d0:  204d 6163 204f 5320 5820 3130 5f31 345f  .Mac.OS.X.10_14_
        0x00e0:  3629 2041 7070 6c65 5765 624b 6974 2f35  6).AppleWebKit/5
        0x00f0:  3337 2e33 3620 284b 4854 4d4c 2c20 6c69  37.36.(KHTML,.li
        0x0100:  6b65 2047 6563 6b6f 2920 4368 726f 6d65  ke.Gecko).Chrome
        0x0110:  2f38 352e 302e 3431 3833 2e31 3032 2053  /85.0.4183.102.S
        0x0120:  6166 6172 692f 3533 372e 3336 0d0a 4163  afari/537.36..Ac
... ...(已忽略)