tcpdump抓包与tcp握手
tcpdump -i eht0 -w file.cap host 192.168.168.18 and tcp port 8081
tcpdump -i wlo1 -A -s0 -w 111.pcap
1、语法中的关键字
host(缺省类型): 指明一台主机,如:host 210.27.48.2
net: 指明一个网络地址,如:net 202.0.0.0
port: 指明端口号,如:port 23
确定方向的关键字
src: src 210.27.48.2, IP包源地址是210.27.48.2
dst: dst net 202.0.0.0, 目标网络地址是202.0.0.0
dst or src(缺省值)
dst and src
协议的关键字:缺省值是监听所有协议的信息包
fddi、ip、arp、rarp、tcp、udp
其他关键字
gateway、broadcast、less、greater
常用表达式:多条件时可以用括号,但是要用转义
非 : ! or “not” (去掉双引号)
且 : && or “and”
或 : || or “or”
语法中的选项
-A # 以ASCII编码打印每个报文(不包括链路层的头)
-a # 将网络地址和广播地址转变成名字
-c # 在收到指定的包的数目后,命令停止
-C # 用于判断用 -w 选项将报文写入的文件的大小是否超过这个值,如果超过了就新建文件(文件名后缀是1、2、3依次增加)
-d # 将匹配信息包的代码以人们能够理解的汇编格式给出
-dd # 将匹配信息包的代码以c语言程序段的格式给出
-ddd # 将匹配信息包以十进制的形式给出
-D # 列出当前主机的所有网卡编号和名称,可以用于选项 -i
-e # 在输出行打印出数据链路层的头部信息
-f # 将外部的intetnet地址以数字形式打印出来
-F # 从指定的文件中读取表达式,忽略其他的表达式
-i # 监听主机该网卡上的数据流,如果没有指定,就会使用最小网卡编号的网卡(在选项-D可知道,但是不包括环路接口),any用于指代任意网卡
-l # 如果没有使用-w选项,就可以将报文打印到标准输出终端
-n # 显示ip,而不是主机名
-N # 不列出域名
-O # 不将数据包编码最佳化
-p # 不让网络界面进入混杂模式
-q # 快速输出,仅列出少数的传输协议信息
-r # 从指定的文件中读取信包(这些包一般通过-w产生,即抓包写入到文件)
-s # 指定抓包显示一行的宽度,-s0表示可安包长显示完整的包,经常和-A一起用,默认截取长度为60个字节,但一般ethernet的MTU都是1500字节,所以要抓取大于60字节的包时,使用默认参数就会导致数据包丢失
-S # 用绝对而非相对值列出TCP关联数
-t # 在输出的每一行不打印时间戳
-tt # 在输出的每一行显示未经格式化的时间戳记
-T # 将监听到的包直接解释为指定的类型的报文,常见的类型有rpc(远程过程调用)和snmp(简单网络管理协议)
-v # 输出一个稍微详细的信息,列如在ip包中可以包括ttl和服务类型信息
-vv # 输出详细的报文信息
-x/-xx/-X/-XX # 以十六进制显示包内容,四个选项差别不大
-w # 直接将抓取的包写入文件中,不分析和显示
expression # 用于筛选的逻辑表达式
命令实践
1、tcpdump # 直接启动tcpdump并将抓取所有经过第一个网络接口上的数据包
2、tcpdump -i eth0 # 抓取经过指定网卡上的包
3、tcpdump -i eth0 host 192.168.1.1 # 抓取所有经过 eth0,目的或源地址是 192.168.1.1的网络数据
4、tcpdump host192.168.1.1 and (192.168.1.2 or 192.168.1.3) # 抓取主机192.168.1.1和主机192.168.1.2或192.168.1.3的通信
5、tcpdump -n host 192.168.1.1 and ! 192.168.1.2 # 抓取主机192.168.1.1除了和主机192.168.1.2之外所有主机通信的数据包
6、tcpdump ip -n host 192.168.1.1 and ! 192.168.1.2 # 抓取主机192.168.1.1除了和主机192.168.1.2之外所有主机通信的ip包
7、tcpdump -i eth0 src host 192.168.1.1 # 抓取主机192.168.1.1发送的所有数据
8、tcpdump -i eth0 dst host 192.168.1.1 # 抓取主机192.168.1.1接收的所有数据
9、tcpdump -i eth0 host 192.168.1.1 and tcp port 80 # 抓取主机192.168.1.1所有在TCP 80端口的数据包
10、tcpdump -i eth0 host 192.168.1.1 and dst port 80 # 抓取HTTP主机192.168.1.1在80端口接收到的数据包
11、tcpdump -i eth0 port 25 # 抓取所有经过 eth0,目的或源端口是 25 的网络数据
12、tcpdump -i eth0 src port 25 # 抓取所有经过 eth0,源端口是 25 的网络数据
13、tcpdump -i eth0 dst port 25 # 抓取所有经过 eth0,目的端口是 25 的网络数据
14、tcpdump -i eth0 net 192.168 # 抓取所有经过 eth0,网络是 192.168上的数据包
15、tcpdump -i eth0 src net 192.168 # 抓取所有经过 eth0,源网络是 192.168上的数据包
16、tcpdump -i eth0 dst net 192.168 # 抓取所有经过 eth0,目的网络是 192.168上的数据包
17、tcpdump -i eth0 net 192.168.1 # 抓取所有经过 eth0,网络是 192.168.1上的数据包
18、tcpdump -i eth0 net 192.168.1/24 # 抓取所有经过 eth0,网络是 192.168.1掩码是24上的数据包
19、tcpdump -i eth0 arp # 抓取eth0网口arp协议的包
20、tcpdump -i eth0 ip # 抓取eth0网口ip协议的包
21、tcpdump -i eth0 tcp # 抓取eth0网口tcp协议的包
22、tcpdump -i eth0 udp # 抓取eth0网口udp协议的包
23、tcpdump -i eth0 icmp # 抓取eth0网口icmp协议的包
24、tcpdump -i eth0 ‘((tcp) and (port 80) and ((dst host 192.168.1.1) or (dst host 192.168.1.2)))’ # 抓取所有经过 en0,目的地址是 192.168.1.1 或 192.168.1.2 端口是 80 的 TCP 数据
25、tcpdump -i eth0 '((icmp) and (ether dst host 00:01:02:03:04:05))' # 抓取所有经过 en0,目标 MAC 地址是 00:01:02:03:04:05 的 ICMP 数据
26、tcpdump -i eth0 '((tcp) and (dst net 192.168) and (not dst host 192.168.1.2))' # 抓取所有经过 eth0,目的网络是 192.168,但目的主机不是 192.168.1.2 的 TCP 数据
27、time tcpdump -nn -i eth0 'tcp[tcpflags] = tcp-syn' -c 10000 > /xxx # 计算抓取10000个SYN包花费多少市检,可以判断访问量
28、tcpdump -i eth0 host www.baidu.com # 通过tcpdump截获主机www.baidu.com发送与接收所有的数据包
分析抓取到的报文
TCP 三次握手示意
TCP 四次挥手(即断开请求四次请求)
step1. 主机A向主机B发起断开连接请求,之后主机A进入FIN-WAIT-1状态;
step2. 主机B收到主机A的请求后,向主机A发回确认,然后进入CLOSE-WAIT状态;
step3. 主机A收到B的确认之后,进入FIN-WAIT-2状态,此时便是半关闭状态,即主机A失去发送能力,但是主机B却还能向A发送数据,并且A可以接收数据。此时主机B占主导位置了,如果需要继续关闭则需要主机B来操作了;
step4. 主机B向A发出断开连接请求,然后进入LAST-ACK状态;
step5. 主机A接收到请求后发送确认,进入TIME-WAIT状态,等待2MSL之后进入CLOSED状态,而主机B则在接受到确认后进入CLOSED状态;
为何主机A在发送了最后的确认后没有进入CLOSED状态,反而进入了一个等待2MSL的TIME-WAIT主要作用有两个:
第一,确保主机A最后发送的确认能够到达主机B。如果处于LAST-ACK状态的主机B一直收不到来自主机A的确认,它会重传断开连接请求,然后主机A就可以有足够的时间去再次发送确认。但是这也只能尽最大力量来确保能够正常断开,如果主机A的确认总是在网络中滞留失效,从而超过了2MSL,最后也无法正常断开;
第二,如果主机A在发送了确认之后立即进入CLOSED状态。假设之后主机A再次向主机B发送一条连接请求,而这条连接请求比之前的确认报文更早地到达主机B,则会使得主机B以为这条连接请求是在旧的连接中A发出的报文,并不看成是一条新的连接请求了,即使得这个连接请求失效了,增加2MSL的时间可以使得这个失效的连接请求报文作废,这样才不影响下次新的连接请求中出现失效的连接请求。
为什么断开连接请求报文只有三个,而不是四个因为在TCP连接过程中,确认的发送有一个延时(即经受延时的确认),一端在发送确认的时候将等待一段时间,如果自己在这段事件内也有数据要发送,就跟确认一起发送,如果没有,则确认单独发送。而我们的抓包实验中,由服务器端先断开连接,之后客户端在确认的延迟时间内,也有请求断开连接需要发送,于是就与上次确认一起发送,因此就只有三个数据报了。