前期准备
要想学会tcpdump,最起码需要对tcp/ip协议有一定了解,比如tcp三次握手,相关只是可以看看《计算机网络》或者《TCP/IP详解》。
tcpdump使用格式
格式:
tcpdump [ -AbdDefhHIJKlLnNOpqRStuUvxX ] [ -B buffer_size ] [ -c count ]
[ -C file_size ] [ -G rotate_seconds ] [ -F file ]
[ -i interface ] [ -j tstamp_type ] [ -m module ] [ -M secret ]
[ -P in|out|inout ]
[ -r file ] [ -V file ] [ -s snaplen ] [ -T type ] [ -w file ]
[ -W filecount ]
[ -E spi@ipaddr algo:secret,… ]
[ -y datalinktype ] [ -z postrotate-command ] [ -Z user ]
[ expression ]
常用参数说明:
-X:除了输出每个数据包外,还以16进制的方式输出内容
-n:不要把ip地址转换成域名
-s:显示绝对序列号
-i any:监听哪个网卡
-t 不显示时间戳
-v 详细显示命令执行过程 -vv更详细
-N 不列出域名
看着参数比较多,比较复杂,但真是不会用到那么多,只掌握几个常用的就行,后面有具体案例。总结起来就是:
tcpdump 参数 表达式
输出内容
数据展示格式:
src > dst: flags data-seqno ack window urg
src:源IP和端口
dst:目的IP和端口
flags:TCP控制位 S(SYN)、F(FIN)、P(PSH)、R(RST)、E(ECE)、C(CWR)
data-seqno:该字段表示这个数据包中的序列号范围
ack: 表示连接的另一端所期望的下一个字节的序列号
window: win num 在这条连接相反方向上用于传输的接收缓冲区的空间大小
urg:报文段在指定的偏移上包含紧急数据
options:该报文端中的任意TCP选项
几个典型使用场景
按端口号过滤
tcpdump -Xnlps0 -i any port 3306
过滤3306的数据包,输出详细数据内容
按源ip和port过滤
tcpdump -Xnlps0 -i any src host 127.0.0.1 and port 3306
过滤源ip为127.0.0.1并且端口为3306的数据包,输出详细数据内容
高级:按具体某位置字节过滤
tcpdump -Xnlps0 -i any ‘ip[0x34:4]=0x00a10002’
过滤34开始4个字节为00a1 0002
的包。
高级:抓取http get请求包
tcpdump -i eth1 -n -A src host 10.19.66.62 and dst port 80 and tcp[20:4]=0x47455420
首先查ASCII码表得”GET+空”的十六进制是0x47455420,因此表达式应为tcp[20:4]=0x47455420
参考:
- 聊聊TCP协议(https://zhuanlan.zhihu.com/p/21421623)
- http://mp.weixin.qq.com/s?__biz=MzA4Nzg5Nzc5OA==&mid=2651660526&idx=1&sn=fca5b6ee36cf8f4b2baeb2434439e48e&scene=1&srcid=0628Fk504ZJBvRs5s4yQ1hqc#rd
Q:
- length 1460最大多少 (1500-20-20?)
- ip包还是tcp包,包头有多大?(http://roclinux.cn/wp-content/uploads/2012/09/TCP%E5%A4%B41.jpg)