一、概述

在 macOS 系统中进行网络抓包,可以帮助开发者调试网络问题、分析数据传输、检测安全漏洞等。本文将介绍几种常用的抓包工具和方法。

二、使用 Wireshark(图形化工具)

2.1 安装 Wireshark

方法一:使用 Homebrew 安装

# 安装 Homebrew(如果还没有)
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

# 使用 Homebrew 安装 Wireshark
brew install --cask wireshark

方法二:官网下载
访问 https://www.wireshark.org/download.html 下载 macOS 版本的安装包。

2.2 配置权限

安装后首次运行可能需要配置权限:

# 方法一:使用 sudo 运行(不推荐)
sudo /Applications/Wireshark.app/Contents/MacOS/Wireshark

# 方法二:配置 ChmodBPF(推荐)
sudo /Applications/Wireshark.app/Contents/Resources/Extras/ChmodBPF/ChmodBPF

2.3 开始抓包

  1. 选择网络接口

    • 打开 Wireshark
    • 在主界面选择要监听的网络接口(通常是 en0 用于 Wi-Fi,en1 或其他用于以太网)
    • 双击接口名称开始捕获
  2. 使用过滤器

    捕获前过滤(Capture Filter)

    host 192.168.1.1          # 只捕获与指定主机的通信
    port 80                   # 只捕获80端口的数据
    tcp port 443              # 只捕获HTTPS流量

    显示过滤器(Display Filter)

    http                      # 只显示HTTP协议
    tcp.port == 8080          # 显示8080端口的TCP流量
    ip.addr == 192.168.1.100  # 显示特定IP的流量
    http.request.method == "POST"  # 只显示POST请求
  3. 分析数据包

    • 点击某个数据包查看详细信息
    • 右键点击 → Follow → TCP Stream 可以查看完整的TCP会话
    • 使用 Statistics 菜单查看统计信息

三、使用 tcpdump(命令行工具)

tcpdump 是 macOS 自带的命令行抓包工具,功能强大。

3.1 基础用法

# 查看所有网络接口
tcpdump -D

# 监听指定接口(需要 sudo 权限)
sudo tcpdump -i en0

# 保存到文件
sudo tcpdump -i en0 -w capture.pcap

# 指定抓包数量
sudo tcpdump -i en0 -c 100

# 显示详细信息
sudo tcpdump -i en0 -v
sudo tcpdump -i en0 -vv    # 更详细
sudo tcpdump -i en0 -vvv   # 最详细

3.2 常用过滤器

# 按主机过滤
sudo tcpdump -i en0 host 192.168.1.1

# 按端口过滤
sudo tcpdump -i en0 port 80
sudo tcpdump -i en0 port 80 or port 443

# 按协议过滤
sudo tcpdump -i en0 tcp
sudo tcpdump -i en0 udp
sudo tcpdump -i en0 icmp

# 按源或目标过滤
sudo tcpdump -i en0 src 192.168.1.100
sudo tcpdump -i en0 dst 192.168.1.100

# 组合过滤
sudo tcpdump -i en0 'tcp port 80 and host 192.168.1.1'

3.3 高级选项

# 不解析主机名(加快速度)
sudo tcpdump -i en0 -n

# 不解析端口名
sudo tcpdump -i en0 -nn

# 显示数据包内容(十六进制和ASCII)
sudo tcpdump -i en0 -X

# 只显示特定长度的数据包
sudo tcpdump -i en0 -s 0  # 捕获完整数据包

# 添加时间戳
sudo tcpdump -i en0 -tttt

3.4 读取 pcap 文件

# 读取之前保存的文件
tcpdump -r capture.pcap

# 使用过滤器读取
tcpdump -r capture.pcap 'port 80'

# 转换为可读格式
tcpdump -r capture.pcap -A

四、使用 Charles Proxy(HTTP/HTTPS 专用)

Charles 是专门用于 HTTP/HTTPS 调试的强大工具。

4.1 安装

访问 https://www.charlesproxy.com/download/ 下载并安装。

