抓包点位为什么重要
同一故障在不同点位抓包会得到相反结论:lo 上的流量只属于本机进程之间,eth0 才是真正进出网卡的流量,any 是一次抓所有接口的伪接口(用 SLL 封装,没有以太网头)。抓错点位最常见的结果是「什么都没抓到」,进而误判成「包没到」。Linux 上抓包需要 root 或 CAP_NET_RAW 能力。
基本信息
| 适用平台 | Linux(tcpdump 需 root 或 setcap 授权) |
|---|---|
| 常用参数 | -i 指定接口、-nn 关闭域名与端口名解析、-s0 抓全包 |
| 点位清单 | tcpdump -D 或 ip -br link 查看可用接口 |
| 写文件 | -w 落盘为 pcap,后续用 Wireshark/tshark 精读 |
| 典型限制 | any 抓包缺少二层头,做 VLAN/MAC 分析要换具体网卡 |
典型使用场景
- 外部客户端访问本机服务失败:抓物理口确认 SYN 是否到达主机
- 确认主机是否把响应发出去:同样抓物理口,用 src/dst 区分方向
- 本机进程互访异常(应用连本地代理、stub DNS):抓 lo
- 容器网络排查:抓 docker0 或 br-xxx 网桥、veth 对端
- 全量摸底不知道流量走哪张卡:先用 -i any 快速判定,再切到具体网卡细看
点位核对与抓取
点位核对与抓取
tcpdump -D # 列出所有可抓接口
ip -br addr # 每张网卡的地址与状态
# 外部访问本机服务:抓物理口
sudo tcpdump -nn -i eth0 'tcp port 8080'
# 只看进入主机的 SYN(判断请求有没有到)
sudo tcpdump -nn -i eth0 'tcp[tcpflags] & tcp-syn != 0 and dst host 10.0.0.8'
# 本机进程互访:抓回环
sudo tcpdump -nn -i lo 'tcp port 8080'
# 不确定走哪张卡:any 快速摸底(SLL 封装,无以太网头)
sudo tcpdump -nn -i any 'tcp port 8080' -c 20点位选择对照
| 抓哪里 | 能看到什么 | 典型用途 |
|---|---|---|
| lo | 本机进程之间的流量 | 本地代理、unix socket 转 TCP、stub DNS |
| 物理/虚拟网卡 | 真正进出网卡的报文,含二层头 | 判断包是否到达主机、响应是否发出 |
| any | 所有接口报文,SLL 封装 | 快速摸底;不适合二层与 VLAN 分析 |
| docker0 / br-xxx | 网桥转发的容器流量 | 容器互访、NAT 前流量 |
| veth 对端 | 容器命名空间内的进出流量 | 定位容器侧丢包或策略拦截 |
判断「包有没有到主机」和「主机有没有发出去」都抓物理口,再用 src host / dst host 分别限定方向,比在多张卡之间来回抓更可靠。