第 7 章 · 07 抓真相:`tcpdump`


文档摘要

第 7 章 · 07 抓真相: 本节摘要:这是本章的终极武器。当 、 、 都告诉你「连不上」,却说不出「数据包到底在哪一环丢了」,就该上 了。它直接抓取网卡上的原始数据包,让你看到「握手到哪一步断了」「连接是被谁重置的」「数据到底有没有发出去」。本节要带你读懂 tcpdump 的基本用法(抓哪个网卡、过滤什么),并重点带你看懂一次完整的 TCP 三次握手在抓包里的样子——这是理解「连接建立」最直观的方式。 内容来源:综合 知识整理,套用体系化模板。 学习目标 阅读完本节,你应当能够: 用 在指定网卡抓包,理解为什么要选对网卡。 用过滤表达式( / / / / )缩小抓包范围,过滤噪音。 用 不反解(快)、 限定包数、 存盘供图形工具分析。

第 7 章 · 07 抓真相:tcpdump

本节摘要:这是本章的终极武器。当 pingcurlss 都告诉你「连不上」,却说不出「数据包到底在哪一环丢了」,就该上 tcpdump 了。它直接抓取网卡上的原始数据包,让你看到「握手到哪一步断了」「连接是被谁重置的」「数据到底有没有发出去」。本节要带你读懂 tcpdump 的基本用法(抓哪个网卡、过滤什么),并重点带你看懂一次完整的 TCP 三次握手在抓包里的样子——这是理解「连接建立」最直观的方式。

内容来源:综合 tcpdump 知识整理,套用体系化模板。

学习目标

阅读完本节,你应当能够:

  1. tcpdump -i eth0 在指定网卡抓包,理解为什么要选对网卡。
  2. 用过滤表达式(host/port/and/or/not)缩小抓包范围,过滤噪音。
  3. -n 不反解(快)、-c N 限定包数、-w 存盘供图形工具分析。
  4. 读懂一次完整的 TCP 三次握手在 tcpdump 输出里的样子(Flags: S, S., .)。
  5. 说清为什么 tcpdump 通常是「最后手段」(信息量大、需 root、生产环境小心)。

一、设计动机:tcpdump 看的是「数据包真相」

前面所有工具(ping/curl/ss)都是「站在应用层问网络」,它们告诉你「结果」(通/不通),但说不出「过程里哪一步出了问题」。比如:

  • curlConnection reset by peer——谁重置的?在哪一步?
  • 服务「时连得上时连不上」——是握手丢了?还是数据传输丢了?
  • 怀疑被防火墙挡——包到底有没有发出去?对方有没有回?

这些问题只有「看数据包本身」才能回答。tcpdump 利用内核的抓包能力(底层是 libpcap/BPF),把流经网卡的每个包打印出来——它看到的是网络世界的「原始真相」,没有任何应用层的粉饰。

二、高频组合与实战

基本抓包

tcpdump # 抓默认网卡(往往是 eth0), 输出很多 tcpdump -i eth0 # 显式指定网卡(推荐) tcpdump -i any # 抓所有网卡 tcpdump -D # 列出所有可用网卡(不知道网卡名时先查这个)

必加的过滤(否则输出淹没你)

tcpdump -i eth0 host 8.8.8.8 # 只抓与 8.8.8.8 通信的包 tcpdump -i eth0 port 80 # 只抓 80 端口(HTTP) tcpdump -i eth0 host 8.8.8.8 and port 53 # 组合: 与 8.8.8.8 的 53 端口(DNS) tcpdump -i eth0 not port 22 # 排除 SSH(否则你的连接本身产生海量包)

常用选项

tcpdump -n # -n: 不反解 IP/端口为名字(快, 推荐) tcpdump -nn # -nn: 连端口也不反解 tcpdump -c 20 # 抓 20 个包就停(否则一直抓) tcpdump -w capture.pcap # 存成 pcap 文件, 之后用 Wireshark 图形分析 tcpdump -r capture.pcap # 读取之前存的 pcap

💡 技巧:抓包用 -w 存成 .pcap,下载到本地用 Wireshark 图形分析——这是生产排查的标准流程。tcpdump 命令行看实时流量,Wireshark 看历史细节,两者配合最强。

三、读懂 TCP 三次握手

