当前位置: 首页 > news >正文

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

1. TLS

我们学过 HTTP 明文,这个TLS 可以当成:同一件事,只是内容被锁进保险箱里了。

之前 curlhttp://www.example.com时:

  • 连的是 80 端口
  • Wireshark 里能直接看到GET / HTTP/1.1200 OK

如果改成https://

  • 连的是 443 端口
  • 数据先 加密,再放进 TCP
  • Wireshark 看不到 GET 和网页,只能看到 TLS 和 Application Data

HTTP: 明信片,谁都能读

HTTPS: 封信封,里面写了什么抓包看不到

TLS: 就是那只信封和锁

1.1 抓包 + 查看

平台说明:下文-i any用于 Linux,可同时监听所有接口。macOS 请先执行tcpdump -D查看接口,再把any替换为实际接口;普通网络流量通常选择en0,本机回环实验选择lo0,具体以本机列表和目标流量为准。

终端 1:开始抓 443

sudo tcpdump -i any -nn -s 0 -w ~/Desktop/https-beginner.pcap port 443

只抓 443,比抓全部包干净很多。

终端 2:关掉代理,访问 HTTPS

unset http_proxy https_proxy HTTP_PROXY HTTPS_PROXY all_proxy ALL_PROXY curl -v https://www.example.com

curl 之后会出现一个ip,大概在如下位置:

用Wireshark打开刚刚的这个.pcap包,然后在顶部过滤刚刚你查出来的这个IP。

可以看到如下三个点:

  • Protocol 多是 TLS 或 TLSv1.2 / TLSv1.3
  • Source/Destination 是你的电脑和 example 服务器来回
  • 端口 一边是自己,另一边是 443

总过程为4段:

  • No.8–10 TCP 三次握手(先接通 443)
  • No.11–20 TLS 握手(商量加密、交换证书、切换密文)
  • No.21–34 加密传数据(Application Data,里面是 HTTP)
  • No.35–39 TCP 四次挥手(断开连接)

1.2 找 TLS 握手

包号过程

11

Client Hello:你开始 TLS 握手,声明访问www.example.com(SNI)

14

TCP ACK:服务器确认收到 Client Hello

15

Server Hello + Change Cipher Spec:服务器选定加密方式,并通知后续改用密钥加密

16–17

服务器继续发握手内容(证书、握手结束等,TLS 1.3 中常已加密或打包)

18–19

你发 TCP ACK,确认收到服务器握手数据

20

Change Cipher Spec:你这边也切换为加密通信,TLS 握手基本完成

这一阶段: 在 TCP 之上建立 HTTPS 安全通道,还没传(或刚开始传)业务网页数据。

过滤条件再加一个 tls.handshake 。

版本说明:下面是便于入门理解的通用握手名称。TLS 1.2 与 TLS 1.3 的具体消息和可见性不同;本次抓包以 Wireshark 实际显示为准,不要求在 TLS 1.3 中逐项看到 Server Hello Done 或 Client Key Exchange。

直接看 Info 字段:

Info谁发给谁白话解释

Client Hello

你 → 服务器

我想用 HTTPS 连你,我支持这些加密方式

Server Hello

服务器 → 你

好,我们用这一种加密

Certificate

服务器 → 你

这是我的证书,证明我是正规网站

Server Hello Done

服务器 → 你

我这边说完了

Client Key Exchange 等

你 → 服务器

交换密钥(细节可先不管)

Change Cipher Spec

双方

后面开始加密

Encrypted Handshake Message

双方

加密的握手收尾

Client Hello 包:

SNI 里通常是访问的域名。

含义:虽然 HTTP 还没开始传,但客户端会先告诉服务器「我要访问www.example.com」。

这是 HTTPS 抓包里少数还能直接看到域名的字段之一。

此时还没有传 HTTP GET,只是在商量怎么加密。

Change Cipher Spec(切换加密)

含义: 通知对方:

从下一刻起,后面数据都用刚商量好的密钥加密

就像双方说好密码后说:好,从现在开始用这套密码说话。

界面上可能写 Version: TLS 1.2 (0x0303),这是兼容写法,你这次整体仍是 TLS 1.3,不用纠结这个显示。

1.3 加密业务数据

包号过程

21、22、23、25、27–30、33、34

Application Data:加密的 HTTP 请求、响应和网页内容

24、26、31、32

TCP ACK:确认上面数据已收到

这一阶段: 真正的 HTTPS 访问发生在这里。里面是 GET、200 OK、HTML,但被 TLS 加密,Wireshark 只能显示 Application Data。

1.4 和 HTTP 明文对照

之前学过的 HTTP(80 端口)

TCP 三次握手 ↓ 明文 HTTP GET(Wireshark 直接看到) ↓ 明文 HTTP 200 OK + HTML(Wireshark 直接看到) ↓ TCP 四次挥手

