使用tcpdump 和 Wireshark进行简单TCP抓包分析【图文教程】

1.什么是tcpdump 和 Wireshark

tcpdumpWireshark 都是网络分析工具,用于捕获和分析网络数据包,但它们在功能和使用上有所不同。

  • tcpdump 仅支持命令行格式使用,常用在 Linux 服务器中抓取和分析网络包。
  • Wireshark 除了可以抓包外,还提供了可视化分析网络包的图形页面。

所以,这两者实际上是搭配使用的,先用 tcpdump 命令在 Linux 服务器上抓包,接着把抓包的文件拖出到 Windows 电脑后,用 Wireshark 可视化分析。如果你是在 Windows 上抓包,只需要用 Wireshark 工具就可以。

1.1WireShark软件安装

软件下载路径:wireshark官网。按照系统版本选择下载,下载完成后,按照软件提示一路Next安装。

2.tcpdump 在 Linux 下如何抓包?

安装 tcpdump

如果你的系统上没有安装 tcpdump,可以通过包管理器进行安装。在大多数基于 Debian 的系统(如 Ubuntu)上,可以使用以下命令安装:

sudo apt-get update
sudo apt-get install tcpdump

在基于 Red Hat 的系统(如 CentOS、Fedora)上,可以使用以下命令安装:

sudo yum install tcpdump

使用 tcpdump 抓包

一旦安装完成,就可以使用 tcpdump 命令进行抓包。以下是一些常用的 tcpdump 命令选项和示例:

sudo tcpdump -i <interface>
<interface> 是要监听的网络接口,如 eth0、wlan0 等。如果不指定接口,默认会选择系统上的第一个网络接口。
使用 -w 参数可以将捕获的数据包保存到文件中,以便后续分析:
sudo tcpdump -i eth0 -w capture.pcap
使用 -c 参数可以指定捕获的数据包数量:
sudo tcpdump -i eth0 -c 100
可以使用 BPF 过滤器来只捕获符合特定条件的数据包。例如,只捕获目标地址为 192.168.1.100 的数据包:
sudo tcpdump -i eth0 dst 192.168.1.100

查看电脑网络接口使用ifconfig

示例:

假设我们要抓取下面的 ping 的数据包:(百度的一个ip地址)(首先进行抓包然后再ping)

其中,-I 表示从指定的网络接口ens33出去,-c 3 表示抓取3个 icmp数据包

要抓取上面的 ping 命令数据包,首先我们要知道 ping 的数据包是 icmp 协议,接着在使用 tcpdump 抓包的时候,就可以指定只抓 icmp 协议的数据包:

那么当 tcpdump 抓取到 icmp 数据包后, 输出格式如下:

从 tcpdump 抓取的 icmp 数据包,我们很清楚的看到 icmp echo 的交互过程了,首先发送方发起了 ICMP echo request 请求报文,接收方收到后回了一个 ICMP echo reply 响应报文,后 seq 是递增的。

我在这里也帮你整理了一些最常见的用法,并且绘制成了表格,你可以参考使用。

首先,先来看看常用的选项类,在上面的 ping 例子中,我们用过 -i 选项指定网口,用过 -nn 选项不对 IP 地址和端口名称解析。其他常用的选项,如下表格:

接下来,我们再来看看常用的过滤表用法,在上面的 ping 例子中,我们用过的是 icmp and host 183.2.172.42,表示抓取 icmp 协议的数据包,以及源地址或目标地址为 183.2.172.42的包。其他常用的过滤选项,我也整理成了下面这个表格。

说了这么多,你应该也发现了,tcpdump 虽然功能强大,但是输出的格式并不直观。

所以,在工作中 tcpdump 只是用来抓取数据包,不用来分析数据包,而是把 tcpdump 抓取的数据包保存成 pcap 后缀的文件,接着用 Wireshark 工具进行数据包分析。

3.使用tcpdump和Wireshark 工具进行分析数据包?

Wireshark 除了可以抓包外,还提供了可视化分析网络包的图形页面,同时,还内置了一系列的汇总分析工具。

比如,拿上面的 ping 例子来说,我们可以使用下面的命令,把抓取的数据包保存到 ping.pcap 文件

接着把 ping.pcap 文件拖到电脑,再用 Wireshark 打开它(直接把.pacp拖到Wireshark即可)。打开后,你就可以看到下面这个界面:

是吧?在 Wireshark 的页面里,可以更加直观的分析数据包,不仅展示各个网络包的头部信息,还会用不同的颜色来区分不同的协议,由于这次抓包只有 ICMP 协议,所以只有紫色的条目。