4.2 配置 HTTPS 抓包

  1. 安装 SSL 证书

    • 打开 Charles
    • 菜单:Help → SSL Proxying → Install Charles Root Certificate
    • 在钥匙串中找到 Charles 证书,双击并设置为"始终信任"
  2. 启用 SSL Proxying

    • Proxy → SSL Proxying Settings
    • 勾选 Enable SSL Proxying
    • 添加要监控的域名(或使用 *:443 监控所有)
  3. 配置系统代理

    • Proxy → macOS Proxy(自动配置系统代理)

4.3 抓包移动设备

  1. 确保手机和电脑在同一网络
  2. 在 Charles 中:Proxy → Proxy Settings,记下端口号(默认8888)
  3. 在手机上配置 HTTP 代理:

    • iOS:设置 → Wi-Fi → 配置代理 → 手动
    • Android:Wi-Fi 设置 → 代理 → 手动
  4. 输入 Mac 的 IP 地址和端口
  5. 在手机浏览器访问 chls.pro/ssl 下载并安装证书

五、其他实用工具

5.1 mitmproxy(命令行 HTTP/HTTPS 代理)

# 安装
brew install mitmproxy

# 启动 Web 界面
mitmweb

# 命令行模式
mitmproxy

# 保存流量
mitmdump -w traffic.log

5.2 ngrep(网络版 grep)

# 安装
brew install ngrep

# 搜索特定字符串
sudo ngrep -d en0 'password'

# 搜索 HTTP 请求
sudo ngrep -d en0 -q 'GET|POST'

5.3 Proxyman(现代化的图形工具)

六、实战示例

示例 1:抓取特定网站的 HTTP 流量

# 使用 tcpdump
sudo tcpdump -i en0 -n -s 0 -w google.pcap 'host www.google.com and tcp port 80'

# 使用 Wireshark 过滤器
http.host == "www.google.com"

示例 2:分析 DNS 查询

# tcpdump
sudo tcpdump -i en0 -n port 53

# Wireshark 过滤器
dns

示例 3:监控本地应用的网络请求

# 监控本地回环接口
sudo tcpdump -i lo0 -A

示例 4:抓取 HTTPS 流量并解密

