Tcpdump 是一个 TCP / UDP 的抓包工具,配合 Wireshark 阅读抓包后的报文,是网络问题排查的重要手段。由于工作中大部分人都不了解 tcpdump 命令的用法,或者使用的过程中因为不常用老是忘记,所以这篇文章分享的主旨在于 tcpdump 命令常见用法,方便日常的查阅。
使用说明
可用网口
tcpdump -D
1.docker0
2.nflog (Linux netfilter log (NFLOG) interface)
3.nfqueue (Linux netfilter queue (NFQUEUE) interface)
4.ens192
5.veth380b884
6.any (Pseudo-device that captures on all interfaces)
7.lo [Loopback]
命令格式
tcpdump -i <网口名称(tcpdump -D)> [options] <express>
[options] 可以参考 man tcpdump
的帮助文档
监听网络报文
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
... ...(已忽略)