现在的 HTTPS(443 端口)

TCP 三次握手(和 HTTP 一样,还是 TCP) ↓ TLS Client Hello / Server Hello / Certificate...(多出来的 TLS 握手) ↓ TLS Application Data(加密的 GET,看不见) ↓ TLS Application Data(加密的 200 OK + HTML,看不见) ↓ TCP 四次挥手

多出来的就是 TLS 握手 + 全程加密。

2. tcpdump常见命令

1. 基础结构

sudo tcpdump [选项] [过滤表达式]

抓包一般要sudo。不写过滤表达式 = 抓所有流量(噪音大,初学建议加过滤)。

2. 最常用选项

选项含义示例

-i any

指定网卡,any为所有网卡

tcpdump -i en0

-w 文件.pcap

保存到文件(给 Wireshark)

-w ~/Desktop/out.pcap

-r 文件.pcap

读已有 pcap(不抓新包)

tcpdump -r out.pcap

-c 数字

抓满 N 个包就停

-c 100

-n

不把 IP 转成主机名

输出更快、更干净

-nn

不把 IP、端口转成名字

推荐常用

打开已存在的 .pcap 包进行查看,如 ping-gateway.pcap 。

步骤 1:终端中 只看 ICMP

tcpdump -r ~/Desktop/ping-gateway.pcap -nn icmp

你应该看到类似:

10.2.73.219 > 10.2.72.1: ICMP echo request 10.2.72.1 > 10.2.73.219: ICMP echo reply

顺便看一下加 -nn 和不加 -nn 的区别。

中间可能夹杂unreachable报错,正常。

步骤 2:终端中 只看和网关有关的

tcpdump -r ~/Desktop/ping-gateway.pcap -nn host 10.2.72.1

只保留和10.2.72.1有关的包,噪音少很多。

# 出现类似如下结果 reading from PCAP-NG file /Users/liyijun/Desktop/ping-gateway.pcap 13:53:35.444034 IP 10.2.73.219 > 10.2.72.1: ICMP echo request, id 4782, seq 0, length 64 13:53:35.453132 IP 10.2.72.1 > 10.2.73.219: ICMP echo reply, id 4782, seq 0, length 64 13:53:36.449209 IP 10.2.73.219 > 10.2.72.1: ICMP echo request, id 4782, seq 1, length 64 13:53:36.454207 IP 10.2.72.1 > 10.2.73.219: ICMP echo reply, id 4782, seq 1, length 64 13:53:37.454194 IP 10.2.73.219 > 10.2.72.1: ICMP echo request, id 4782, seq 2, length 64 13:53:37.477599 IP 10.2.72.1 > 10.2.73.219: ICMP echo reply, id 4782, seq 2, length 64 13:53:38.456592 IP 10.2.73.219 > 10.2.72.1: ICMP echo request, id 4782, seq 3, length 64 13:53:38.468613 IP 10.2.72.1 > 10.2.73.219: ICMP echo reply, id 4782, seq 3, length 64

在Wireshark中其实就是如下的过滤条件(之前演示过,很好理解):

icmp ip.addr == 10.2.72.1 icmp && ip.addr == 10.2.72.1

如果要捕捉指定端口,在tcpdump里直接使用port 端口号就行。

比如打开之前捕捉百度dns解析过程的文件进行演示:

tcpdump -r ~/Desktop/dns-test.pcap -nn port 53
# 结果如下 reading from PCAP-NG file /Users/liyijun/Desktop/dns-test.pcap 15:34:16.634264 IP 10.2.73.219.57470 > 10.2.255.2.53: 8489+ A? www.baidu.com. (31) 15:34:16.648031 IP 10.2.255.2.53 > 10.2.73.219.57470: 8489* 3/0/0 CNAME www.a.shifen.com., A 110.242.69.21, A 110.242.70.57 (138)

但是在Wireshark里不能直接用port字段,需要指定是tcp还是udp,dns是udp,所以要输入的过滤条件是:

udp.port == 53

若tcp也要,那就在顶部同时过滤:

udp.port == 53 || tcp.port == 53

-v/-vv/-vvv

更详细输出

终端直接看时用

-A

以 ASCII 显示包内容

看明文 HTTP 等

-X

十六进制 + ASCII

-A更全

-s 0

抓完整包(默认可能截断)

生产环境建议加上

-s 0是 tcpdump 的抓包长度选项,意思是每个包都完整抓取,不截断。

  • -s:snaplen,单个包最多抓多少字节
  • 0:不限制,抓整包

常见用法:

sudo tcpdump -i any -nn -s 0 -w ~/Desktop/capture.pcap

抓包存文件时习惯加上-s 0,保证 pcap 里是完整包。读已有文件用-r时一般不需要再加-s 0

