系统学习 macOS 学习路径:从 BSD 文件命令到系统、网络与开发维护

tcpdump

在 macOS 上抓取网络包,按 BPF 过滤后用 pcap 分析。

补充说明

tcpdump 通过 BPF 设备抓包,macOS 上必须用 sudo,否则报 You don't have permission to capture on that device。先用 sudo tcpdump -D 看接口列表,再 -i en0 抓 Wi-Fi、-i lo0 抓本机回环、-i utun* 抓 VPN。macOS 没有 Linux 的 any 伪接口,写 -i any 会报设备不存在。

常用参数:-n 不反解地址、-nn 连端口也不转服务名、-c 限制包数、-s 0 抓完整包、-A 按 ASCII 显示载荷、-X 十六进制加 ASCII、-w 写 pcap、-r 读 pcap、-e 显示链路层头。过滤器用 BPF 语法,例如 host 192.0.2.10 and tcp port 443、tcp[tcpflags] & tcp-syn != 0。

抓包文件增长很快,长时间抓取要用 -C 100 -W 5 按 100 MB 轮转保留 5 个文件,或 -G 按时间轮转,并提前确认磁盘余量。抓本机回环不会经过 en0;抓 VPN 流量要看 utun 接口;Wi-Fi 的混杂模式也看不到其他客户端的单播流量,交换机/AP 不会把别人的包转给你。

常用示例

# 列出可抓包的接口,确认 Wi-Fi 是 en0 还是 en1
% sudo tcpdump -D

# 抓 20 个包,不做地址和端口反解
% sudo tcpdump -i en0 -nn -c 20

# 只抓与某主机相关的 80/443 流量
% sudo tcpdump -i en0 -nn 'host 192.0.2.10 and (port 80 or port 443)'

# 抓 TCP SYN 包,排除自己的 SSH 会话
% sudo tcpdump -i en0 -n 'tcp[tcpflags] & tcp-syn != 0 and not port 22'

# 抓本机 8080 回环流量并显示 ASCII 载荷
% sudo tcpdump -i lo0 -n -A 'tcp port 8080' -c 5

# 轮转写盘:每个文件 100 MB,保留 5 个
% sudo tcpdump -i en0 -n -s 0 -w /tmp/cap.pcap -C 100 -W 5

# 读取已有 pcap 并筛选
% sudo tcpdump -r /tmp/cap.pcap -nn 'port 53'

# 远程抓包:先落到远端文件,再取回;不要经 PTY 传二进制
% ssh -t user@host 'sudo tcpdump -i en0 -U -n -w /tmp/remote.pcap -c 1000'
% scp user@host:/tmp/remote.pcap /tmp/

易错点与排错

相关命令

参考链接

读完自测

合上页面,先回答,再展开对照。

  1. 为什么 macOS 上抓包必须加 sudo?
  2. 要抓本机 8080 服务的回环流量,应该用哪个接口?
  3. 长时间抓包怎样避免写满磁盘?
答案
  1. 抓包需要打开 BPF 设备,默认只有 root 有权限;普通用户会报 permission denied。
  2. 用 -i lo0,回环流量不经过 en0;配合 tcp port 8080 过滤。
  3. 用 -C 按大小轮转、-W 限制保留文件数,或 -G 按时间轮转,并提前检查磁盘余量。
微信小程序码:扫码打开命令速查小程序

小程序版

微信扫码,随时查命令