【学习笔记】tcpdump+Wireshark抓包(1)

1. tcpdump 和 Wireshark 是什么?

1.1 抓包是在干什么?

网络上的通信,本质上是数据被拆成一个个 数据包(Packet),经过网卡发送和接收。

抓包 = 在某个网卡上,把经过的数据包 复制一份 保存下来,供后续分析。

XML 复制代码
应用程序(curl、浏览器)
        ↓
    操作系统网络栈
        ↓
      网卡(eth0 / lo)
        ↓
   tcpdump 在这里「旁听」并录音

1.2 tcpdump 是什么?

项目 说明
类型 命令行抓包工具
运行环境 服务器、虚拟机、无图形界面的机器;macOS 也自带
主要用途 生产环境抓包、写脚本、远程排障
输出 终端直接显示,或保存为 .pcap 文件
特点 轻量、资源占用小;Linux 几乎都能装;Mac 预装在 /usr/sbin/tcpdump
权限 抓包通常需要管理员权限(sudo)

常见安装:

bash 复制代码
# Ubuntu / Debian
sudo apt install tcpdump

# CentOS / RHEL
sudo yum install tcpdump

# macOS(一般已自带,验证即可)
which tcpdump

1.3 Wireshark 是什么?

项目 说明
类型 图形界面 的网络协议分析工具
运行环境 个人电脑(Windows / macOS / Linux 桌面)
主要用途 打开 .pcap 文件,可视化分析协议细节
特点 协议解析强、过滤方便、适合深入分析

Wireshark 也能直接抓包,但生产服务器上更常用 tcpdump 抓 + Wireshark 看。

1.4 两者是什么关系?

搭档关系,不是二选一。

阶段 工具 做什么
抓 tcpdump 在服务器上录包,保存文件
看 Wireshark 打开文件,图形化分析

1.5 最小上手例子(ping 抓包)

以下是mac操作的例子,直接打开mac终端即可,如果是Linux下学习,也是一样,只不过生成的 .pcap 文件需要用 scp 传到你的电脑上再让Wireshark打开。

项目 说明
目标 抓一次 ping 流量,用 Wireshark 打开看
终端 1(抓包) 开始录制,保存到桌面
终端 2(产生流量) 发 4 次 ping
停止抓包 终端 1 按 Ctrl + C
分析 用 Wireshark 打开 .pcap 文件

终端输入:

bash 复制代码
# 终端 1:抓 ICMP,保存文件
sudo tcpdump -i any icmp -w ~/Desktop/ping-demo.pcap

# 终端 2:产生 ping 流量
ping -c 4 114.114.114.114

命令含义(先记这 4 个就够):

参数 含义
-i any 在所有网卡上抓
icmp 只抓 ping 用的 ICMP 包(噪音少)
-w ~/Desktop/ping-demo.pcap 保存到桌面,给 Wireshark 用
(无 -c) 一直抓,直到你按 Ctrl+C 停止

执行 tcpdump 的终端按下 control + c 之后,就会生成 .pcap 文件。

用 Wireshark 打开:

bash 复制代码
open -a Wireshark ~/Desktop/ping-demo.pcap

Wireshark 顶部过滤器输入:

bash 复制代码
icmp && ip.addr == 114.114.114.114

回车后,应 mainly 看到 10.2.73.219 ↔ 114.114.114.114 的包,噪音会少很多。

2.详细讲解实例

2.1 Wireshark 三个区域

界面结构:

bash 复制代码
┌─────────────────────────────────────────────────┐
│  ① 包列表(上面表格)                             | 
├──────────────────────┬──────────────────────────┤
│  ② 包详情(左下)      │  ③ 原始字节(右下)        │
└──────────────────────┴──────────────────────────┘
区域 位置 作用 小白先看什么
① 包列表 上方表格 一行 = 一个网络包,按时间排列 Source、Destination、Info
② 包详情 左下方 把一个包从外到里逐层展开 Frame → Ethernet → IP → ICMP/TCP
③ 原始字节 右下方 线上真实数据(十六进制 + ASCII) 初学阶段可暂时忽略

2.2 包列表各列含义

列名 含义 示例
No. 第几个包 17
Time 相对抓包开始过了多少秒 7.9
Source 谁发的(源 IP) 10.2.73.219
Destination 发给谁(目的 IP) 114.114.114.114
Protocol 什么协议 ICMP / TCP / DNS
Length 包大小(字节) 74
Info 一句话摘要 Echo (ping) request