3. 常见抓包组合(可直接复制)

抓所有包,存文件

sudo tcpdump -i any -w ~/Desktop/all.pcap

只抓某种协议的包,如 ICMP(ping)

sudo tcpdump -i any icmp -w ~/Desktop/ping.pcap

只抓 50 个包( -c 选项后面加数字)

sudo tcpdump -i any -c 50 -w ~/Desktop/test.pcap

终端直接看,不存文件(如 ping )

sudo tcpdump -i any -nn icmp

抓完整包 + 不解析名字

sudo tcpdump -i any -nn -s 0 -w ~/Desktop/full.pcap

4. 过滤表达式(重点)

按主机

和某 IP 有关的所有包(源或目的)

sudo tcpdump -i any host 10.2.72.1

只抓源是该 IP

sudo tcpdump -i any src host 10.2.73.219

只抓目的是该 IP

sudo tcpdump -i any dst host 172.66.147.243

按网段

整个网段

sudo tcpdump -i any net 10.2.73.0/24

按端口

端口 80(HTTP)

sudo tcpdump -i any port 80

端口 443(HTTPS)

sudo tcpdump -i any port 443

源端口 / 目的端口

sudo tcpdump -i any src port 57872 sudo tcpdump -i any dst port 80

按协议

sudo tcpdump -i any tcp sudo tcpdump -i any udp sudo tcpdump -i any icmp

组合(与 / 或 / 非)

某 IP 的 TCP

sudo tcpdump -i any host 172.66.147.243 and tcp

80 或 443

sudo tcpdump -i any port 80 or port 443

排除某 IP

sudo tcpdump -i any not host 127.0.0.1

某 IP 的 HTTP(端口80)

sudo tcpdump -i any host 172.12.32.78 and port 80

TCP 标志(进阶)

SYN 包(握手第一步)

sudo tcpdump -i any 'tcp[tcpflags] & tcp-syn != 0'

# SYN 且非 ACK(纯 SYN)

sudo tcpdump -i any 'tcp[tcpflags] & tcp-syn != 0 and tcp[tcpflags] & tcp-ack == 0'


5. 读已有 pcap

读文件并过滤

tcpdump -r 文件路径/文件名.pcap port 80

读文件,只看前 20 个

sudo tcpdump -r 文件路径/文件名.pcap -c 20

读文件,ASCII 显示 HTTP

tcpdump -r ~/Desktop/tcp-http.pcap -A port 80

6. tcpdump 与 Wireshark 过滤对照

目的tcpdumpWireshark

某 IP

host 10.2.72.1

ip.addr == 10.2.72.1

源 IP

src host 10.2.73.219

ip.src == 10.2.73.219

端口 80

port 80

tcp.port == 80

只要 TCP

tcp

tcp

只要 ICMP

icmp

icmp

只要 DNS

port 53

dns

3. Wireshark 常见显示过滤器

显示过滤器只在已经抓好的 pcap 里筛选,不改变抓包内容。语法错了会红色,对了是绿色。

1. 逻辑运算符

符号含义示例

&&and

并且

tcp and port 80

||or

或者

port 80 or port 443

!not

not arp

2. IP 相关

源或目的包含该 IP

ip.addr == 10.2.73.21

源 IP

ip.src == 10.2.73.21

目的 IP

ip.des == 10.2.34.56

某网段(部分版本支持)

ip.addr == 10.2.73.0/24

3. 端口与协议

过滤协议的话直接输入就行:

tcp # 所有 TCP udp # 所有 UDP icmp # 所有 ICMP dns # DNS http # HTTP(明文) tls # TLS/HTTPS

过滤端口需要指定协议:

tcp.port == 80 # TCP 端口 80 tcp.port == 443 # HTTPS tcp.srcport == 57872 # 源端口 tcp.dstport == 80 # 目的端口 udp.port == 53 # DNS 端口

4. TCP 标志(握手 / 挥手 / 异常)

  • 含 SYN:tcp.flags.syn == 1
  • 含 ACK:tcp.flags.ack == 1
  • 含 FIN(挥手):tcp.flags.fin == 1
  • RST(连接被拒或重置):tcp.flags.reset == 1
  • 纯 SYN(握手第 1 步):tcp.flags.syn == 1 && tcp.flags.ack == 0
  • SYN+ACK(握手第 2 步):tcp.flags.syn == 1 && tcp.flags.ack == 1

5. DNS

  • 下面的 qry专门指 query 部分 的字段
  • 只显示 查询域名里包含 baidu 的 DNS 包:dns.qry.name contains "baidu"
  • 只显示 DNS 查询里,域名完全等于www.example.com的包:dns.qry.name == "www.example.com"
  • 只要 query:dns.flags.response == 0
  • 只要 response:dns.flags.response == 1

