如何使用 tcpdump 分析网络请求?

写在前面
tcpdump 是我们常用的网络抓包的工具,更是分析网络性能必不可少的利器。一般在分析网络性能时,先用 tcodump 抓包,然后用 WireSharks 分析

  • tcpdump 仅支持命令行格式,但是是服务服务器中抓取和分析网络包必不可少的。
  • WireSharks 除了能够抓包之外,还提供了强大的图形界面和汇总分析工具。

安装tcpdump 和 WireSharks

工欲善其事必先利其器,我们可以先用以下命令在服务器安装 tcpdump:

ubuntu@VM-0-2-ubuntu:~/code/Code/newcode$ sudo apt install tcpdump

由于云服务器或者Linux系统都是基于命令行的,所以我们需要在本地主机安装WireShark:

https://share.weiyun.com/YYrB0D1X

之后一路点下一步,安装就好。

tcpdump

tcpdump 是最常用的网络分析工具。它基于libpcap,利用内核中的AF_PACKET套接字,抓取网络接口中的网络包,并且提供强大的过滤机制,帮助我们从大量的网络包中选择最想要的信息。

tcpdump 工具本身,它的基本使用方法还是比较简单的,即tcpdump [选项][过滤表达式],选项和表达式的外面都加了中括号,表示其是可选的。

以下是 tcpdump 的几个常用选项:

选项示例说明
- itcpdump -i eth0指定网络接口,默认是0号接口,any表示所有接口
- nntcpdump -nn不解析IP地址和端口号的名称
- ctcpdump -c5限制要抓取网络包的个数
- Atcpdump -A以ASCII格式显示网络包内容
- wtcpdump -w file.pcap保存到文件中,文件名以.pcap为后缀
- etcpdump -e输出链路层的头部信息

以下是 tcpdump 的常用过滤表达式:
在这里插入图片描述
网络中不同会导致最后 tcpdump 展示的格式也不同。

使用 tcpdump 抓ping命令的包

熟悉计算机的同学都知道,ping 命令是用来检测和服务端通信是否正常的,我们今天就来抓几个ping 命令的包来看看。

以下是个正常使用ping命令的例子,可以看到,当我们访问www.csdn.net的时候,实际上是跟39.106.226.142这台主机进行交互:

ubuntu@VM-0-2-ubuntu:~/code/Code/newcode$ ping -c3 www.csdn.net
PING www.csdn.net (39.106.226.142) 56(84) bytes of data.
64 bytes from 39.106.226.142 (39.106.226.142): icmp_seq=1 ttl=87 time=29.3 ms
64 bytes from 39.106.226.142 (39.106.226.142): icmp_seq=2 ttl=87 time=29.1 ms
64 bytes from 39.106.226.142 (39.106.226.142): icmp_seq=3 ttl=87 time=29.2 ms

--- www.csdn.net ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 29.198/29.250/29.335/0.206 ms

然后我们在另一个中断运行以下命令开启一个 tcpdump 持续监听网卡进行抓包:

ubuntu@VM-0-2-ubuntu:~/code/Code/newcode$ sudo tcpdump -nn udp port 53 or host 39.106.226.142

我们先来解读一下这条命令:

  • -nn:表示不解析抓包中的域名、协议以及端口号
  • udp port 53:表示只显示UDP协议的端口号为53的包
  • host 39.106.226.142:表示只显示IP地址为39.106.226.142的包

然后回车,在另一个中断中输入以下命令:

ubuntu@VM-0-2-ubuntu:~/code/Code/newcode$ ping -c3 www.csdn.net

之后,抓包的中断中会显示如下信息:

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
19:26:02.184802 IP 172.17.0.2.35272 > 183.60.82.98.53: 54162+ A? www.csdn.net. (30)
19:26:02.185136 IP 172.17.0.2.47974 > 183.60.82.98.53: 16910+ AAAA? www.csdn.net. (30)
19:26:02.186215 IP 183.60.82.98.53 > 172.17.0.2.35272: 54162 1/0/0 A 39.106.226.142 (46)
19:26:02.191823 IP 183.60.82.98.53 > 172.17.0.2.47974: 16910 0/1/0 (100)
19:26:02.192159 IP 172.17.0.2 > 39.106.226.142: ICMP echo request, id 13369, seq 1, length 64
19:26:02.221492 IP 39.106.226.142 > 172.17.0.2: ICMP echo reply, id 13369, seq 1, length 64
19:26:02.221756 IP 172.17.0.2.47639 > 183.60.82.98.53: 63347+ PTR? 142.226.106.39.in-addr.arpa. (45)
19:26:02.287888 IP 183.60.82.98.53 > 172.17.0.2.47639: 63347 NXDomain 0/1/0 (116)
19:26:03.192914 IP 172.17.0.2 > 39.106.226.142: ICMP echo request, id 13369, seq 2, length 64
19:26:03.222132 IP 39.106.226.142 > 172.17.0.2: ICMP echo reply, id 13369, seq 2, length 64
19:26:04.194210 IP 172.17.0.2 > 39.106.226.142: ICMP echo request, id 13369, seq 3, length 64
19:26:04.223431 IP 39.106.226.142 > 172.17.0.2: ICMP echo reply, id 13369, seq 3, length 64

这次输出中,前两行,表示 tcpdump 的选项以及接口的基本信息。从第三行开始,就是抓取到的网络包的输出。这些输出的格式,都是 时间戳 协议 源地址.源端口 > 目的地址.目的端口 网络包详细信息

解析 tcpdump 抓取的包

下面我们就来解读一下这些信息:

19:26:02.184802 IP 172.17.0.2.35272 > 183.60.82.98.53: 54162+ A? www.csdn.net. (30)
  • 54162+:表示查询标识值,他也会出现在响应中,加号表示启用递归查询
  • A?:表示查询 A 记录
  • www.csdn.net.:表示带查询的域名
  • 30:表示报文长度
19:26:02.186215 IP 183.60.82.98.53 > 172.17.0.2.35272: 54162 1/0/0 A 39.106.226.142 (46)

这一行是从183.60.82.98.53返回回来的应答信息,表示找到了www.csdn.net.的A记录值为39.106.226.142

19:26:02.192159 IP 172.17.0.2 > 39.106.226.142: ICMP echo request, id 13369, seq 1, length 64
19:26:02.221492 IP 39.106.226.142 > 172.17.0.2: ICMP echo reply, id 13369, seq 1, length 64

这两行是ICMP请求包和ICMP回复包,响应包的时间戳相减就是这个时延。

19:26:02.221756 IP 172.17.0.2.47639 > 183.60.82.98.53: 63347+ PTR? 142.226.106.39.in-addr.arpa. (45)

这一行是反向地址解析PTR请求。

可视化抓包工具:WireShark

可以看到 tcpdump 的输出还是不够直观,我们可以使用WireShark这个可视化工具来查看包。

首先,我们需要运行以下命令将抓包内容输出到文件ping.pcap

ubuntu@VM-0-2-ubuntu:~/code/Code/newcode$ sudo tcpdump -nn udp port 53 or host 39.106.226.142 -w ping.pcap

之后,我们在Windows的cmd上输入以下命令将这个ping.pcap文件下载到主机:
在这里插入图片描述
然后在WireShark中打开这个文件:
在这里插入图片描述
在WireShark的界面中,我可以发现,它不仅以更规整的格式,展示了各个网络包的头部信息;还用了不同颜色,展示DNS和ICMP这两种不同的协议。点击每一条我们还能看到详细的信息。
在这里插入图片描述

参考文献

[1] 倪朋飞.Linux性能优化实战.极客时间

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

shenmingik

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值