Info 常见文字:

Info 文字 含义
Echo (ping) request 你的电脑发出 ping:「在吗?」
Echo (ping) reply 对方回复 pong:「在,收到了」
Destination unreachable (...) 中间设备:「到不了,被拦了」
(no response found!) Wireshark:只看到你发的,没看到回复

2.3 点开单个包:分层结构怎么读

双击某个具体的包可以放大看,上面部分每行左边的箭头点击后可展开看。

层级 名称 看什么
最外层 Frame 抓包元信息(大小、从哪块网卡抓到)
二层 Ethernet II MAC 地址(哪块网卡的硬件地址)
三层 Internet Protocol (IPv4) IP 地址(Source / Destination)
四层 ICMP / TCP / UDP 具体协议内容(ping、握手、DNS 等)

2.4 第一次看包,建议只看 4 个地方

  1. Info --- 一句话总结(最重要)
  2. IP 的 Source / Destination --- 谁发给谁
  3. Protocol --- 什么协议(ICMP / TCP / DNS...)
  4. 最里层 --- ping 看 Type 8/0;报错看 unreachable / prohibited 等

3. 抓包实践------ping 网关

终端 1:

cpp 复制代码
sudo tcpdump -i any icmp -w ~/Desktop/ping-gateway.pcap

终端 2:

bash 复制代码
# 先看网关是谁 以.1结尾
netstat -nr | grep default

# 假设显示网关是 10.2.255.1,就 ping 它
ping -c 4 10.2.255.1

-c 后面要跟「发几个包」的数字。

3.1 详看包列表

终端 1 按 Ctrl+C 停抓,用 Wireshark 打开 ping-gateway.pcap。

bash 复制代码
open -a Wireshark ~/Desktop/ping-gateway.pcap  

顶部过滤器改成:

bash 复制代码
icmp && ip.addr == 10.2.72.1

回车后,应 mainly 看到 8 个包(4 个 request + 4 个 reply)

request 和 reply 的差别:

项目 request(如 No.4) reply(如 No.5)
Source 10.2.73.219(你) 10.2.72.1(网关)
Destination 10.2.72.1(网关) 10.2.73.219(你)
ICMP Type 8 0
Info Echo (ping) request Echo (ping) reply

目前见过的 Info 速查

Info 好/坏 谁发给谁 一句话
Echo (ping) request 正常 你 → 目标 你在 ping
Echo (ping) reply 正常 目标 → 你 ping 通了
Destination unreachable (Fragmentation needed) 异常 路由器 → 你 包太大过不去
Destination unreachable (Host administratively prohibited) 异常 防火墙 → 你 被策略禁止
(no response found!) 异常/未完成 --- 发了 ping 没抓到回复
字段 全称 含义 常见值 / 现象
id Identifier(标识符) 区分是哪一次 ping「会话」 同一次 ping 里,request 和 reply 的 id 相同
seq Sequence(序列号) 第几个 ping 包 第 1 次 ping seq=0,第 2 次 seq=1,依次 +1
ttl Time To Live(生存时间) 包最多还能经过几跳路由 常见 64、128、255;每过一台路由器减 1

3.2 详看单个包:

第 1 层 Frame

字段 含义
Frame Number 第几个包
Interface (en0) 从哪块网卡抓到
Process (ping) 哪个进程发的

第 2 层 Ethernet II

字段 含义
Source 源 MAC(谁发的)
Destination 目的 MAC(发给谁)

第 3 层 IPv4

字段 含义
Source 源 IP
Destination 目的 IP
TTL 还能经过几跳
Protocol 上层协议(ICMP)

第 4 层 ICMP

字段 含义
Type 8=request,0=reply
Identifier (id) 会话标识,request/reply 相同
Sequence Number (seq) 第几次 ping
Response frame 对应 reply 在第几号包

request / reply 对照

字段 request reply
Source IP 10.2.73.219 10.2.72.1
Destination IP 10.2.72.1 10.2.73.219
ICMP Type 8 0
id 相同 相同
seq 相同 相同

4. 抓包实践------curl 抓包

4.1 DNS

目的是看一下域名怎么变成 IP。

终端 1:抓包