接着,在网络包列表中选择某一个网络包后,在其下面的网络包详情中,可以更清楚的看到,这个网络包在协议栈各层的详细信息。比如,以编号 1 的网络包为例子:

  • 可以在数据链路层,看到 MAC 包头信息,如源 MAC 地址和目标 MAC 地址等字段;
  • 可以在 IP 层,看到 IP 包头信息,如源 IP 地址和目标 IP 地址、TTL、IP 包长度、协议等 IP 协议各个字段的数值和含义;
  • 可以在 ICMP 层,看到 ICMP 包头信息,比如 Type、Code 等 ICMP 协议各个字段的数值和含义;

Wireshark 用了分层的方式,展示了各个层的包头信息,把“不可见”的数据包,清清楚楚的展示了给我们,还有理由学不好计算机网络吗?是不是相见恨晚

从 ping 的例子中,我们可以看到网络分层就像有序的分工,每一层都有自己的责任范围和信息,上层协议完成工作后就交给下一层,最终形成一个完整的网络包。

4.使用tcpdump和Wireshark 抓取TCP包解密三次握手和四次挥手

既然学会了 tcpdump 和 Wireshark 两大网络分析利器,那我们快马加鞭,接下来用它俩抓取和分析 HTTP 协议网络包,并理解 TCP 三次握手和四次挥手的工作原理。

本次例子,我们将要访问的 http://183.2.172.42 服务端(百度的ip地址)。在终端一用 tcpdump 命令抓取数据包:

接着,在终端二执行下面的 curl 命令:

没安装curl,先安装:

最后,回到终端一,按下 Ctrl+C 停止 tcpdump,并把得到的 http.pcap 取出到电脑。

使用 Wireshark 打开 http.pcap 后,你就可以在 Wireshark 中,看到如下的界面:

我们都知道 HTTP 是基于 TCP 协议进行传输的,那么:

  • 最开始的 3 个包就是 TCP 三次握手建立连接的包
  • 中间是 HTTP 请求和响应的包
  • 而最后的 4个包则是 TCP 断开连接的挥手包

Wireshark 可以用时序图的方式显示数据包交互的过程,从菜单栏中,点击 统计 (Statistics) -> 流量图 (Flow Graph),然后,在弹出的界面中的「流量类型」选择 「TCP Flows」,你可以更清晰的看到,整个过程中 TCP 流的执行过程:

你可能会好奇,为什么三次握手连接过程的 Seq 是 0 ?

实际上是因为 Wireshark 工具帮我们做了优化,它默认显示的是序列号 seq 是相对值,而不是真实值。

如果你想看到实际的序列号的值,可以右键菜单, 然后找到「协议首选项」,接着找到「Relative Seq」后,把它给取消,操作如下:

取消后,Seq 显示的就是真实值了:

可见,客户端和服务端的序列号实际上是不同的,序列号是一个随机值。

这其实跟我们书上看到的 TCP 三次握手和四次挥手很类似,作为对比,你通常看到的 TCP 三次握手和四次挥手的流程,基本是这样的:

为什么抓到的 TCP 挥手是三次,而不是书上说的四次?

当被动关闭方(上图的服务端)在 TCP 挥手过程中,「没有数据要发送」并且「开启了 TCP 延迟确认机制」,那么第二和第三次挥手就会合并传输,这样就出现了三次挥手。

而通常情况下,服务器端收到客户端的 FIN 后,很可能还没发送完数据,所以就会先回复客户端一个 ACK 包,稍等一会儿,完成所有数据包的发送后,才会发送 FIN 包,这也就是四次挥手了。

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-21 23:36:03       143 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-21 23:36:03       157 阅读
  3. 在Django里面运行非项目文件

    2024-07-21 23:36:03       132 阅读
  4. Python语言-面向对象

    2024-07-21 23:36:03       142 阅读

热门阅读

  1. Python 模块导入方式

    2024-07-21 23:36:03       35 阅读
  2. 基于最新版的flutter pointycastle: ^3.9.1的AES加密

    2024-07-21 23:36:03       28 阅读
  3. Shiro-550反序列化漏洞

    2024-07-21 23:36:03       24 阅读
  4. Kotlin单例、数据类、静态

    2024-07-21 23:36:03       31 阅读
  5. CSP-J模拟赛day1

    2024-07-21 23:36:03       34 阅读
  6. Linux下双网卡NAT组网

    2024-07-21 23:36:03       34 阅读
  7. Node的API基础

    2024-07-21 23:36:03       27 阅读
  8. C2W3.LAB.N-grams+Language Model+OOV

    2024-07-21 23:36:03       28 阅读