Linux tcpdump 抓包技巧与分析方法

1次阅读

抓包前须确认网卡与权限:默认监听首个up接口,需用ip link show或tcpdump -d查看;lo回环口需显式指定;非root用户需sudo或setcap授权。

Linux tcpdump 抓包技巧与分析方法

抓包前必须确认网卡和权限

不指定网卡或用错接口,tcpdump 很可能什么也抓不到——它默认只监听第一个 UP 状态的接口(通常是 eth0ens33),但容器、云主机、多网卡环境里这个“第一个”未必是你想监控的那个。

  • 先用 ip link showtcpdump -D 列出所有可用接口,注意看 UP 状态和描述(比如是否带 dockervethlo
  • lo(回环口)要单独抓:很多本地服务调用(如 curl localhost:8080)根本不出物理网卡,不指定 -i lo 就等于没抓
  • 非 root 用户执行会失败:提示 tcpdump: lo: You don't have permission to capture on that device;要么加 sudo,要么用 setcap cap_net_raw+ep /usr/sbin/tcpdump 授权(生产环境慎用)

过滤表达式写错,90% 的包都白抓

tcpdump 的过滤语法不是 shell 通配,也不是正则,而是 pcap-Filter 表达式;少一个括号、漏一个反斜杠转义、逻辑顺序不对,结果就完全跑偏。

  • 主机 + 端口组合必须用 and 连接:host 192.168.1.100 and port 8080,写成 host 192.168.1.100 port 8080 会被当成“host 是 192.168.1.100 port 8080”这种非法域名解析
  • 否定操作要用 !not,且优先级高:想排除 ssh 流量,port ! 22 是对的,但 ! port 22 会否定整个表达式(等价于“非 TCP/udp 22 端口的所有包”,范围大得多)
  • 涉及 or/and 混用时,必须用反斜杠转义括号:host a and ( b or c );否则 shell 会提前截断或报错
  • 别信“-n 就够了”:想彻底避免 DNS 和端口名解析,得用 -nn;只用 -n 还会把 80 解成 http,干扰判断

保存文件时 -s 0 不是可选项,是必选项

默认只抓前 68 字节,HTTP header、TLS SNI、mysql 查询语句……全被截断。你看到的 Flags [P.] 后面空空如也,不是没数据,是被砍掉了。

  • -s 0 表示“抓完整包”,这是分析应用层协议(HTTP、DNS、gRPC)的前提
  • 但要注意:-s 0 会显著增大文件体积和磁盘 I/O,高频流量下建议配合 -c(限制包数)或 -G(按时间轮转)使用
  • 保存为 .pcap 格式(如 -w trace.pcap),确保 wireshark / tshark 能直接打开;.cap 也可,但部分旧工具兼容性差
  • 别用 ctrl+c 中断后才发现没加 -w:屏幕输出无法回溯重放,也没法过滤重分析

iptables 规则不影响入向抓包,但会影响出向可见性

很多人以为 “封了 iptables 就抓不到包”,其实只对一半:数据包进网卡后、进 netfilter 前,tcpdump 就能捕获;但发出去的包,如果被 OUTPUT 或 POSTROUTING 链 DROP,那 tcpdump 根本看不到它离开主机。

  • 入向(inbound)包:无论 iptables 是否允许,只要到达网卡,tcpdump 都能抓到(例如被 DROP 的扫描包)
  • 出向(outbound)包:如果在 OUTPUT 链被拒绝,tcpdump 抓不到;如果只是 SNAT/MASQUERADE,在 tcpdump 里看到的是转换前的源 IP
  • 验证方法:在目标机器上同时运行 tcpdump -i any port 80iptables -L -v -n,对比计数器增长和抓包数量是否匹配

最常被忽略的一点:tcpdump 看不到虚拟网卡内部转发(如 bridge、macvlan、CNI 插件中间链路)的包,除非你明确指定对应 veth 或 cni0 接口——而这些接口名每次重启可能都变。

text=ZqhQzanResources