在 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/
tcpdump: ... You don't have permission to capture on that device 是没加 sudo,不是接口不存在;BPF 设备默认只允许 root。-i any 在 macOS 不成立,会报 No such device exists;用 tcpdump -D 选具体接口,回环用 lo0。-n 时每个包都可能触发反向 DNS,输出断续甚至像卡死;排障固定 -nn。-w 抓包会写满磁盘;用 -C/-W/-G 轮转,并同时监控 df -h。not port 22 并限制 -c 或时长。-w 正在写的文件不要直接拿分析器打开,可能只有半个包;用 -U 或在停止抓包后再读。ssh -t 会分配 PTY,若同时用 -w - 把 pcap 写到 stdout,终端层可能改写二进制导致文件损坏;先写远端文件再 scp,或用免密 sudo 且不分配 PTY。合上页面,先回答,再展开对照。
-i lo0,回环流量不经过 en0;配合 tcp port 8080 过滤。-C 按大小轮转、-W 限制保留文件数,或 -G 按时间轮转,并提前检查磁盘余量。
小程序版
微信扫码,随时查命令