tcpdump 与 Wireshark 网络抓包实战:远程抓包、过滤表达式、流量分析

tcpdump 与 Wireshark 网络抓包实战:远程抓包、过滤表达式、流量分析

网络抓包是排查网络故障、分析协议行为、定位性能瓶颈的核心技能。tcpdump 是 Linux 下轻量的命令行抓包工具,Wireshark 则是功能强大的图形化协议分析利器。两者结合使用------在服务器上用 tcpdump 抓包,在本地用 Wireshark 分析------能覆盖绝大多数网络问题的排查场景。本文将系统讲解从基础抓包到高级流量分析的完整流程。


环境要求

本教程适用于以下环境:

  • 服务器:Linux(Ubuntu 20.04+ / Debian 11+ / CentOS 7+)
  • 本地:Windows / macOS / Linux(需安装 Wireshark)
  • 工具:tcpdump(服务端)、Wireshark 4.x(本地)

推荐使用 雨云服务器 rainyun-com 作为实验环境,注册填优惠码 2026off 领 5 折优惠券。推荐机型:1 核 2GB Linux 云服务器,运行 tcpdump 完全足够,适合网络抓包学习与日常运维使用。


核心概念

数据包捕获原理

tcpdump 基于 libpcap 库,通过将网卡设置为混杂模式(Promiscuous Mode),捕获经过该网卡的所有数据帧。捕获的数据以 PCAP 格式保存,Wireshark 可直接读取该格式进行可视化分析。

BPF 过滤器

Berkeley Packet Filter(BPF)是 tcpdump/Wireshark 的过滤语言,分为两层:

  • 内核层 BPF :在内核层面过滤,性能高,tcpdump -f 参数使用
  • 应用层显示过滤器:Wireshark 专有,语法更丰富,在应用层过滤

抓包文件格式

格式 扩展名 说明
PCAP .pcap 最通用格式,tcpdump 默认
PCAPng .pcapng 新一代格式,支持多接口、注释
ERF .erf Endace 专有格式

配置步骤

第一步:安装 tcpdump

bash 复制代码
# Ubuntu/Debian
sudo apt update && sudo apt install -y tcpdump

# CentOS/RHEL
sudo yum install -y tcpdump

# 验证安装
tcpdump --version

第二步:基本抓包命令

bash 复制代码
# 查看可用网络接口
sudo tcpdump -D

# 在 eth0 上抓包,显示详细内容,限制 100 个包
sudo tcpdump -i eth0 -v -c 100

# 抓包并保存到文件(不解析主机名和端口,速度更快)
sudo tcpdump -i eth0 -nn -w /tmp/capture.pcap

# 抓包同时显示内容(调试用)
sudo tcpdump -i eth0 -nn -v -w /tmp/capture.pcap

# 指定抓包文件大小(每 100MB 自动切割)
sudo tcpdump -i eth0 -nn -C 100 -w /tmp/capture_%Y%m%d_%H%M%S.pcap

第三步:BPF 过滤表达式详解

bash 复制代码
# 只抓 HTTP 流量(80 端口)
sudo tcpdump -i eth0 -nn port 80

# 抓指定 IP 的流量
sudo tcpdump -i eth0 -nn host 192.168.1.100

# 抓指定 IP 和指定端口的组合
sudo tcpdump -i eth0 -nn host 192.168.1.100 and port 443

# 抓 TCP SYN 包(分析连接建立)
sudo tcpdump -i eth0 -nn 'tcp[tcpflags] & tcp-syn != 0'

# 抓 TCP RST 包(排查连接重置)
sudo tcpdump -i eth0 -nn 'tcp[tcpflags] & tcp-rst != 0'

# 抓大于 1000 字节的包
sudo tcpdump -i eth0 -nn 'greater 1000'

# 排除 SSH 流量(避免抓包自身操作产生干扰)
sudo tcpdump -i eth0 -nn not port 22

# 抓 ICMP 包
sudo tcpdump -i eth0 -nn icmp

# 抓 DNS 查询
sudo tcpdump -i eth0 -nn port 53

# 抓特定网段的流量
sudo tcpdump -i eth0 -nn net 10.0.0.0/24

# 复合条件:抓来自 10.0.0.1 到 8.8.8.8 的 UDP 流量
sudo tcpdump -i eth0 -nn 'src host 10.0.0.1 and dst host 8.8.8.8 and udp'

第四步:远程抓包并实时在 Wireshark 中分析

这是生产环境中最常用的工作流:在远程服务器上实时抓包,通过 SSH 管道传输到本地 Wireshark。

方法一:SSH 管道实时分析

bash 复制代码
# macOS/Linux 本地执行
ssh user@your-server "sudo tcpdump -i eth0 -nn -U -w - not port 22" | wireshark -k -i -

# Windows(需要安装 Wireshark 并配置 PATH)
# 在 PowerShell 中执行:
ssh user@your-server "sudo tcpdump -i eth0 -nn -U -w - not port 22" | "C:\Program Files\Wireshark\Wireshark.exe" -k -i -

参数说明:

  • -U:packet-buffered 模式,每抓到一个包立即输出,保证实时性
  • -w -:输出到标准输出(stdout)
  • Wireshark -k:立即开始捕获
  • Wireshark -i -:从标准输入读取

方法二:抓包后下载分析

bash 复制代码
# 服务器端抓包 60 秒
sudo timeout 60 tcpdump -i eth0 -nn -w /tmp/capture.pcap not port 22

# 下载到本地
scp user@your-server:/tmp/capture.pcap ~/Desktop/

# 本地用 Wireshark 打开
wireshark ~/Desktop/capture.pcap

