AI摘要

本文详细介绍了Linux下强大的命令行抓包工具tcpdump的使用方法,包括安装、基本语法、查看网络接口、过滤表达式详解、常用抓包场景、实战排查TCP连接问题、读懂tcpdump输出、配合Wireshark深度分析以及权限说明。通过掌握tcpdump的核心用法,结合Wireshark进行可视化分析,可以应对几乎所有网络层面的问题定位。

Linux tcpdump 抓包实战:从入门到分析

网络问题排查时,抓包是最直接有效的手段。tcpdump 是 Linux 下最强大的命令行抓包工具,本文从安装到实战分析,系统介绍其使用方法。

安装 tcpdump

大多数 Linux 发行版默认已安装,可先检查:

tcpdump --version

若未安装,根据发行版执行:

# Debian / Ubuntu
sudo apt install tcpdump

# CentOS / RHEL / Rocky Linux
sudo yum install tcpdump
# 或
sudo dnf install tcpdump

# Alpine
apk add tcpdump

基本语法

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

常用选项:

选项说明
-i <网卡>指定监听网卡,any 表示所有网卡
-n不解析主机名,直接显示 IP
-nn不解析主机名和端口名
-v / -vv / -vvv详细程度,层层递增
-c <数量>捕获指定数量的包后退出
-w <文件>将数据包写入 .pcap 文件
-r <文件>从 .pcap 文件读取并分析
-s <字节>捕获每个包的字节数,0 表示完整包
-A以 ASCII 显示包内容(适合 HTTP)
-X以十六进制 + ASCII 显示包内容
-e显示链路层头部(MAC 地址)
-t不显示时间戳
-l行缓冲模式,配合管道使用

查看网络接口

在抓包前,先确认本机有哪些网卡:

tcpdump -D
# 或
ip link show

输出示例:

1.eth0
2.lo
3.any

过滤表达式详解

tcpdump 使用 BPF(Berkeley Packet Filter)语法,灵活强大。

按主机过滤

# 过滤所有与 192.168.1.1 通信的包
tcpdump -i eth0 host 192.168.1.1

# 只看来自某 IP 的包
tcpdump -i eth0 src host 192.168.1.1

# 只看发往某 IP 的包
tcpdump -i eth0 dst host 192.168.1.1

按端口过滤

# 过滤 80 端口(HTTP)
tcpdump -i eth0 port 80

# 过滤 443 端口(HTTPS)
tcpdump -i eth0 port 443

# 过滤端口范围
tcpdump -i eth0 portrange 8000-9000

# 过滤来源端口
tcpdump -i eth0 src port 22

按协议过滤

tcpdump -i eth0 tcp
tcpdump -i eth0 udp
tcpdump -i eth0 icmp
tcpdump -i eth0 arp

逻辑组合

# AND
tcpdump -i eth0 host 192.168.1.1 and port 80

# OR
tcpdump -i eth0 port 80 or port 443

# NOT
tcpdump -i eth0 not port 22

# 复杂组合(用括号分组,需转义或加引号)
tcpdump -i eth0 'host 192.168.1.1 and (port 80 or port 443)'

按网段过滤

tcpdump -i eth0 net 192.168.1.0/24

常用抓包场景

1. 抓取 HTTP 明文请求

tcpdump -i eth0 -A -nn port 80

-A 以 ASCII 输出,可以直接看到 HTTP 请求/响应头和 Body。

2. 抓取 DNS 查询

tcpdump -i eth0 -nn port 53

3. 抓取与某主机的 TCP 握手

tcpdump -i eth0 -nn 'host 10.0.0.1 and tcp'

查看 SYN、SYN-ACK、ACK 三次握手过程。

4. 只抓 ICMP(ping)

tcpdump -i eth0 icmp

5. 排除 SSH 避免干扰

远程操作时 SSH 流量会污染抓包结果:

tcpdump -i eth0 -nn not port 22

6. 保存抓包文件

# 抓 100 个包并保存
tcpdump -i eth0 -nn -c 100 -w /tmp/capture.pcap

