一定要了解的tcpdump命令实用技巧
常见抓包用法
1. 抓取指定主机的网络包
1 | tcpdump -ni eth0 host 192.168.1.100 |
在eth0
网卡上抓与主机192.168.1.100
相关的数据包,默认直接将数据包打印到屏幕上。
2. 抓取指定端口的网络包
1 | tcpdump -ni eth0 dst port 443 |
在eth0
网卡上抓目的端口为443
的数据包,直接打印在屏幕上。
3. 抓取指定数量的数据包
1 | tcpdump -ni eth0 host 192.168.1.100 -c 1024 |
指定-c
参数,抓取 1024 个数据包就停止
4. 抓包并以文本方式打印显式
1 | tcpdump -ni eth0 port 80 -A |
指定-A
选项,将以ASCII
格式打印数据包的应用层内容,比如 HTTP 请求就很方便打印可见内容。
常见选项总结
一、基础选项参数
-i
:指定从哪个网卡抓包,any 表示抓所有网卡;-n
:不解析主机和端口为名称,不指定会影响抓包性能;-c
:指定抓包的数量,抓够就停止;-s
:指定抓包数据包最大长度,0
表示抓取完整数据包,不指定使用默认的最大值-D
:列出可用于抓包的接口-w
:将抓包数据保存在文件中-r
:从文件中读取数据-C
:指定文件大小,与-w
配合使用-F
:从文件中读取抓包的表达式;-P
:指定要抓取的包是流入还是流出,取值in
、out
、inout
二、输出选项
-A
:以 ASCII 格式打印数据包的应用层内容;-x
:以十六进制格式打印数据包,不包括链路层;xx
:以十六进制格式打印数据包,包括链路层;-X
:以十六进制和 ASCII 格式打印数据包,不包括链路层;XX
:以十六进制和 ASCII 格式打印数据包,包括链路层;-e
:输出信息中包含数据链路层头部信息-t
:显式时间戳,tttt
显示更详细的时间-v
:显式详细的报文信息,v
越多显示越详细
过滤表达式
一、操作对象
type
:表示对象的类型host
、net
、port
、portrange
如果不指定默认是host
dir
:表示传输的方向src
、dst
proto
:表示协议ether
、ip
、ip6
、arp
、icmp
、tcp
、udp
二、组合条件
or
:表示或操作and
:表示与操作not
:表示非操作
三、表达式示例
host 192.168.1.100
:抓取 目的地址 或 源地址 为192.168.1.100
的数据包;src host 192.168.1.100
:抓取 源地址 为192.168.1.100
的数据;dst host 192.168.1.200
:抓取 目的地址 为192.168.1.200
的数据;port 443
:抓取 源端口 或 目的端口 为443
的数据包;src port 339
:抓取 源端口 为339
的数据包;dst port 443
:抓取 目的端口 为443
的数据包;net 192.168.1.0/24
:抓取指定网段的数据包;portrange 900-905
:抓取指定端口范围的数据包;
组合条件用法
1. 抓取指定主机和端口的数据包
1 | tcpdump -ni eth0 src host 192.168.1.100 and dst port 80 |
抓取源地址为192.168.1.100
且目标端口为80
的数据包。
2. 抓取指定主机但非 ssh 数据包
1 | tcpdump -ni eth0 host 192.168.1.100 and not dst port 22 |
3. 指定复杂与或逻辑过滤数据包
1 | tcpdump -ni eth0 'host 192.168.1.100 and (dst port 3389 or 22)' |
抓取主机为192.168.1.100
且非3389
和非22
端口的数据包,注意这里要加单引号,括号是特殊符号。
报文字段过滤
1. 仅抓取TCP连接中的SYN
数据包
1 | tcpdump -ni eth0 'tcp[tcpflags] & (tcp-syn) != 0' |
2. 仅抓取TCP连接中的RST
数据包
1 | tcpdump -ni eth0 'tcp[tcpflags] & (tcp-rst) != 0' |
3. 仅抓取TCP连接中的FIN
数据包
1 | tcpdump -ni eth0 'tcp[tcpflags] & (tcp-fin) != 0' |
4. 抓取TCP连接中的SYN
或FIN
包
1 | tcpdump -ni eth0 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0' |
5. 抓取 TCP 连接中包含数据,非SYN
、FIN
、ACK
等数据包
1 | tcpdump -ni eth0 '((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0' |
ip[2:2]
IP 包第 3-4 个字节(16 位总长度)(ip[0]&0xf)<<2
IP 包第 1 字节低 4 位,最后结果乘以 4(tcp[12]&0xf0)>>2
TCP 包第 13 字节高 4 位(数据偏移)x 4,实际应用数据长度。
6. 仅抓取 HTTP 报文
1 | # 应用数据前四个字符是 'GET ' |