如何识别加密协议

加密P2P视频流的识别

背景

观看在线视频时,发现浏览器经常会偷偷地上传流量,实际上目前很多在线视频网站采用了一种RTMFP的技术来传输视频流量。采用这种P2P技术可以大大节约服务器的带宽和资源。但是一般家里的带宽都是不对称的,上行较小,所以上行很容易被堵住,直接导致打开网页都会变得很慢。

可以考虑在路由器或者网关设备上直接对这种视频P2P报文进行拦截或者进行QOS流控,但要达到上述目的,首先需要识别这些数据流。我在letv上打开了一个视频,并进行抓包分析。但仔细观察这些UDP的报文,全是加密的。采用何种加密方式未知,即使知道,需要对所有报文进行解密,开销也非常大:
如何识别加密协议_第1张图片

由于采用P2P方式进行传输,端口号也是不固定的。很难采用传统的基于端口或者基于报文特征的方式进行识别。

UDP打洞

实际上P2P采用UDP协议进行传输时,为了穿越NAT,都会采用UDP打洞这项技术,即采用相同的本地地址(LADDR)和本地端口(LPORT)与其他peer通信。如下图,10.39.11.107:54322会与不同的peer进行通信:
如何识别加密协议_第2张图片

但是如何告诉其他的peer自己的LADDR:LPORT,这时就需要跟一个超级节点进行交流。分析cap包,可以看到10.39.11.107:54322第一个通信的peer是220.181.1.165:8121,所以基本上可以确定220.181.1.165就是超级节点。
如何识别加密协议_第3张图片

进一步分析

那么超级节点的IP是如何获取的,首先想到的是通过域名进行解析。但通过“dns.a == 220.181.1.165”来进行过滤,发现并没有对应的DNS解析报文,所以应该不是通过域名解析得来的。那这个超级节点的IP到底是如何获取的呢?功夫不负有心人,仔细分析之前的数据流,如下图,可以看到超级节点是通过之前的HTTP连接,服务器以“rtmfp://IP:PORT”的格式返回的:
如何识别加密协议_第4张图片
获取到这个超级节点的IP:PORT后,识别到后续的P2P视频流就好办了:
1. 添加如下表项,LADDR:*–>IP:PORT+UDP,跟超级节点进行通信时就会匹配该表项
2. 命中后,即可以获取到UDP打洞的源端口LPORT,添加如下表项,LADDR:LPORT–>* :*+UDP,匹配该模式的即为P2P视频流

总结

不管是乐视视频,爱奇艺,腾讯视频等等,原理都是类似的。超级节点的IP,要么通过之前的HTTP连接获取到(各个网站的格式可能略有不同),要么通过域名解析获取。而知道了超级节点的IP后,后续的P2P视频流,不管加密与否,利用UDP打洞的原理,都能够高效地识别到。

你可能感兴趣的:(tcpip)