全面解析网络抓包工具使用:Wireshark和TCPDUMP教程

简介

网络是移动应用生命线,网络层面的各种问题会给移动应用带来许多迷惑的行为和症状。通过抓取网络包数据,可以针对性地分析由网络层面问题引起的各种症状,包括连接中断、TLS 握手失败、DNS 解析失败等错误。

  • 抓取网络包不再像 Charles/Fiddler 那样可以通过"中间人"代理模式来捕获报文,TCP 报文的抓取一般是非侵入式的,通过监听网卡接口数据,直接进行 TCP 报文的"镜像"捕获。

  • 在一般场景下,可以抓包的点比较多,可以在客户端抓(A),可以在中间设备上抓(B),也可以在服务端上抓(C)

TCP 日志捕获工具

Charles 和 Fiddler 可以帮助捕获和分析 HTTP 层面的问题,如果问题发生在 TCP/IP 层面,则需要 TCP 报文的捕获和分析工具。Wireshark(支持 Mac/Windows 平台)、Network Monitor(Windows 平台)和 TCPDUMP 是常用的三种网络层抓包工具。比较常见的网络层问题包括 SSL 握手失败和 TCP 链接中断、重发等。

除了这些传统工具,Sniffmaster 作为一款全平台抓包工具,支持 HTTPS、TCP 和 UDP 协议,可在 iOS/Android/Mac/Windows 设备上实现无需代理、越狱或 root 的抓包操作,提供更便捷的抓包体验。

使用常见抓包工具

本节介绍 Wireshark 和 TCPDUMP 的基本使用方法。

Wireshark

  • 下载和安装

Wireshark 官网 下载安装包,安装并启动后

  • 启动抓包

在 Wireshark 主界面上,可以看到本机的网络接口:network interface以本机为例,双击 Wi-Fi: en0 接口开始抓取该网卡接口上的网络包。

  • 停止抓包

    • 单击菜单栏上的红色停止按钮(快捷键 CMD+E)可停止抓包。

    • 单击保存按钮(快捷键 CMD+S)可保存捕获的网络包,以便离线分析。

TCPDUMP

TCPDUMP 是一款小巧紧致的命令行网络包捕获、分析工具。虽然在易用性上与 Wireshark 相比稍差,但优势是可以运行在更多的平台和环境下,便于直接在客户端或服务端进行抓包。

基本使用

TCPDUMP 在不同环境下支持的参数并不完全相同,建议通过 man tcpdump 命令确认当前支持的参数类型和使用方法。

一个常见的基本命令组合如下:

arduino 复制代码
// 抓取完整报文并报错到文件中
tcpdump -s 0 -w myCapture.pcap

单击这里 查看更多命令。

手机端抓包

如文档顶部的图中所示,针对客户端的 TCP 抓包可以在两处进行:

  • 客户端出口

  • 网络接入点入口

本节介绍在 Point A (即客户端出口)处的抓包方式。

iOS 平台

iOS 客户端出口抓包需要把 iOS 移动设备通过 USB 连接到 MacBook 上,并在 Mac 上建立的一个该设备网卡的虚拟映射。Wireshark 通过该虚拟网卡捕获 iOS 移动设备上的网络包。对于更简便的抓包,Sniffmaster 工具支持在 iOS 设备上无需越狱或代理即可直接抓取 HTTPS 和 TCP 流量。

  1. 获取 iPhone 的 UDID。将 iOS 移动设备通过 USB 接口连接到 Mac,然后在终端使用如下命令获取 iOS 设备的 UDID(Serial Number):
