网络命令82 条

tcpdump 抓包分析

命令行抓包标准工具:-i any 全接口、-nn 不解析名字、表达式过滤主机/端口/协议;定位「请求到底有没有到」的终极手段。

Linux 运维命令速查系统更新于 2026-10-13

tcpdump 是什么

tcpdump 通过 libpcap 把网卡上经过的数据帧按过滤表达式筛选后打印出来。它的价值在于提供不可争辩的证据:在服务端抓不到 SYN,说明请求根本没到这台机器;抓到 SYN 却没有 SYN-ACK,说明是本机协议栈没有应答或出方向被拦。排查「网络还是应用」这类争执时,抓包比翻配置和日志都快。需要记住它的视野边界——只能看到流经本机网卡的流量,交换机上其他主机之间的通信不在其中。

基本信息

适用平台Linux、macOS、BSD(tcpdump 4.x);Windows 上一般用 Wireshark 或 npcap 自带工具
命令语法tcpdump [选项] [过滤表达式]
常用选项-i 指定接口(any 表示所有)、-nn 不做名称与端口解析、-c 抓取包数、-s 快照长度、-w 写入 pcap 文件、-r 读取 pcap、-A 以 ASCII 显示载荷、-X 十六进制加 ASCII、-e 显示链路层头部、-D 列出可用接口
过滤表达式host / net / port / portrange 限定对象,tcp、udp、icmp 限定协议,and、or、not 组合条件,tcp[tcpflags] 可按标志位筛选
权限要求需要 root 或 CAP_NET_RAW(部分发行版还需要 CAP_NET_ADMIN);容器里抓包通常要 --cap-add=NET_RAW 或使用宿主网络

典型使用场景

  • 确认请求是否到达:应用说没收到请求,抓包看有没有对应的 SYN 或数据包
  • 验证握手是否完成:SYN 有而 SYN-ACK 没有,问题在本机响应或出方向策略
  • 排查 DNS 解析:抓 udp port 53 看有没有发出查询、有没有收到应答
  • 审计可疑外联:按目标网段或端口过滤,确认机器是否在连接不该连的地址
  • 存档给图形工具分析:-w 写出 pcap,再用 Wireshark 做时序与协议解码
  • 查看明文协议内容:HTTP 之类未加密协议用 -A 直接看请求与响应头

常用示例

常用示例
tcpdump -i any -nn -c 20
tcpdump -i eth0 -nn 'tcp port 443 and host 10.0.0.5'
tcpdump -i eth0 -nn -A 'tcp port 80' -c 5           # 看 HTTP 明文
tcpdump -i any -nn 'tcp[tcpflags] & tcp-syn != 0' -c 20   # 只看 SYN
tcpdump -i eth0 -nn 'udp port 53' -c 10             # 看 DNS 查询
tcpdump -i eth0 -nn -w /tmp/cap.pcap 'host 10.0.0.9 and port 8080'   # 存盘待分析
tcpdump -nn -r /tmp/cap.pcap 'tcp.port == 8080' 2>/dev/null || tcpdump -nn -r /tmp/cap.pcap 'port 8080'
tcpdump -i eth0 -nn -e 'arp' -c 10                  # 看链路层与 ARP

常用过滤器

写法含义场景
host 10.0.0.5限定某个 IP(双向)锁定单台对端
src/dst host只匹配源或目的地址区分调用方与服务方
port 8080 / portrange按端口或端口范围过滤验证服务端口是否有流量
tcp[tcpflags] & tcp-syn按 TCP 标志位筛选只看建连请求,快速判断是否到达
not port 22排除自身管理流量避免 SSH 会话把结果刷满
and / or / not条件组合,注意优先级复杂条件用双层引号包裹整体
过滤在抓包环节就由内核的 BPF 完成,比先抓全部再 grep 高效得多。高流量网卡上不加过滤地抓包可能来不及处理,输出里会出现 packets dropped by kernel 的提示,那说明抓到的数据已经不完整。
写文件用 -w 时不打印摘要,适合长时间抓取;配合 -c 限制包数、-C 与 -W 做按大小轮转,避免把磁盘写满。pcap 文件之后可以用 -r 回放,也可以拷到本地用 Wireshark 分析。
抓包内容可能包含明文凭据、会话令牌与个人数据。只抓与问题相关的范围(用 host 与 port 收窄),文件设置最小权限并及时删除;在生产机器上长时间抓包还要评估 CPU 与磁盘 IO 的影响。
快照长度的取舍:老教程常写 -s0 表示抓取完整报文,而现代 tcpdump 的默认快照长度已经是 262144 字节,足以容纳常见报文;如果显式用 -s 96 只抓头部,写出的 pcap 里就没有应用层内容,事后无法分析载荷。要留档分析就不要限制快照长度。

易错点

  • 不加 -nn 时 tcpdump 会对每个地址做 DNS 反查、对端口做服务名解析,输出变慢甚至丢包;排查时始终加 -nn
  • 生产机器上不加 -c 与过滤条件长时间抓包,会消耗 CPU 与磁盘空间,还可能因内核缓冲不足丢包,结论失真
  • 误以为 tcpdump 能看到全网流量:它只抓本机网卡上的数据,跨主机通信需要端口镜像或 TAP 才能看到
  • pcap 文件里可能有明文密码与令牌,随意留存或共享属于数据泄漏风险
  • 容器内抓包受命名空间与权限限制,需要 --cap-add=NET_RAW 或进入宿主网络命名空间,否则只能看到容器自身的回环流量

数据来源与参考

  • man 8 tcpdump(tcpdump 官方手册)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