目录
一、各协议数据包介绍
1、Ping、DNS数据包介绍(单包一来一回)
Ping
DNS
2、TCP数据包
在正常情况下,TCP连接确实是从三次握手开始的。三次握手是建立TCP连接的过程,它的目的是确保双方都能够正常通信。
为啥要四次挥手呢?
常见数据包介绍:
常见TCP头部字段介绍:
Telnet
TCP数据包:
3、HTTP、HTTPS数据包
有两种类型的消息:
常见的请求方法——增删改查:
常见的响应状态码:
SSL协商过程主要包括以下步骤:
二、tcpdump命令详解
1、tcpdump命令常用参数
2、AF“特殊”场景抓包汇总:
(1)、在透明或虚拟网线部署时,如遇数据包携带vlan头部(注:any口无法抓取带vlan头部的数据):
(2)、抓取聚合接口数据时:
(3)、抓取拨号口数据时:
三、wireshark使用详解
1、数据包常见字段及wireshark常用技巧
2、wireshark常见过滤条件
(1)、快捷过滤:无需在过滤器中手动输入条件,可以选择and/or selected。
(2)、快速过滤同一tcp、http数据流
(3)、统计会话情况,包含同一五元组数据包个数、字节总大小等信息,常用于查看抓取的数据包,流量占用情况。
使用wireshark可以很方便地对截获的数据包进行分析,包括该数据包的源地址、目的地址、所属协议等。下面列举一些常用显示过滤语法规则:
(1)、二层数据包过滤:
(2)、三层数据包过滤:
(3)、四层数据包过滤:
(4)、包长度过滤:
(5)、逻辑运算符 and、or、not
3、常见报错报文
(1)、【TCP Previous segment not captured】——丢包
(2)、【TCP 0ut-of-0rder】——乱序
(3)、【TCP DUP ACK】——期望ACK(告诉发起方我想要什么包!!!)
(4)、【TCP Retransmission】——超时重传
4、实战运用
(1)、客户反馈做了目的地址转换后测试不通,如何抓包分析?
(2)、客户反馈做了目的地址转换后,对应端口能通,但是业务无法访问,如何抓包分?
(3)、客户反馈内网电脑访问部分网站,经过AF后打不开?
(4)、客户反馈客户端访问服务器的一个HTTP业务打开的不全,打开慢,有些模块看不到?
一、各协议数据包介绍
1、Ping、DNS数据包介绍(单包一来一回)
Ping
ping 命令用于测试与目标主机之间的连接。它向目标主机发送一个ICMP请求,并等待它的回应。如果目标主机正常工作并且连接畅通,则会收到一个回显响应。如果没有收到响应,则说明有问题,需要进一步排除故障。
ping命令常用场景:测试连通性、测试时延、测试稳定性(是否丢包)、确认访问客户端源ip。
ping命令用法:
windows:ping XX.XX.XX.XX -t -l 500 (-t 长ping -l指定数据包长)
linux:ping XX.XX.XX.XX -s 500 (linux默认长ping -s指定数据包长)
正常没有人发固定长度的ping,这样很容易知道自己的源地址是多少。
DNS
DNS是Domain Name System的简称,即域名系统,是一个记录域名和IP地址相互映射的系统,主要作用是为了解决域名与IP之间的相互转换。DNS是一个网络服务,其端口为53号端口。
命令常用场景:某网站无法访问、ping的通外网,但网页打不开、僵尸网络触发测试
域名解析命令:nslookup baidu.com XX.XX.XX.XX(nslookup 域名 指定dns服务器)
查询ID:应答的ID和查询ID一致的话,可以根据这个ID去判断是不是回你请求的百度,而不是别人去请求百度。
2、TCP数据包
在正常情况下,TCP连接确实是从三次握手开始的。三次握手是建立TCP连接的过程,它的目的是确保双方都能够正常通信。
为啥要四次挥手呢?
(1)、因为TCP连接是双工传输,单次挥手只是会是本端不发包了,但是本端还能收包。
(2)、ack会比fin快,fin需要处理完数据才会触发,所以fin与ack不会在一起。
常见数据包介绍:
三次握手数据包:【SYN】【SYN ACK】【ACK】
复位数据包(俗称拒绝包):【RST】
四次挥手数据包:【FIN】【FIN ACK】
常见TCP头部字段介绍:
SEQ:序列号字段用于标识TCP报文段中数据部分的起始位置。它表示发送方发送的字节流中的第一个字节的序号。 确认同一方向数据流,客户端给服务器发的数据包里,SEQ要是连续的(第二个SEQ等于第一个SEQ加上传一个包的len)
ACK:确认号字段用于确认接收方期望接收的下一个字节的序号。它表示接收方期望从发送方接收的下一个字节的序号。
LEN:长度字段表示TCP报文段中数据部分的长度。
(1)、ack = 对方发来数据包seq + 数据长度len(如果是三次握手的话,是ack=seq+1)
(2)、seq = 对方发来数据包的ack = 自己发出的上一个包的seq+len
Telnet
telnet命令常用场景:测试端口映射是否有效、测试业务端口连通性。
telnet命令: telnet XX.XX.XX.XX 443(telnet 目标端口)
TCP数据包:
以上数据包中,包含了 三次握手:SYN、SYNACK、ACK、FINACK、RST
序列号信息: 190给99的发包,第一个包的seq:2718458284 1en=0 那么下一个包的seq=2718458284+199给190的发包,第一个包的seq:3432837339 1en=0 ack=2718458285那么可以知道,下一个包的seq=3432837339+1 以及下一个收到190给99的发包的seq=2718458285
3、HTTP、HTTPS数据包
HTTP工作在 TCP协议上,是一个基于TCP/IP 通信协议来传递数据(HTML 文件、图片文件、查询结果等)HTTPS 经由 HTTP进行通信,但利用SSL/TLS来加密数据包,HTTPS开发的主要目的,是提供对网站服务器的身份认证保护交换资料的隐私与完整性。
HTTP报文,又称为HTTP消息,是服务器和客户端之间交换数据的方式。
有两种类型的消息:
(1)、请求:由客户端发送用来触发一个服务器上的动作。
(2)、响应:来自服务器的应答。
常见的请求方法——增删改查:
PUT:上传文件,向服务器添加数据,可以看作增。
DELETE:删除文件。
POST:传输数据,向服务器提交数据,对服务器数据进行更新。
GET:获取资源,查询服务器资源。
常见的响应状态码:
2xx:请求正常处理完毕。
3xx:需要进行附加操作以完成请求,比如重定向请求新的URL。
4xx:服务器无法处理请求。
5xx:服务器处理请求出错。
SSL协商过程主要包括以下步骤:
(1)、客户端发送一个HTTPS请求给服务器,请求建立安全连接。
(2)、服务器收到请求后,会返回一个包含公钥证书的响应给客户端。该证书包含了服务器的公钥和其他相关信息。
(3)、客户端收到服务器的证书后,会验证证书的合法性和有效性。这包括检查证书的签名是否有效、证书是否过期、证书是否与请求的域名匹配等。
(4)、客户端生成一个随机的对称密钥,称为“Pre-MasterSecret”,并使用服务器的公钥进行加密。客户端将加密后的"Pre-Master Secret"发送给服务器。
(5)、服务器使用自己的私钥解密客户端发送的"Pre-Master Secret",得到对称密钥。客户端和服务器使用这个对称密钥来加密和解密后续的通信数据
二、tcpdump命令详解
1、tcpdump命令常用参数
tcpdump是linux系统下强大的数据包分析工具,可用来抓取相关数据,或分析相关数据包:
(1)、tcpdump命令格式:
tcpdump+参数+表达式 tcpdump -i eth1 host 1.1.1.1 and port 80 -nne
(2)、tcpdump常用参数:
-i:指定监听的网络接口。
-e:在输出行打印出数据链路层的头部信息。
一般是看哪个接口发出去,或者是二层看MAC地址
-c:截取指定数目的数据包。
-n:不把网络地址转换成名字。
-nn:不把端口和网络地址转换成名称。
-s:截取指定大小的数据包,s0表示完整数据包。
-w:将抓包内容保存到指定到文件,并不打印出来。
-v:输出一个稍微详细的信息,如在ip包中包括tt1和服务类型的信息。
-vv:输出详细的报文信息。
tcpdump利用表达式作为报文的过滤条件,表达式有如下三种类型关键字和逻辑运算符组成:
(1)、表示类型的关键字:host、net、port等。
(3)、表示协议的关键字:arp、icmp、udp等。
(4)、逻辑运算符:and、or、not。
2、AF“特殊”场景抓包汇总:
(1)、在透明或虚拟网线部署时,如遇数据包携带vlan头部(注:any口无法抓取带vlan头部的数据):
tcpdump -i eth1 vlan and host 1.1.1.1 -nn -c 100
(2)、抓取聚合接口数据时:
老架构:tcpdump -i bond1 host 1.1.1.1 -nn -c 100(聚合接口是几口就抓bond几,比如aggr.1)
新架构:tcpdump -i aggr.1 host 1.1.1.1 -nn -c 100
(3)、抓取拨号口数据时:
tcpdump -i eth1 pppoes and host 1.1.1.1 -nn -c 100
AF8048,想抓取在聚合2口上的目的ip符合192.168.1.1,以及除去22345端口以外的所有数据?
tcpdump -i bond2 dst host 192.168.1.1 and not port 22345 -nn -c 100
三、wireshark使用详解
1、数据包常见字段及wireshark常用技巧
ip.id 是用于唯一标识IP数据包的字段注意:数据包的三层转发,一般都不会去修改数据包的ip.id,但如果是数据被分片、经过了DN代理(一般单纯nat不会更改ip.id),那么有可能ip.id会发生变化,且同一方向数据流,ipid一般按顺序+1,如过滤同一方向数据流ipid不连续,则可能存在丢包。
使用场景:一般用于对比两个接口数据包是否一致均被正常转发。
注:如果是AF拦截并代理回复了RST,则ipid固定为:0x7051、0x7052、0x5826(用于7.X版本AF以及AC)
2、wireshark常见过滤条件
(1)、快捷过滤:无需在过滤器中手动输入条件,可以选择and/or selected。
(2)、快速过滤同一tcp、http数据流
(3)、统计会话情况,包含同一五元组数据包个数、字节总大小等信息,常用于查看抓取的数据包,流量占用情况。
使用wireshark可以很方便地对截获的数据包进行分析,包括该数据包的源地址、目的地址、所属协议等。下面列举一些常用显示过滤语法规则:
(1)、二层数据包过滤:
(2)、三层数据包过滤:
(3)、四层数据包过滤:
(4)、包长度过滤:
(5)、逻辑运算符 and、or、not
3、常见报错报文
(1)、【TCP Previous segment not captured】——丢包
在TCP同一方向传输过程中,同一台主机发出的数据段应该是连续的,即后一个包的Seq号等于前一个包的SeqtLen(三次握手和四次挥手是例外)。如果Wireshark发现后一个包的Seq号大于前一个包的Seq+Len,就知道中间缺失了一段数据。假如:缺失的那段数据在整个网络包中都找不到(即排除了乱序),就会提示 【TCP Previous segment not captured】。比如在图中,6号包的Seq号1449大于5号包的Seq+Len=1+0=1,说明中间有个携带1448字节的包没被抓到,它就是“Seq=1,Len=1448”
丢的包在wireshark中是这样类型:
(2)、【TCP 0ut-of-0rder】——乱序
在TCP同一方向传输过程中(不包括三次握手和四次挥手),同一台主机发出的数据包应该是连续的,即后一个包的Seq号等于前一个包的Seq+Len。也可以说,后一个包的Seq会大于或等于前一个包的Seq。当wireshark发现后一个包的Seq号小于前一个包的Seq+Len时,就会认为是乱序了,因此提示【TCP 0ut-of-0rder】。如图中所示,3362号包的Seq=2685642小于3360号包的Seq=2712622,所以就是乱序。
大量的丢包和乱序会导致网页卡慢(虽然丢包和乱序会触发重传,但是量大了也会有影响)
(3)、【TCP DUP ACK】——期望ACK(告诉发起方我想要什么包!!!)
当乱序或者丢包发生时,接收方会收到一些Seq号比期望值大的包。它每收到一个这种包就会Ack一次期望的seq值,以此方式来提醒发送方,于是就产生了一些重复的Ack。Wireshark会在这种重复的Ack上标记【TCP Dup ACK】。
以下图为例,服务器收到的7号包为“Seq=29303,Len=1460”,所以它期望下一个包应该是Seq Len=29303+1460=30763,没想到实际收到的却是8号包Seq=32223,说明Seq=30763那个包可能丢失了。因此服务器立即在9号包发了Ack=30763,表示“我要的是Seq=30763“。由于接下来服务器收到的10号、12号、14号也都是大于Seq=30763的,因此它每收到一个就回复一次Ack=30763,从图中可见wireshark在这些回复上都标记了【TCP Dup ACK】。
(4)、【TCP Retransmission】——超时重传
如果一个包真的丢了,又没有后续包可以在接收方触发【Dup Ack】,就不会快速重传。这种情况下发送方只好等到超时了再重传,此类重传包就会被Wireshark标上【TCP Retransmission】。以下图为例,客户端发了原始包(包号1053)之后,一直等不到相应的Ack,于是只能在100多毫秒之后重传了(包号1225)。
4、实战运用
(1)、客户反馈做了目的地址转换后测试不通,如何抓包分析?
思路:抓包看数据有没有到防火墙,到了防火墙有没有正常匹配NAT出去,分别从出接口和入接口抓取数据,确认是否存在转换,判断不通的原因。
有SYN的,没有【S.】也就是SYN ACK的包。
(2)、客户反馈做了目的地址转换后,对应端口能通,但是业务无法访问,如何抓包分?
背景:客户做了一个目的地址转换,将目的113.26.248.201的8088端口转换为服务器172.22.160.164的80端口,但配置后发现能telnet通,但是访问web页面时,无法访问到。
外网口包:看IPID,有没有AC
数据包三次握手正常交互,所以客户te1net才通,而到http的get请求时,被AC(rst的ipid=0x5826)拦截导致无法访问:而怎么判断非AF发送的RST数据包,如果非AF拦截,而是AF未监听端口也会回复rst,所以可以从数据包源目来确认发送源,如果AF转发请求,但收到了目的ip的rst,那么一般就不是AF发送的,AF拦截的话,会以AF为源,向客户端与服务器都发送rst。
如果是防火墙的rst,它会同时向服务器和客户端都发送rst,并且会以对端的身份像本端发(比如客户端发给服务器的,冒充服务器发客户端,如果是服务器发客户端,那就冒充客户度发服务器)
(3)、客户反馈内网电脑访问部分网站,经过AF后打不开?
背景:进一步了解到,客户测试发现,如果使用AF做DNS代理的话,就无法访问网站,但如果改为用公网dns服务器的话,则访问正常,且测试发现解析的结果也不一致。
内网口抓包结果:这个解析防火墙给回了,并且可以得到正确的IP
网口抓包结果:内网口证明防火墙有回,还得证明防火墙代理正常,这个时候就看DNS的53端口,之前到防火墙解析的是A记录,但是防火墙给回的4A记录,那就是防火墙没有解析出,读的是缓存,解决方法就是防火墙研发在后台调整不读缓存。
内网口可以抓到对应域名的解析结果,但是在外网口未抓到此A记录的解析;说明AF直接读取了DNS缓存,而此缓存ip,PC无法访问。
(4)、客户反馈客户端访问服务器的一个HTTP业务打开的不全,打开慢,有些模块看不到?
背景:客户端源ip:10.206.19.100,目的服务器ip:10.60.137.34。
客户端抓包:
有丢包
综上可得,在服务器给客户端回包的过程中部分数据包丢失,导致业务访问异常。