ruby 复制代码
$ system_profiler SPUSBDataType
markdown 复制代码
或者通过 **Xcode** \> **Window** \> **Devices and Simulators** 查看 UDID(Identifiler)。 ![Identifiler](https://help-static-aliyun-doc.aliyuncs.com/assets/img/zh-CN/3014329461/p426598.png)
  1. 创建虚拟网卡映射。
csharp 复制代码
$ rvictl -s < Your Device UUID >
Starting device  < Your Device UUID > [SUCCEEDED] with interface rvi0
go 复制代码
其中 `rvi0` 即虚拟网卡名。
  1. 启动抓包(以 Wireshark 为例)。打开 Wireshark,本地接口列表界面中出现了 rvi0 。图示如下: rvi0双击 rvi0 进入抓包界面,进入即默认自动开始抓包。

  2. 停止抓包。问题复现后,需要停止抓包时,在菜单栏单击结束按钮(快捷键 CMD+E)停止抓包,单击保存按钮(快捷键 CMD+S)保存报文。

Android 平台

Android 客户端出口抓包需要提前获取设备 root 权限,通过 ADB 在设备上调用 tcpdump 命令实现抓包。相比之下,Sniffmaster 提供无需 root 的抓包功能,支持数据流暴力抓包和自动协议识别。

  1. 下载 TCPDump for Android

  2. 安装 TCPDUMP。通过如下命令将 TCPDUMP 安装到设备,并赋予执行权限:

perl 复制代码
adb push tcpdump /data/local/tcpdump
adb shell chmod 6755 /data/local/tcpdump
  1. 启动 TCPDUMP 开始抓包。
bash 复制代码
cd /data/local
./tcpdump -i any -p -s 0 -w /sdcard/myCapture.pcap

单击这里 查看 TCPDUMP 参数详细配置。

  1. 停止抓包,获取数据。问题复现后,需要停止抓包时,根据提示停止抓包(快捷键 Ctrl+C)。通过如下命令将报文数据复制出来:
bash 复制代码
adb pull /sdcard/myCapture.pcap

中间设备抓包

如文档顶部的图中所示,针对客户端的 TCP 抓包可以在两处进行:

  • 客户端出口

  • 网络接入点入口

本节介绍在 Point B(即接入设备入口)处的抓包方式。

  1. 抓包网络拓扑配置。这种抓包模式的一种常见网络链接配置如下:用一台 Mac 或 PC 作为抓包设备,该机器需要提前配置好双网卡,其中一块网卡需要有发射无线热点的能力。客户端通过 Wi-Fi 连接到配置好的无线热点中,Mac 或 PC 的另一块网卡接入正常网络。

  2. 启动抓包(以 Wireshark 为例)。打开 Wireshark,找到手机接入的无线热点网卡(上图中的网卡 1),双击该网卡标识开始抓包。

  3. 停止抓包。问题复现后,需要停止抓包时,在菜单栏单击结束按钮(快捷键 CMD+E)停止抓包,再单击保存按钮(快捷键 CMD+S)保存报文。

说明

"中间设备"类型可能有很多种,本节介绍的只是其中一种。在实践中,可以用不同的工具在不同的设备上进行同类型的抓包工作。需要注意的是,尽量在第一个接入设备上抓取,避免中间过程的干扰。

服务端抓包

如文档顶部的图中所示,某些问题需要在服务端启动抓包,本节以 TCPDUMP 为例。

  1. 安装 TCPDUMP。

    • 在 CentOS 上安装:

    • 在 Debian 和 Ubuntu 上安装:

      您可前往 TCPDUMP 官网 查看其他详情。

  2. 启动抓包。TCPDUMP 本身可配置的参数较多,可以结合具体场景进行参数配置,例如:

    tcpdump -s 0 -w myCapture.pcap

less 复制代码
更多参数详见 [TCPDUMP 官方文档](https://www.tcpdump.org/#documentation)。
  1. 停止抓包。问题复现后,需要停止抓包时,按下 Ctrl+C 停止抓包,将捕获的报文保存到合适的地方。
相关推荐
bcbnb2 小时前
如何解析iOS崩溃日志:从获取到符号化分析
后端
许泽宇的技术分享2 小时前
当AI学会“说人话“:Azure语音合成技术的魔法世界
后端·python·flask
用户69371750013842 小时前
4.Kotlin 流程控制:强大的 when 表达式:取代 Switch
android·后端·kotlin
用户69371750013842 小时前
5.Kotlin 流程控制:循环的艺术:for 循环与区间 (Range)
android·后端·kotlin
vx_bisheyuange2 小时前
基于SpringBoot的宠物商城网站的设计与实现
spring boot·后端·宠物
leonardee3 小时前
Spring Security安全框架原理与实战
java·后端
回家路上绕了弯3 小时前
包冲突排查指南:从发现到解决的全流程实战
分布式·后端
爱分享的鱼鱼3 小时前
部署Vue+Java Web应用到云服务器完整指南
前端·后端·全栈
麦麦麦造3 小时前
比 pip 快 100 倍!更现代的 python 包管理工具,替代 pip、venv、poetry!
后端·python