实战示例

场景一:分析 HTTP 请求响应时延

bash 复制代码
# 抓取 HTTP 流量,含时间戳
sudo tcpdump -i eth0 -nn -tttt port 80 -w /tmp/http.pcap

# 用 tcpdump 快速查看 HTTP 请求头(ASCII 模式)
sudo tcpdump -i eth0 -nn -A port 80 | grep -E "GET|POST|HTTP|Host:"

在 Wireshark 中分析:

  1. 打开 http.pcap
  2. 菜单 → 统计 → HTTP → 请求
  3. 右键任意 HTTP 流 → 追踪 → TCP 流,查看完整对话
  4. 统计 → 服务响应时间 → HTTP,分析各接口延迟

场景二:排查 TCP 连接异常重置

bash 复制代码
# 专门抓取 RST 包
sudo tcpdump -i eth0 -nn 'tcp[tcpflags] & tcp-rst != 0' -w /tmp/rst.pcap

# 实时显示 RST 连接信息
sudo tcpdump -i eth0 -nn 'tcp[tcpflags] & tcp-rst != 0' | \
  awk '{print $3, "->", $5, $6}'

Wireshark 显示过滤器(在顶部过滤栏输入):

复制代码
# 过滤 RST 包
tcp.flags.reset == 1

# 过滤 TCP 重传
tcp.analysis.retransmission

# 过滤延迟超过 100ms 的 ACK
tcp.analysis.ack_rtt > 0.1

# 过滤 HTTP 错误响应
http.response.code >= 400

场景三:DNS 解析故障排查

bash 复制代码
# 抓取 DNS 流量
sudo tcpdump -i eth0 -nn port 53 -w /tmp/dns.pcap

# 实时显示 DNS 查询和响应
sudo tcpdump -i eth0 -nn port 53 | \
  grep -oP '(?<=A\? )[^ ]+|(?<=A )[0-9.]+'

Wireshark 中分析 DNS:

  • 过滤器:dns
  • 统计 → DNS,查看各域名解析时延
  • 检查 dns.flags.rcode != 0 的失败查询

场景四:统计流量 Top N

bash 复制代码
# 安装 ngrep 辅助分析
sudo apt install -y ngrep

# 用 tcpdump + awk 统计各 IP 流量
sudo tcpdump -i eth0 -nn -q | \
  awk '{print $3}' | \
  cut -d. -f1-4 | \
  sort | uniq -c | sort -rn | head -20

常见问题

Q:tcpdump 提示 "Permission denied" 无法抓包?

A:需要 root 权限或为用户添加 cap_net_raw 能力:

bash 复制代码
# 方法一:使用 sudo
sudo tcpdump -i eth0

# 方法二:给 tcpdump 添加 capability(不推荐生产环境)
sudo setcap cap_net_raw,cap_net_admin=eip /usr/sbin/tcpdump

Q:抓包文件太大,如何分割?

bash 复制代码
# 按文件大小分割(每 100MB 一个文件)
sudo tcpdump -i eth0 -nn -C 100 -w /tmp/cap.pcap

# 按时间分割(每 300 秒一个文件)
sudo tcpdump -i eth0 -nn -G 300 -w '/tmp/cap_%Y%m%d_%H%M%S.pcap'

Q:Wireshark 如何解密 HTTPS/TLS 流量?

A:需要服务器的 TLS 会话密钥文件(SSLKEYLOGFILE)。在应用侧设置环境变量 SSLKEYLOGFILE=/tmp/tls.log 后,Wireshark → 编辑 → 首选项 → Protocols → TLS → 设置密钥日志文件路径。

Q:抓包对服务器性能影响大吗?

A:使用 BPF 过滤表达式可以大幅降低开销。生产环境建议:加 -nn 避免 DNS 解析、加精确过滤条件、用 -C 限制文件大小、高流量时使用 -s 64 只抓包头。

Q:tcpdump 能抓 lo 回环接口的流量吗?

A:可以。使用 sudo tcpdump -i lo 即可抓取本机进程间通信(如应用访问本地数据库的流量)。


tcpdump 和 Wireshark 的组合是每个运维和开发工程师工具箱中不可或缺的利器。熟练掌握 BPF 过滤表达式和 Wireshark 分析技巧,能让你在遇到复杂网络问题时快速定位根因。

相关推荐
网络研究院12 天前
2026年网络安全
网络·安全·法律·法规·趋势·发展
酣大智12 天前
ARP代理--工作原理
运维·网络·arp·arp代理
treesforest12 天前
AI安全系统如何识别异常访问?IP风险识别正在成为关键能力
网络·人工智能·tcp/ip·安全·web安全
shushangyun_12 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
2601_9618451512 天前
粉笔行测题库|系统班|刷题
网络·百度·微信·微信公众平台·facebook·新浪微博
程序猿阿伟12 天前
《Chrome离线扩展安装的底层逻辑与场景落地指南》
服务器·网络·chrome
InHand云飞小白12 天前
无人值守站点网络困境?工业级路由器IR315破解连接难题
网络·物联网·4g·工业路由器·4g路由器·iiot·蜂窝路由器
森G12 天前
75、服务器源码解析---------云视频服务项目
linux·服务器·网络·c++·qt
江华森12 天前
TCP/IP 协议栈实战 — 7 个实验详解
网络·tcp/ip·智能路由器
酉鬼女又兒12 天前
零基础入门计算机网络运输层:端到端通信核心作用、端口号分类规则、复用分用工作机制及UDP与TCP协议全方位对比详解
网络·网络协议·tcp/ip·计算机网络·考研·udp·php