使用 Charles Proxy:

  1. 安装并信任 Charles Root Certificate
  2. 启用 SSL Proxying(Proxy → SSL Proxying Settings)
  3. 添加需要抓取的域名(例如:*.example.com:443
  4. 访问目标网站,即可在 Charles 中看到解密后的内容

示例 5:过滤特定应用的流量

# 使用 lsof 查找应用使用的端口
lsof -i -n -P | grep "应用名称"

# 然后使用 tcpdump 监听该端口
sudo tcpdump -i en0 port 端口号

七、常用过滤表达式速查表

Wireshark 显示过滤器

过滤器说明
ip.addr == 192.168.1.1显示源或目标IP为指定地址的数据包
ip.src == 192.168.1.1只显示源IP
ip.dst == 192.168.1.1只显示目标IP
tcp.port == 80显示TCP端口为80的数据包
tcp.flags.syn == 1显示SYN包
http.request显示所有HTTP请求
http.response.code == 200显示HTTP 200响应
dns显示所有DNS流量
ssl.handshake.type == 1显示SSL握手

tcpdump 捕获过滤器

过滤器说明
host 192.168.1.1捕获与该主机相关的流量
net 192.168.1.0/24捕获整个子网的流量
port 80捕获端口80的流量
portrange 80-443捕获端口范围的流量
tcp只捕获TCP流量
udp只捕获UDP流量
icmp只捕获ICMP流量
less 100捕获长度小于100字节的包
greater 1000捕获长度大于1000字节的包

八、注意事项

  1. 权限问题:抓包通常需要 sudo 或管理员权限
  2. 隐私和法律:仅抓取自己的流量,未经授权抓取他人流量可能违法
  3. 性能影响:长时间抓包会产生大量数据,注意磁盘空间
  4. HTTPS 解密:需要安装和信任 SSL 证书,注意安全风险
  5. 文件大小:使用 -s 参数限制捕获的数据包大小
  6. VPN 影响:VPN 可能会影响抓包,需要在对应的虚拟接口上抓包
  7. 证书固定:某些应用使用证书固定(Certificate Pinning),即使安装了证书也无法解密
  8. 防火墙:macOS 防火墙可能会阻止某些抓包操作

九、故障排除

问题 1:看不到网络接口

# 检查权限
ls -la /dev/bpf*

# 如果没有权限,重新安装 ChmodBPF
sudo /Applications/Wireshark.app/Contents/Resources/Extras/ChmodBPF/ChmodBPF

# 重启 Mac 后再试

问题 2:无法捕获 HTTPS 内容

  • 确保已安装并信任 SSL 证书
  • 检查应用是否使用了证书固定(Certificate Pinning)
  • 在钥匙串中验证证书是否被标记为"始终信任"

问题 3:tcpdump 显示 "Permission denied"

# 使用 sudo
sudo tcpdump -i en0

# 检查当前用户是否在 admin 组
groups

# 如需要,添加当前用户到 admin 组
sudo dseditgroup -o edit -a $USER -t user admin

问题 4:Wireshark 闪退或无法启动

# 重新安装 Wireshark
brew uninstall --cask wireshark
brew install --cask wireshark

# 或者下载最新版本从官网安装

问题 5:抓包文件太大

# 限制单个文件大小(100MB)
sudo tcpdump -i en0 -w capture.pcap -C 100

# 限制捕获包的数量
sudo tcpdump -i en0 -w capture.pcap -c 10000

# 只捕获包头部分(96字节)
sudo tcpdump -i en0 -w capture.pcap -s 96

十、进阶技巧

10.1 自动化抓包脚本

#!/bin/bash
# 保存为 capture.sh

INTERFACE="en0"
DURATION=60  # 抓包时长(秒)
OUTPUT_FILE="capture_$(date +%Y%m%d_%H%M%S).pcap"

echo "开始抓包,持续 $DURATION 秒..."
sudo timeout $DURATION tcpdump -i $INTERFACE -w $OUTPUT_FILE

echo "抓包完成,文件保存为: $OUTPUT_FILE"
echo "文件大小: $(ls -lh $OUTPUT_FILE | awk '{print $5}')"

10.2 使用 tshark(Wireshark 命令行版)

# 安装(如果通过 Homebrew 安装了 Wireshark,tshark 已包含)
# 列出接口
tshark -D

# 基本捕获
sudo tshark -i en0

# 只显示特定字段
sudo tshark -i en0 -T fields -e ip.src -e ip.dst -e tcp.port

# 导出为 JSON
sudo tshark -i en0 -T json > capture.json

10.3 远程抓包

# 在远程 Mac 上抓包并实时传输到本地 Wireshark
ssh user@remote-mac "sudo tcpdump -i en0 -U -w -" | wireshark -k -i -

10.4 分析已有的 pcap 文件

# 统计协议分布
tshark -r capture.pcap -q -z io,phs

# 统计会话信息
tshark -r capture.pcap -q -z conv,tcp

# 提取 HTTP 对象
tshark -r capture.pcap --export-objects http,./exported_http/

# 查找特定内容
tshark -r capture.pcap -Y 'http contains "password"'

十一、推荐学习资源

  1. 官方文档

  2. 在线资源

  3. 书籍推荐

    • 《Wireshark网络分析就这么简单》
    • 《Wireshark网络分析的艺术》

十二、总结

通过本教程,你应该已经掌握了在 macOS 系统上进行网络抓包的多种方法:

  • Wireshark:适合需要图形化界面和深度分析的场景
  • tcpdump:适合快速抓包和服务器环境
  • Charles/mitmproxy:适合 HTTP/HTTPS 调试
  • 其他工具:根据具体需求选择

建议初学者从 Wireshark 开始,熟悉网络协议和数据包结构后,再使用命令行工具以提高效率。

记住:

  • 抓包需要管理员权限
  • 注意隐私和法律问题
  • 合理使用过滤器减少数据量
  • 定期清理抓包文件释放空间

祝你抓包顺利!🎯