6. HTTP(明文)

  • http
  • http.request # 只要请求
  • http.response # 只要响应
  • 只看请求方法为 GET:http.request.method == "GET"
  • Host 头包含 example 的请求或响应:http.host contains "example"
  • 只看 HTTP 响应状态码是 200 的包:http.response.code == 200
  • 4xx、5xx 错误:http.response.code >= 400

7. HTTPS / TLS

  • tls
  • Client Hello: tls.handshake.type == 1
  • Server Hello:tls.handshake.type == 2
  • tcp.port == 443 && tls

8. Wireshark 实用操作(非过滤,但常用)

操作作用

右键包 → Follow → TCP Stream

看一次 TCP 会话完整内容

右键包 → Follow → HTTP Stream

看 HTTP 请求+响应全文

Statistics → Conversations

看哪些 IP/端口通信最多

点击包 → Response in frame / Request in frame

跳到配对的请求/响应


4. 按场景选命令(速查)

场景tcpdump 抓包Wireshark 查看

ping 网关

tcpdump -i any icmp -w ping.pcap

icmp && ip.addr == 网关IP

DNS 查询

tcpdump -i any port 53 -w dns.pcap

dns

HTTP 访问

tcpdump -i any port 80 -w http.pcap

tcp.port == 80然后http

HTTPS 访问

tcpdump -i any port 443 -w https.pcap

tcp.port == 443然后tls

排查连不上

tcpdump -i any host 目标IP -w fail.pcap

tcp.flags.reset == 1

减少噪音

抓包时就加host/port

!ip.addr == 127.0.0.1

http://www.jsqmd.com/news/1392955/

相关文章:

  • 常州GEO服务公司推荐选型指南:六大维度横评帮你选对不踩坑 - 趣闻早乐评
  • 从简历到Offer:Java面试准备的实用方法
  • 【技术地图】OLED 专题调研 · 文章索引
  • 宿州市2026年最新电大中专报考详解! - 我叫小周
  • 名包回收18332179539 2026邯郸二手箱包交易指南 京津冀小强 - 京津冀小强
  • 毫米波雷达实时可视化完全指南:Python轻松读懂AWR1843
  • 公证和认证是一起做吗?不清楚办理流程,慧办好带您分清两个环节 - 信息快递
  • HackRF频谱分析仪完整评测:从零上手到横向对比,一文搞懂这款开源神器
  • 从 33GB 到 5GB:这款多线程微信清理工具,帮你安全告别缓存堆积
  • 出境租车自驾必看:驾照公证有效期是多久?办理步骤说明与避坑要点 - 信息快递
  • 【大模型应用开发-ES】(七)ElasticSearch全文搜索
  • 2026 安徽奢石板材源头供应商选型指南:环保等级、花色丰富度与源头直供优势对比 - 中国华商产业观察网
  • 驾照公证怎么办理?驾照公证如何一步办理?平台全解析! - 信息快递
  • 婴童蛋黄油精华霜哪家好:【蜜妙诗】安护脆弱肤底 - 18002239949
  • PDF分割工具Coolutils PDF Splitter
  • 三步搞定老游戏兼容修复:dxwrapper 让二十年老游戏在 Win11 上丝滑运行
  • 安卓15_ROM修改定制化_____隐藏或禁用设置中的特定选项 自定义设置app
  • 福州装修公司推荐装修指南:为什么我最终选了万鹏装饰而不是散装施工 - 米諾
  • 2026年新发布:深圳房地产价格评估机构推荐转让处置要算账,资产评估不能瞎估量-广正资产价格评估 - 行业甄选汇
  • Wand-Enhancer 实战手册:免费解锁 Wand 高级功能,从一键补丁到手机远程控制全掌握
  • CPS三级心理咨询师首考收官 广州社心公益协会300人赴考 - 趣闻早乐评
  • scrcpy 投屏指南:三步实现电脑控制手机的快速无缝互联
  • AI Agent 面试题 433:Agent的对话上下文中的实体追踪和引用消解
  • 2026年南京一日游口碑最好的旅行社**正规,老牌本地地接社,暑期中转游客无强制消费综合测评优选 - 跟我去旅游
  • 婴童蛋黄油精华霜哪家好:【蜜妙诗】修护外界损伤 - 17328623207
  • 婴童蛋黄油精华霜哪家好:【蜜妙诗】持养表层油润 - 18102756859
  • 加油站大姐的一句话,让我重新算了油钱
  • 工业厂房机电装修工程公司哪家性价比高?专业服务与质量把控要点 - 选型|行业|价格|案例
  • 语音输入不能只看识别准确率:从按键到可用文本的 8 个交互指标
  • LS-DYNA用于复合材料抗冲击分析方面的应用总结--Part 2 材料篇