bash 复制代码
sudo tcpdump -i any -w ~/Desktop/dns-test.pcap

终端 2:产生流量

bash 复制代码
nslookup www.baidu.com

这里如果设置了代理可能会抓不到dns,可以将代理关了。

bash 复制代码
unset http_proxy https_proxy HTTP_PROXY HTTPS_PROXY all_proxy ALL_PROXY

终端 1: Ctrl + C 停抓

Wireshark 打开分析:

bash 复制代码
open -a Wireshark ~/Desktop/dns-test.pcap

然后进行过滤,输入dns,和之前一样的。

No.450 --- DNS 查询(query)

字段 值 含义
Source 10.2.73.219 你的电脑
Destination 10.2.255.2 DNS 服务器
Protocol DNS 域名解析
Info Standard query ... www.baidu.com 问:这个域名的 IP?

Info 怎么读:

部分 含义
Standard query 标准 DNS 查询
0x2129 查询 ID,用来和回复配对
A 要 A 记录(域名 → IPv4)
www.baidu.com 被查的域名

No.481 --- DNS 回复(response)

字段 值 含义
Source 10.2.255.2 DNS 服务器
Destination 10.2.73.219 你的电脑
Info Standard query response ... 对上面那条 query 的回答
0x2129 和 No.450 相同 说明是同一问一答

Info 里重点:

部分 含义
CNAME www.a.shifen.com www.baidu.com 是别名,真实名字是这个
A 110.242.6... 最终用来连接的 IPv4 地址
多个 A 百度有多个 IP,任选一个连

和 ping 对比(巩固)

项目 ping DNS
目的 测通不通 域名变 IP
协议 ICMP DNS over UDP
层数 4 层 5 层
关键层 ICMP DNS
成对包 request + reply query + response
端口 无 53

仔细看这个包的话其实是有5层的。前3层和前面说的差不多,我们这里着重说一下第4层和第5层。

第 4 层 UDP --- 端口(重要)

字段 含义 query 里 typical
Source Port 源端口 随机(如 57470)
Destination Port 目的端口 53(DNS 固定端口)

记一句:DNS 查问时,目的端口一定是 53。

response 里方向反过来:源端口 53,目的端口是我们自己这边的随机端口。

第 5 层 Domain Name System --- DNS 核心(最重要)

query(No.450)展开后看这些:

字段 含义 你的例子里
Transaction ID 查询编号,和 response 配对 0x2129
Flags: Standard query 这是一个「问」 query
Queries 问什么 www.baidu.com: type A
type A 要 IPv4 地址 要 IP,不是别的

response(No.481)展开后看这些:

字段 含义 你的例子里
Transaction ID 必须和 query 相同 0x2129
Flags: Standard query response 这是一个「答」 response
Queries 当初问的是什么 www.baidu.com
Answers 答案 CNAME → www.a.shifen.com
A 记录 最终 IP(可能多个) 110.242.6.x
  • DNS 阶段:把所有 IP 都告诉你
  • 连接阶段:通常只连其中一个
  • 若连不上,可能再试列表里的另一个

4.2 TCP 三次握手 + 四次挥手

终端 1:开始抓包

bash 复制代码
sudo tcpdump -i any -w ~/Desktop/tcp-http.pcap

看到 listening on any... 就说明在抓了。先开着别关。

终端 2:关掉代理,再 curl

bash 复制代码
# 若出现 Uses proxy 或 Connection to 127.0.0.1,说明还在走代理,要先 unset 再试。
unset http_proxy https_proxy HTTP_PROXY HTTPS_PROXY all_proxy ALL_PROXY

curl -v http://www.example.com

curl 成功的话,终端里应能看到类似:

bash 复制代码
* Host www.example.com:80 was resolved.

* Connected to www.example.com (93.184.216.34) port 80

> GET / HTTP/1.1

< HTTP/1.1 200 OK

终端 1:停抓 : 按 Ctrl + C。

打开 Wireshark

bash 复制代码
open -a Wireshark ~/Desktop/tcp-http.pcap
  • 服务器一般是 80(HTTP)
  • 我们自己这边是随机高端口(如 52341、57470),每次 curl 可能不同

顶部过滤器输入:

bash 复制代码
tcp.port == 80

三次握手:

然后看 Info 字段,找连续 3 个包,对应经典tcp三次握手的三步:

