网络抓包原理
本文以App作为例子,实际应用不限于App范围。
大部分场合都可以通过程序调试来定位问题,但有些场景使用抓包来定位接口问题更准确、更方便,如以下场景:
要实现对App的网络数据抓包,需要监控App与服务器交互之间的网络节点,监控其中任意一个网络节点(网卡),获取所有经过网卡中的数据,对这些数据按照网络协议进行解析,这就是抓包的基本原理。
但是中间网络节点,不受我们控制,所以基本无法实现抓包的,只能在客户端和服务端进行抓包。
通常我们监控本地网卡数据,如下图:
本地网络 指的是WIFI的路由,如果直接抓路由器的包还是比较麻烦的,因此我们会在 手机 和 本地路由 之间加一层 代理服务 ,这样只要抓代理服务的网络数据即可:
虽然在 手机 侧也可实现抓包,但和 本地路由 一样,抓包比较麻烦,如果不是没有办法,尽量还是不在手机侧抓包。但是有一种情况必须在手机端抓包,那就是在4G网络情况下:
4G网络状态下如何抓包,以及它的劣势,我们后面章节再细讲。
抓包实际上是分析网络协议的一种过程,尽管繁琐的细节劳动都让抓包工具做了,但我们还是需要了解下基础的网络协议,好帮助我们更好的分析问题。
首先需要了解下经典的OSI七层网络模型,以及每层的作用,其次对TCP、HTTP协议简单了解。
HTTPS是基于HTTP协议的一种改进,在 TCP之上 的会话层增加安全处理。对于应用层来说,HTTPS和HTTP没有什么不同,也就是说,HTTPS是保证网络传输的安全性,对业务数据无侵入。
简化理解大概是这个样子:
SSL和TLS是保证安全传输的协议,包括证书认证、加解密和数字签名。
项目中HTTPS的链路:
因此,客户端与后台,编写网络接口时,不需要关心SSL或TLS,按照HTTP协议处理即可。
既然HTTPS在网络传输是经过加密的,那么抓包抓到的数据就是密文,不经过解密是无法看到报文的。针对这个问题,如上图WIFI环境下设置代理的方式可以解决,具体思路是:
所以整个网络链路依然是HTTPS在传输,但代理服务自己可以获取到明文数据。
比较常用的抓包工具大概有4个,主要用作互补,配合使用基本所有平台、所有抓包需求都能满足:
需要说明的是,tcpdump可将数据保存成文件,直接用wireShark打开分析,针对后台或手机抓包使用起来十分方便。
几个工具间的使用关系:
为什么要真机抓包?必定是没有办法设置代理服务了,如4G网络情况下直接和移动基站链接,没法设置代理服务。凡是非4G网络状态下,都不建议真机抓包。
iOS 5后,apple引入了RVI remote virtual interface的特性,它只需要将iOS设备使用USB数据线连接到mac上,然后使用rvictl工具以iOS设备的UDID为参数在Mac中建立一个虚拟网络接口rvi,就可以在mac设备上使用tcpdump,wireshark等工具对创建的接口进行抓包分析。
具体步骤:
android是linux系统,和后台一样可以使用tcpdump命令来抓包,但是需要root权限,因为一般手机系统不带有抓包命令 tcpdump ,需要自行安装。
安装tcpdump:
使用tcpdump:
这是就已经进入抓包状态,手机所有的网络请求都会被捕获,并保存到capture文件中。
导出capture文件:
原文: 网络抓包
一般来说抓包都是用软件,抓包软件是抓去进,出设备的数据包。所以如果数据没有流动那就抓不到。不知道你想要查看些什么内容,如果你想看数据服务器与其他设备都传递些什么数据包那就得把数据服务器和另一个设备连在一起,让他们处于信息交互的状态,这样才能抓包。
比较有名的抓包工具有sniffer,etherpeak,wireshake(可能拼写有误,百度会为你纠正^_^)
而个人pc抓包一般都是抓取网卡上的数据,一般抓包软件会让你选择抓哪个网卡的数据,那就选你连接服务器和另一设备的那张网卡就行了。
抓取的包是所有通过网卡的数据,所以准确的筛选就要看你自己的知识够不够了。
你的意思是说在windows上运行sniffer程序抓linux服务器上的包? 这个功能不是wireshark这类sniffer能做到的,首先要保证你linux服务器上的包能同时发到windows的机器上,可以通过在交换机上设置来实现。如果对实时性要求不是那么高的话,也可以
话说你说的真心不够清楚,不太清楚你想干嘛?如果是你想抓自己电脑到ftp服务器的通信数据,那你就在自己电脑上装个wireshark,选择自己当前正在使用的网卡,在自己跟ftp服务器通信的时候,开始抓包就行了。如果要抓ftp服务器跟所有客户端的通信数据,那就在ftp服务器上装wireshark,选网卡,抓包就行了。
如果是都抓不到数据包,那可能是如下原因:
1、选取的网卡不是当前活动网卡,或者说不是ftp数据流走的那个网卡。
2、当前与ftp服务器没有通信。
传输是否加密,具体要看你自己APP的实现,有全程加密的,也有仅加密重要信息的,或者全程明文的。比如现在国内的Android应用在登陆时发送用户验证信息的措施大致上也是这三类:
1、登陆时全程https加密流量。比如:
知乎和bilibili
。
2、登陆时通过客户端仅对敏感内容,比如密码本身做加密或者使用摘要算法的结果。比如:
百度贴吧
。
因为我不知道百度贴吧应用登陆阶段具体实现的细节,为了安全起见,还是打马赛克。
3、登陆时也是全程明文传输,密码什么的都可以直接看到,例如:
应用汇
。为了避免泄露我应用汇的密码,所以我就对密码部分打马赛克。其他的app也可以抓包分析一下,所有内容都一目了然。至于经过加密或没经过加密的内容有什么差别,最简单的辨别方法就是按关键词搜索数据包内的字符,如果能搜出来的就是明文,搜不出的就是经过加密或摘要算法的结果。至于更详细的,比如通过什么传输层安全协议传输?https加密证书是否可信?是加密还是摘要?如果是加密,加密强度够不够?这些就需要你有一定基础才能掌握,这里三言两语也讲不清楚。
0条评论