tcpdump抓包流程

1. 简介

linux系统上常用tcpdump抓包来分析网络问题。本文基于网络文章整理,主要介绍tcpdump抓包的常用命令及参数。

以下是数据包在操作系统层面的流程:

网卡nic -> tcpdump -> iptables(netfilter) -> app -> iptables(netfilter) -> tcpdump -> 网卡nic

2. tcpdump常用参数及命令

2.1. 指定网卡(-i)和主机(host)

tcpdump默认会将IP反向解析为域名,可以用-nn禁止反向解析。

  • -i:指定网卡

  • host:指定主机

  • -nn:禁止反向解析域名

  • -v或-vv:显示抓包的详细信息

  • -w: 写入文件(.pcap或.cap),供wireshark分析。

tcpdump -i any host 192.168.1.1      #-i指定网卡为所有
tcpdump -i eth0 host 192.168.1.1      #-i指定网卡为eth0
tcpdump -i eth0 host 192.168.1.1 -nn -v -w client.pcap     # 写入文件

2.2. 指定来源IP或目的IP、网段

  • src:指定来源IP

  • dst: 指定目标IP

  • net: 指定网段

  • -s : 指定抓包字节数,-s 0不限字节数,抓完整的包。例如icmp 大小为84字节

  • port: 指定端口

  • portrange: 指定端口范围

  • 协议:tcp, udp, icmp

# 指定源IP
tcpdump -nn -i any src host 192.168.1.1 
#  指定目标IP
tcpdump -nn -i any dst 192.168.1.1 
# 指定网段
tcpdump -nn -i any net 192.168.1.1/32
# 指定字节数
tcpdump -nn -i any -s 84 host 192.168.1.1  # 84表示icmp的包
# 指定协议
tcpdump -nn -i any -s 0 icmp  #只抓icmp协议
tcpdump -nn -i any -s 60 tcp port 80  #tcp协议,这里只抓60个头部字节
tcpdump -nn -i any -s 0 udp port 22 # udp协议
# 指定端口或范围
tcpdump -nn -i any -s 0 port 22
tcpdump -nn -i any tcp portrange 53-80 

2.3. 指定抓包数量、抓包大小、及轮询抓包

  • -c: 指定抓多少个包

  • -W: 最多写入多少个抓包文件,以MB为单位

  • -C:写入到抓包文件的大小上限

  • -G:参数指定间隔多少秒轮询保存一次文件,通常是以时间格式命令

# 指定抓2个包
tcpdump -i any -s 0 net 192.168.1.1/32 -c 2
# 指定写入到文件的大小上限为1M
tcpdump -i any -s 0 -C 1 -v -w client.pcap
# 指定写入到10个抓包文件,每个文件只抓1M,循环写入
tcpdump -i any -s 0 -C 1M -v -W 10 -w client.pcap
# 参数指定间隔多少秒轮询保存一次文件,通常是以时间格式命令
tcpdump -nn -i any -s 0 -G 5 -Z root -v -w %m-%d-%H:%M:%S.pcap  #每隔五秒保存一次文件

2.4. tcpdump的逻辑表达式(or、and、not)

  • and: 与

  • or: 或

  • not: 非

# 与
tcpdump -nn -i any -s 0 host 192.168.1.1 and icmp
# 或
tcpdump -nn -i any -s 0 host 192.168.1.1 or icmp or src net 192.168.1.1/32 
# 非
tcpdump -nn -i any -s 0 ! net 172.16.0.0/16 and icmp and ! tcp

3. Flags标记解读

Flags 含义
[S] SYN
[.] ACK
[S.] SYN、ACK
[P.] PUSH
[R.] RST
[F.] FIN
[DF] Don't Fragment(不分片),当DF=0时,允许分片
[FP.] FIN、PUSH、ACK

参考:


最后修改 April 16, 2023: add k8s and linux (63fb44a)