目录
tcpdump是linux下的一个命令行抓包工具
wireshark配备了图形化界面,所以建议是
tcpdump抓包生成.pcap文件放到wireshark里面进行分析
tcpdump核心参数详解
tcpdump的参数是如何构成的:
- option可选参数
- proto类过滤器:主要是根据协议进行过滤,可识别参数有:tcp udp ip ip6 icmp arp wlan ether
- type类过滤器:过滤特殊端口,ip,网段:可识别的关键字有:host net port portrange
- direction类过滤器:根据数据流向进行过滤,可识别的关键字:src dst 也可以使用逻辑运算符比如:src or dst
tcpdump的输出
理解输出结构
21:26:49.013621 IP 172.20.20.1.15605 > 172.20.20.2.5920: Flags [P.], seq 49:97, ack 106048, win 4723, length 48
这是一个简单的tcp抓包
- 时间戳
- 网络协议ip
- 发送方ip+端口
- >代表数据流向
- 发送端ip+端口
- 冒号:后跟数据包内容包括flag标识符[P.]代表PUSH标志位为1,seq号,ack号,窗口大小win,数据包长度length
flag标识符
tcp报文的flag有如下几种
[P]
PUSH 推送数据[S]
SYN 开始连接[F]
FIN 结束连接[R]
RST 重置连接[.]
没有flag标志位
常规过滤规则
基于IP地址过滤
使用host进行指定IP地址进行过滤,可以是发送端也可以是接收端
tcpdump host 192.168.10.100
指定捕获和192.168.10.100
相关的数据包
如果要细化是发送端还是接收端,可以使用src和dst参数
# 根据源ip进行过滤
$ tcpdump src 192.168.10.100
# 根据目标ip进行过滤
$ tcpdump dst 192.168.10.200
基于网段过滤
如果ip范围是一个网段,可以这样指定
tcpdump net 192.168.10.0/24
同样可以使用src dst来指定发送或接受
基于端口过滤
使用port关键字进行端口过滤
tcpdump port 80
如果想要抓两个端口可以这样写
tcpdump port 80 or port 8080
//或是简写成这样
tcpdump port 80 or 8080
如果要抓取一个范围,可以使用portrange
tcpdump portrange 80-8080
对于一些常见协议的默认端口,可以直接使用协议名
比如http=80 https=443
tcpdump port http or https
基于协议进行过滤
常见的网络协议有:tcp, udp, icmp, http, ip,ipv6 等
tcpdump tcp
可选参数解析
不解析域名提升速度
-n
不把ip转化为域名,避免了dns的过程,会快很多-nn
不把协议和端口号转化为域名,也会更快-N
不打印出host 的域名部分,例如使用端口号 80 的数据包将显示为 ... 80 > ...,而不是 ... http > ...
结果输出到文件
使用tcpdump抓包之后,需要用其他的工具进行分析,比如wireshark
使用-w参数后接一个以.pcap为后缀的文件名,可将tcpdump抓取的数据保存到文件中
tcpdump tcp -w tcp.pcap
从文件中读取数据
同样也可以进行文件中的过滤分析
tcpdump icmp or tcp -r 1.pcap
指定抓取个数
-c
指定抓包个数
tcpdump tcp -c 5
抓取5个tcp的数据包
指定设备口
-i
指定设备口
tcpdump -i eth0 # 指定使用 eth0 接口进行数据包捕获
tcpdump -i wlan0 # 指定使用 wlan0 接口进行数据包捕获
tcpdump -i 1 # 使用接口编号为 1 进行数据包捕获
过滤规则组合
运算规则和C中一致
and
&&
or
||
not
!
举个例子,我想需要抓一个来自10.5.2.3,发往任意主机的3389端口的包
tcpdump src 10.5.2.3 and dst port 3389
需要多个表达式组合时,可能需要括号,由于括号在shell中是特殊符号,需要用引号将其包含起来
tcpdump 'src 10.0.2.4 and (dst port 3389 or 22)'