bash 复制代码
第 1 步 SYN 你 → 服务器 「我想连你」

第 2 步 SYN, ACK 服务器 → 你 「好,我也准备好了」

第 3 步 ACK 你 → 服务器 「收到,连上了」

对应图中就是159、166、167这三个包。主要说一下包的第4层TCP层。

字段 含义
Source Port 源端口(你这边多为随机,如 57872)
Destination Port 目的端口(HTTP 为 80,HTTPS 为 443)
Sequence Number (Seq) 序列号
Acknowledgment Number (Ack) 确认号
Flags SYN / ACK / FIN(判断握手、挥手)
Len 数据长度(握手时常为 0)

四次挥手:

Wireshark 里常把 FIN 和 ACK 合在一包 里显示为 [FIN, ACK],所以:

  • 理论上 4 次:FIN、ACK、FIN、ACK
  • 界面上可能 3~4 个包,且带 FIN 的通常就 2 个(你发一次、服务器发一次)

认法: 找两个带 FIN 的包(方向相反),前后再配上 ACK,就是挥手。

需要详细看的包字段和前面一样。

4.3 HTTP

发 HTTP 请求:168

包号 Info 含义
168 HTTP GET / HTTP/1.1 curl 请求首页

这就是 curl 在说:「把网站首页给我。」

收响应:173

包号 Info 含义
173 HTTP/1.1 200 OK 服务器返回成功和网页内容

200 OK = 请求成功。

请求包详情:

这里相对于tcp多了一层http层。

1. 请求行:GET / HTTP/1.1

部分 含义
GET 方法:获取资源(要网页,不是提交表单)
/ 路径:网站根目录首页
HTTP/1.1 协议版本

合起来:用 HTTP/1.1,GET 方式,要 www.example.com 的首页。

2. Host: www.example.com

和浏览器地址栏里的域名对应。

3. User-Agent: curl/8.4.0

  • 告诉服务器:我是 curl 8.4.0,不是 Chrome/Safari
  • 服务器有时会按不同客户端返回不同内容(初学知道即可)

4. Accept: */*

  • 表示:什么类型的内容我都能接受(*/* = 任意类型)

5. Wireshark 提示

Response in frame: 173

Full request URI: http://www.example.com/

  • 回复在 173 号包
  • 完整 URL 是 http://www.example.com/

响应包详情:

下面是响应包,对比请求多出来了两块

1. [2 Reassembled TCP Segments (873 bytes): #172(868), #173(5)]

含义:TCP 重组信息(Wireshark 算的,不是线上协议)

bash 复制代码
完整 HTTP 响应 = 873 字节

    ├─ No.172 带了 868 字节

    └─ No.173 带了 5 字节

TCP 只管按序传字节,一个 HTTP 响应可以拆成多个 TCP 包。Wireshark 把 #172 和 #173 拼回一条完整 HTTP 消息,并提示你:

提示项 含义
2 Reassembled TCP Segments 由 2 个 TCP 包拼成
873 bytes 拼完一共 873 字节
#172(868) 第 1 段在 172 号包,868 字节
#173(5) 第 2 段在 173 号包,5 字节

下面十六进制若以 48545450 开头,ASCII 就是 HTTP,说明拼出来的是完整 HTTP 响应。

为什么请求 168 没有: GET 只有 78 字节,一个 TCP 包就够,不需要重组。

2. Line-based text data: text/html

含义:HTTP 正文(网页 HTML)的展示方式

HTTP 响应分两部分:

bash 复制代码
HTTP/1.1 200 OK ← 响应头(状态、类型等)
Content-Type: text/html
(空行)
<!doctype html>... ← 正文(HTML)

Wireshark 常把响应拆成两块显示:

展示块 内容
Hypertext Transfer Protocol 状态行 + 响应头(200 OK、Content-Type 等)
Line-based text data: text/html 正文里的 HTML 文本

text/html 表示:按网页 HTML 来解析;1 lines 等是 Wireshark 对行数的统计。

为什么请求 168 没有: GET 只有请求头,几乎没有 body,所以没有「一整段 HTML 正文」可单独展开。

到目前为止已经尝试过tcpdump 抓包、Wireshark 看包、ICMP/DNS/TCP/HTTP 基本字段、三次握手与四次挥手、Seq/Ack、HTTP 请求响应、TCP 重组。