『用随机森林探测shadowsocks流量』论文解读

  有人也在IEEE上放出The Random Forest Based Detection of Shadowsock’s Traffic 这篇论文来公布下他们用随机森林算法探测shadowsocks的研究成果,这里我们来探讨下。论文在网上已经很容易下到了,我就不贴下载链接。

  论文出奇的短,只有4页,共分为介绍、相关工作、背景、方法、实验结果、结论、致谢,最后还有两个 致谢和引用。前两部分都是写客套话,说下为什么要研究这个(其实用ss的人都懂得),『背景』部分介绍了下ss的工作原理和随机森林,这篇论文的核心部分就是『探测方法』和『实验结果』了,所以我们着重看下这两部分。
  先来大概介绍下ss和随机森林算法。

shadowsocks

这里写图片描述
  如上图所示,用户(user)使用ss客户端(SS-local)先将真实请求加密,然后通过socks5将加密请求传送到墙外一台ss服务端(ss-server),然后ss服务端将请求解密后传给真正的目的地址,然后服务端收到请求回复后会将请求再加密传给客户端,客户端解密后展示给用户。通过一个跳板来实现科学上网。听起来和vpn很像,但实际工作原理是不一样的。
  在ss客户端于ss服务端的流量都是加密后的tcp报文,gfw无法解密其中的信息,所以根本没法判断你是否是访问遭gfw禁封的网站。正是因为无法从内容去判断,所以才有了这篇论文。
  

随机森林

  提到随机森林就不得不先说下决策树了,因为介绍决策树的博客太多了,我直接贴个链接分类算法之决策树(Decision tree),如果大家随便看一眼,就至少应该知道决策树是什么了。 接下来继续说随机森林。随机森林其实就是好多棵决策树放一起大家投票决定结果,随机森林的分类效果往往比单棵决策树要好很多,说白了就是 三个臭皮匠赛过诸葛亮的意思。 这篇论文中就是用随机森林来判断流量是否是ss流量。

ss流量探测方法

随机森林的实现

  随机森林包含多个分类决策树(CARTs),在训练单棵树的时候,从总训练集合C中取$\sqrt{C}$的数据,这里是有重复采样,就是$\sqrt{C}$中有些数据被从C中拿出来了多次。当训练每棵树的每个节点时却是无重复采样。整个随机森林的训练过程有以下几步。
1. 确定训练所有训练所需数据集和参数,包括训练数据集P,测试集T,特征维度F,CART的数量t,每个CART的深度d,节点使用的特征数f,在节点s中包含最小样本数的终止条件,节点m中的最小信息增益。
2. 从总训练数据集合P去除训练数据,训练数据将被放回总训练数据中。训练数据组数量等于训练组P(i),i表示number的索引。将P(i)设置为根,并开始从根训练。
3. 如果当前节点没有达到终止条件,则从F维特征向量随机抽取f个特征,这取出来的f个特征不会被放回到F中。从f中选出有最佳分类效果的特征k和它的阀值。并利用k特征进行判断,如果值小于阈值,样本将被分类为左侧节点,如果该值大于阈值,则样本将被分类为右侧节点。如果当前节点达到终止条件,则将当前节点设置为叶节点。这个叶节点的预测输出是当前节点样本集中最多的分类c(j),概率就是c(j)在当前样本中出现的概率。
4. 训练所有节点,直到所有节点被标记为叶节点或被训练过。
5. 训练所有CART,直到所有CART被训练过。
6. 预测训练数据组T,预测过程就像训练过程一样。 从当前CART根节点确定,如果小于当前节点的阈值,节点将进入左侧节点,如果大于当前节点的阈值,节点将进入右侧节点。 直到叶子节点确定出结果为止。
7. 对所有的CART做计算,所有树中最大的预测概率和就是预测结果,其实就是c(j)的每个概率和。

ss流量的特征

  上述过程中最主要的就是特征F,f怎么来?论文作者们抓了一些流量,提取了以下几个特征。他们有个3000维的数字来在内存中记录上下游数据包的大小在整个通信过程中有没有出现。
这里写图片描述

实验和结论

A.随机森林实验步骤

  1. 抓取ss流量,并抽取特征保存。
  2. 随机森林共包含100棵决策树,训练时采用基尼系数,特征抽取总特征数C中的 $\sqrt{C}$ 个,决策树最大深度不限,直至收敛出结果,只分为yes和no类,其他参数都是python RandomForestClassifer默认的值。
  3. 抓取需要检测的流量,包含ss和非ss流量,抽取特征并保存,最后用训练随机森林模型预测。

B.数据收集

  在本地抓取1G的ss流量,用c语言提供的Libpcap包解析,抽取特征并保存到数据库里做为训练集合。在本地抓取非ss流量10次,同样用libpcap处理。然后把1G的ss流量和来自随机来自26台机器的非ss流量抽取特征后存入库中作为测试集。

C.如何计算

  根据随机森林的判断结果,人工评估了训练集的有效性和随机森林算法的准确率。然后测试在不同大小的数据集下模型的准确率。如下图,准确率还是非常高的,随着测试集的增加,准确率也在逐步提升。训练集合的增加也会提升检测准确率。
这里写图片描述
  
这里写图片描述

结论

  用机器学习的算法检测ss流量是很有效的,能达到85%的准确率,但是现有的方式对计算量是一个很大的挑战,这意味着该模型实际应用中可能只检测部分流量(流量较大的??),这也可能是为什么有些人的ss现在还没被封的原因之一。

打赏

You May Also Like

About the Author: xindoo

Leave a Reply

Your email address will not be published.