# 抓取指定时长(配合 timeout 命令)
timeout 30 tcpdump -i eth0 -nn -w /tmp/capture.pcap

# 按文件大小切割:每 10MB 生成新文件
tcpdump -i eth0 -nn -C 10 -w /tmp/cap.pcap

7. 分析已有的 pcap 文件

# 读取并显示
tcpdump -r /tmp/capture.pcap

# 读取时加过滤
tcpdump -r /tmp/capture.pcap port 80

# 详细输出
tcpdump -r /tmp/capture.pcap -nn -vv

实战:排查 TCP 连接问题

以访问某服务(如 10.0.0.5:8080)失败为例:

tcpdump -i eth0 -nn 'host 10.0.0.5 and port 8080'

常见现象与含义:

现象说明
只有 SYN,没有 SYN-ACK服务端未监听该端口,或防火墙拦截
有 SYN-ACK,但随即 RST服务端拒绝连接
有 ACK,但数据迟迟不来服务端处理慢,可能是性能问题
出现大量重传(Retransmission)网络丢包严重

读懂 tcpdump 输出

一行典型输出:

14:23:01.234567 IP 192.168.1.10.52341 > 10.0.0.1.80: Flags [S], seq 1234567890, win 65535, length 0

字段解释:

  • 14:23:01.234567 — 时间戳(精确到微秒)
  • IP — 网络层协议
  • 192.168.1.10.52341 — 源 IP:端口
  • 10.0.0.1.80 — 目标 IP:端口
  • Flags [S] — TCP 标志位
  • seq — 序列号
  • win — 窗口大小
  • length — 数据载荷长度

TCP Flags 对照表:

标志含义
[S]SYN(建立连接)
[S.]SYN-ACK
[.]ACK
[P.]PSH+ACK(推送数据)
[F.]FIN(正常关闭)
[R]RST(强制重置)

配合 Wireshark 深度分析

命令行查看终究不够直观,生产环境通常的做法是:

  1. 在服务器上用 tcpdump 将数据包保存为 .pcap 文件
  2. 将文件传输到本地
  3. 用 Wireshark 打开进行可视化分析
# 服务器端抓包
tcpdump -i eth0 -nn -w /tmp/capture.pcap

# 传输到本地(Mac/Linux)
scp user@server:/tmp/capture.pcap ~/Downloads/

Wireshark 有以下实用功能:

  • Follow TCP Stream:还原完整 TCP 会话,一键查看完整 HTTP 请求响应
  • Statistics → IO Graph:流量图,一眼看出流量波峰
  • Expert Info:自动标注重传、乱序、连接拒绝等异常
  • 过滤语法http.request.method == "POST" 等高级过滤

权限说明

tcpdump 默认需要 root 权限,因为需要访问原始套接字:

sudo tcpdump -i eth0

如果不想每次都用 sudo,可以将 tcpdump 二进制设置 capabilities:

sudo setcap cap_net_raw,cap_net_admin=eip $(which tcpdump)

之后普通用户即可直接运行 tcpdump(注意评估安全风险)。


常用命令速查

# 查看所有网卡
tcpdump -D

# 抓取所有流量(不推荐在繁忙服务器用)
tcpdump -i any -nn

# 抓 HTTP 请求并显示内容
tcpdump -i eth0 -A -nn port 80

# 抓取与某 IP 的通信并保存
tcpdump -i eth0 -nn -w cap.pcap host 10.0.0.1

# 读取 pcap 文件
tcpdump -r cap.pcap -nn -v

# 抓包同时输出到文件和终端
tcpdump -i eth0 -nn -l | tee /tmp/cap.txt

小结

tcpdump 是网络排查的瑞士军刀。掌握它的核心用法后,结合 Wireshark 做可视化分析,几乎能应对所有网络层面的问题定位。建议:

  1. 日常先用 -nn 避免 DNS 解析拖慢输出
  2. 线上抓包务必加 -w 保存文件,再离线分析
  3. 过滤表达式越精确越好,减少无关噪音
  4. 结合 ssnetstatpingtraceroute 综合判断

标签: none

添加新评论