这是本节最有价值的部分——带你看懂一次连接建立时,tcpdump 输出长什么样。

假设执行 curl http://example.com,同时 tcpdump -i eth0 -n port 80 host example.com,你会看到类似:

10:00:01.123 192.168.1.10.54321 > 93.184.216.34.80: Flags [S], seq 1234567, win 64240, ... 10:00:01.135 93.184.216.34.80 > 192.168.1.10.54321: Flags [S.], seq 9876543, ack 1234568, win 65535, ... 10:00:01.135 192.168.1.10.54321 > 93.184.216.34.80: Flags [.], ack 9876544, win 64240, ...

这就是 TCP 三次握手:

客户端 服务器 │ │ │── Flags [S] ──────>│ 第1次: SYN(我想连接), seq=客户端初始序号 │ │ │<── Flags [S.] ─────│ 第2次: SYN+ACK(同意, 我也想连接), seq=服务器序号, ack=确认 │ │ │── Flags [.] ──────>│ 第3次: ACK(确认你的同意), 连接建立 │ │

Flags 含义:

  • [S](SYN):请求建立连接。
  • [S.](SYN+ACK):同意建立并回应(. 表示 ACK 位)。
  • [.](ACK):确认。
  • [P.](PSH+ACK):有数据要传。
  • [F.](FIN+ACK):请求关闭连接。
  • [R.](RST):重置连接(异常关闭,「Connection reset」就是它)。

排查意义:如果抓包只看到 [S] 发出去,没有 [S.] 回来——说明服务器没回 SYN+ACK,可能是包丢了、或服务器没监听、或被防火墙默默丢弃。如果回了 [R.]——说明服务器主动拒绝(端口没开)。这些「过程信息」是 curl/ss 给不了的。

四、踩坑与排错

坑 1:抓 SSH 流量把自己淹没

tcpdump -i eth0 # 你的 SSH 连接本身产生海量包, 淹没一切 tcpdump -i eth0 not port 22 # 排除 SSH!

远程登录服务器抓包,务必 not port 22 排除自己的连接,否则满屏都是你自己的流量。

坑 2:不知道网卡名,抓了空

tcpdump -D # 先列出所有网卡 # 可能是 eth0, ens33, wlan0... 确认后再 -i 指定

坑 3:生产环境长时间抓包

tcpdump -i eth0 -c 100 # 限 100 个包(推荐) tcpdump -i eth0 -w cap.pcap -c 1000 # 存盘 + 限量

不限量的抓包会写满磁盘(高流量机器几秒就 GB),且 tcpdump 在高负载网卡上有性能影响。生产抓包务必 -c 限量或用 timeout:timeout 10 tcpdump -i eth0 -w cap.pcap

坑 4:看不懂 Flags 看不懂一切

记住几个关键 Flag:S(SYN,建连)、F(FIN,关闭)、R(RST,重置)、P(PSH,数据)、.(ACK,确认)。看到 [R] 就知道是异常重置,看到一堆 [S] 没回应就知道是丢包。这是读 tcpdump 的基础词汇。

本节要点回顾

  1. tcpdump 抓取网卡的原始数据包,看到的是网络世界的「真相」,是所有上层工具失效时的最后手段。
  2. 必加过滤:-i 网卡 选网卡、host/port/and/or/not 缩小范围、not port 22 排除 SSH 自身流量。
  3. -n 不反解(快)、-c N 限量、-w file.pcap 存盘;生产抓包务必限量,推荐 -w 存 pcap 用 Wireshark 分析。
  4. Flags 是读 tcpdump 的基础词汇:S(SYN 建连)、S.(SYN+ACK)、.(ACK 确认)、F(FIN 关闭)、R(RST 重置)、P(PSH 数据)。
  5. 三次握手在抓包里:[S][S.][.];只发 [S] 没回 = 丢包/没监听;回 [R] = 端口没开被拒。
  6. 生产环境小心:不限量抓包会写满磁盘,用 -c/timeout 限量。

本章「网络与连通性」全部讲完。从看本机(ip/ss)到测链路(ping)到测服务(curl/wget)到远程(ssh)到抓包(tcpdump)——你拥有了一条完整的「自底向上」网络排查链路。下一章讲服务管理,让你能把程序变成开机自启、定时运行的生产服务。


发布者: 作者: 灏天文库 转发
评论区 (0)
U