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
:指定来源IPdst
: 指定目标IPnet
: 指定网段-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 |
参考: