用于异常检测的网络流量特性分析

来源:Analysis of network traffic features for anomaly detection,https://link.springer.com/content/pdf/10.1007%2Fs10994-014-5473-9.pdf 

 Analysis of network traffic features for anomaly detection

摘要:通信网络中的异常检测为发现新的攻击、错误配置和网络故障提供了依据。数据存储、传输和处理的资源约束使得将输入数据限制在与检测任务高度相关的特性上,并且(b)可以很容易地从网络观察中派生出来,而无需昂贵的操作。去除强相关、冗余和不相关的特性也提高了基于学习技术的许多算法的检测质量。本文讨论了基于网络流量的异常检测的特征选择问题。我们提出了一种采用过滤器和逐步回归包装器的多阶段特征选择方法。我们的分析基于41个广泛采用的流量特征,这些特征出现在几个常用的流量数据集中。结合特征选择方法,可以将原始特征向量从41个减少到16个。我们用五个完全不同的分类器测试我们的结果,发现检测性能没有显著降低。为了量化我们的结果的实际好处,我们分析了从标准IP流信息导出记录生成单个特性的成本,这些记录在许多路由器上都可以获得。我们证明,我们可以消除13个非常昂贵的特性,从而减少了在网络节点上实时流量观察产生在线特性的计算工作量。

1、背景

今天的通信网络发展得很快。网络攻击也是如此。新的漏洞每天都会出现,并在零日攻击中被迅速利用。基于签名的检测无法检测到以前未知的攻击,异常检测技术可以发现与正常通信模式的偏差,因此是改善当今通信网络安全的重要工具。尽管在网络流量异常检测方法上有大量的技术和科学文献,但在文献中,特征选择的重要步骤往往没有得到充分的说明和处理。Tavallaee等人(2010)指出了异常检测研究中三个常见的缺陷:所使用的数据集、所进行实验的特点以及用于性能评估的方法。在实验的特点中,作者强调数据预处理是相关论文中经常跳过的一个阶段,指出特征选择是在没有适当理由的情况下进行的。这是非常不幸的,因为删除琐碎和冗余的特性不仅减少了处理、存储和传输数据的资源消耗,而且还增强了分析现象的建模,因此,这是检测网络异常的决定性步骤。

Guyon和Elisseeff(2003)说:变量选择的目的有三方面:(1)提高预测器的预测性能;(2)提供更快、更经济的预测器;(3)更好地理解生成数据的底层过程。

就异常检测而言,(1)重要性是毋庸置疑的。(2)是快速安装防范恶意软件大规模传播的前提。(3)为了推广解决方案和获得新知识,使未来的改进和增强成为可能,有必要。

我们的工作目标是根据网络流量特性对异常检测的贡献对其进行排序和选择。起点是广泛采用的41个特征集,用于NSL-KDD(2009)、DARPA(1998)和KDD杯(1999)数据集,为大量网络异常检测研究提供了基础。我们认为,使用这些特性的一小部分不仅比使用所有的特性更节省资源,而且还可以为广泛的典型分类器带来更好的检测结果。

我们将特征标记为高度相关的、中等相关的和可忽略的;并讨论它们在后验分类过程中的作用。我们的特征选择通过巧妙地结合不同的过滤器和逐步回归技术在包装器中实现,在特征子集上实现了良好的结论。

为了评价选择决策,采用了不同分类范式的简单模型:决策树(DTC)、k近邻模型(kNN)、朴素贝叶斯分类器、最小绝对选择和最小角回归(LASSO-LAR)、人工神经网络(ANN)和支持向量机(SVM)。前四个模型也被部署用于特性子集的验证和细化。

我们知道,网络研究社区仍然缺乏用于网络流量分析的可公开访问的有代表性的标记数据集。对经典数据集(McHugh 2000)进行了严厉的批评,这些数据集在以往的许多异常检测工作中得到了应用。在我们的研究中,我们使用了最近的NSL-KDD(2009)数据库,这是为了克服现有数据集的缺点。此外,我们讨论了在Tavallaee等(2010)中描述的关键要点。

2相关工作

在对网络异常检测的大量研究中,有一些在测试检测和分类技术之前处理特征选择的工作。对于相关工作的比较,我们展示了其他人提出的特征子集(如果显示)以及我们在图1中的结果。

尽管对DARPA 98和KDD CUP99年数据集的批评,他们接受了大量关于异常检测的修正研究,也包括了特征选择。KDD CUP99数据集被Sung和Mukkamala(2003)使用SVM和ANN对特征选择和分类进行研究。特征选择过程是用一个向后的消除包装器进行的。根据要检测的攻击类型,作者建立了重要和次要特征的子集,以及包含30个特征的重要特征子集的联合。在精确性测量中,只对重要子集进行评估和添加次要子集之间的差异不超过0.3%。不幸的是,作者没有指定选择了哪些特征。后来,在Sung and Mukkamala(2004)中,同样的作者使用基于SVM、多变量自适应回归样条(MARS)和线性遗传规划(LGP)的算法进行特征选择。他们总结了每种方法的6个不同的必要特征。从41个特性切换到6个特性,在最坏的情况下,精度性能下降了1.74%。如果我们将这三种方法的选择叠加起来,就得到了11个最重要特征的子集。

对于相同的数据集,在Khor et al.(2009)中,有两种算法称为基于关联的特征选择子集评价器(CFSE)和一致性子集评价器(CSE)为后验贝叶斯分类器选择特征。最终提案包含7个主要特征。在使用DARPA 98数据集,在n Chebrolu et al. (2005)的文章中,贝叶斯网络、分类树和回归树区分了必要特征。

对于KDD CUP99数据,Nguyen等(2010)的作者根据要识别的攻击类型,从41个特性减少到最少1个,最多22个。他们使用基于关联的方法,检查相关性和冗余度。不幸的是,没有指定特性。对于相同的数据集,在Stein等人(2005)中,一个以DTC作为验证模型的遗传算法(GA)包装器寻找相关的特性。它们显示为DoS类型的攻击案例。

NSL-KDD数据集的特征选择也有一些工作,Syarif等(2012)利用GA和粒子群优化(PSO)进行特征选择,以朴素贝叶斯、DTC、kNN和规则归纳为学习模型进行验证。GA选择了14个特征和PSO 9,两者都比使用原始的41个特征子集获得更好的性能,至少在使用kNN分类器时是清晰的。在Imran等(2012)中,作者通过线性判别分析(LDA)和GA进行特征选择,得到径向基函数(RBF)负责分类时11个特征的最优子集。在此之前,他们直接删除了名义特性(protocol_type, service和flag),以支持线性分析。最后,在Zargari和Voorhis(2012)中应用了两种从Weka中提取出来的特征选择方法(correlation-stepwise和Information-Gain based),以10个特征的子集达到最佳性能。

所有被调查的论文都基于相同的41个特征的初始集,但是即使他们使用完全相同的数据,他们都提出了不同的特征子集来检测异常(图1显示了差异)。我们在文献中找到了以往的特征选择工作存在分歧的几个原因,并在本文中明确阐述了这些原因。

1、不同的目标,如没有混合或混淆。一些引入的工作是为了区分数据集中的特定类型的攻击,而另一些则在同一过程中混合了异常检测和攻击识别。另一些人甚至把正常的流量当作另一种威胁,导致对结果的误解。很明显,不同的分类目标导致不同的特征集。我们的工作侧重于异常检测(将正常数据与异常数据分离),而不是攻击识别。

2 、不同的攻击分布。尽管数据集都使用相同的41个特性,但它们引入了不同的攻击集合,分布也不同。攻击分布影响特征选择,但更影响特征选择验证方法的性能。这解释了不同数据集的研究和使用不同验证技术的研究之间的差异。在我们的工作中,我们使用了最新的KDD-NSL(2009),以前的数据集的缺陷已经被修复。此外,我们用不同的分类器类型验证我们的结果,以避免偏倚。

3、特性之间高度相关。在我们的分析中,我们发现了几个高度相关的特征。例如,f13和f16的线性相关为0.998(特征见附录,表6);或f25、f26、f38、f39较低的线性相关指数为0.975。因此,如果一个选择方法选择与f13相关的,它可能会认为f16是多余的,因此被忽略了。另一种方法可能倾向于f16,然后肯定会拒绝f13。为了在高度相关的特性中进行选择,一些方法选择与标签最相关的特性,而另一些方法则结合预先选择的子集来检查所讨论的特性的能力。这种方法上的差异导致了不同的结果。在我们的工作中,我们提出了一个多阶段的特征选择,它结合了不同的方法。此外,我们使用多种验证范例,包括对冗余不敏感的模型(例如DTC、kNN)。

4、性能指标。许多被引用的论文使用准确性作为唯一的性能指标。考虑到攻击类型的非正态分布,仅相信精度指标是不理想的。对于NSL-KDD数据库来说,正常的流量和neptune攻击占样本的80%以上(类似于前面的数据集)。由分类器获得的习惯性的高准确度值使得难以说明在测试中哪个选项是最好的(在这种情况下:哪个特征子集)。需要额外的指标,如假阳性率、假阴性率、精度、召回率或ROC曲线(用曲线下面积表示)。在我们的工作中,我们使用多种性能指标和显示,除了准确性,还有攻击精度,攻击召回,和AUC。

5、验证技术不足。最后,统计显著性缺失的一个常见原因是将特征选择的评估与分类器或检测系统(IDS)的评估混合起来。这种误解导致研究人员部署原来的,建议的训练/测试数据集划分也用于检查特征选择。由于评价结果没有交叉验证,并且考虑到分类器存在的精度范围很窄(主要在经典数据集中),最终的评价不容易具有代表性。为了达到最大的意义,我们使用了整个NSLKDD数据库进行特性选择,在决定性的评估中执行了五次交叉验证。

3 用于异常检测的网络数据

由于网络流量的动态性,网络异常检测具有挑战性。提出的解决方案涵盖了从统计、数据挖掘和机器学习中继承的技术。Bhuyan et al.(2013)最近的一项研究对相当数量的网络IDS进行了综合调查。异常出现是由于网络入侵和攻击,但也由于设备故障或网络过载。Thottan和Ji(2003)将异常定义为任何使网络流量偏离正常行为的环境。自从我们使用带安全标签的数据时,我们考虑一个异常没有贴上任何向量数据库中的正常流量,即标记为一个类型的攻击(附录:表6)。我们区分异常检测和异常识别、概念,有时似乎混合在文献中(例如,第二节)。我们的论文专门集中于异常检测。请注意,异常检测的决定性特征并不一定与识别异常类型的特征相同。

3.1 NSL-KDD数据集

我们知道,由于网络、流量配置和攻击的多样性,任何网络流量数据集的代表性都可能受到质疑。所以找到合适的标签数据集是很困难的。许多已发表的异常检测和特征选择建议仍然使用DARPA ' 98和KDD ' 99CUP,尽管这些数据集的古老性和强大的,广泛的批评家建议不要使用这些数据集(McHugh 2000)。在这项工作中,我们使用了最近的NSL-KDD数据集(2009)。NSL-KDD数据集(2009)是由Tavallaee等人(2009)提出的,旨在为IDS测试提供一套数据集,克服KDD Cup ' 99数据库(也在DARPA ' 98上)中发现的一些固有问题。

NSL-KDD解决了测试数据中大量冗余记录和重复记录的问题;此外,还提供了更具挑战性的攻击分布。NSL-KDD数据集已经被IDS research community采用,如Panda et al. (2011), Salama et al.(2011)。和它们的前辈一样,NSL-KDD包含41个特性,分为三组:基本特性(basic features),从TCP/IP连接中提取;与同一主机或同一服务相关的流量特性(traffic features);和内容特性(content features,),基于数据包内容的数据。特性列于表1,并在附录(表7)中描述。

3.2攻击类型

附录中的表6显示了在训练和测试集中出现率的标记攻击。威胁根据攻击类型进行集群:拒绝服务(Dos),其中一些资源被淹没,导致Dos对合法用户。探测(Probes),收集网络信息以绕过安全性。远程到本地(Remote to local,R2L)攻击,利用远程系统漏洞访问系统。试图获得对系统的根访问权的用户对根(User to root,U2R)攻击。

NSL-KDD数据集发布分为两组:训练(125973个样本)和测试(22544个样本)。对分类器来说,选择数据的划分是最困难的。训练和测试数据不显示相同的攻击概率分布;此外,38个标记的威胁中有16个仅存在于测试数据集中。此外,一些攻击的存在非常罕见(整个数据库中有2 - 3个样本)。

4、特征选择

减少特征的数量在计算资源方面带来明显的好处;即,更少的存储数据,更快的处理和更容易的数据提取。此外,数据挖掘和机器学习技术从更复杂的降维方法中获益。在本节中,我们介绍了特征选择方法,它们在分类(除了资源优化之外)方面的优点,以及它们在处理网络异常检测数据库方面的意义。

4.1高维分类问题

从理论的角度来看,包含无意义或冗余的变量来描述一个现象不应该导致分类器性能的下降。但从实际应用来看,我们发现学习算法默认情况下忽略了数据的底层分布,由于冗余特性的存在,通常被迫通过近似NP-hard优化问题来发现解决方案(Kohavi和John 1997)。这个问题对于基于神经网络的分类器或决策树来说是非常重要的。

由不相关或冗余特征引起的性能下降取决于分类技术。朴素贝叶斯分类器处理不相关的变量是健壮的,但是对于添加相关特征(即使它们是相关的)非常脆弱(Kohavi和John 1997)。相反,SVM和kNN模型受到噪声和无关变量的严重损害。此外,一些线性模型如LAR对噪声数据和相关变量非常敏感(Efron et al. 2004)。为了减少特定分类器引入的偏差,我们使用了3种不同的分类范式进行验证(DTC、kNN和Naive Bayes),最多5种分类范式进行评估(在前一组中添加ANN和SVM模型)。此外,在使用此特定方法进行特性选择时,我们还部署了一个基于lasso - lara的分类器。

4.2特征选择与特征提取

与特征选择相关的习惯性误解来自于两种被设定进行降维的方法之间的细微差别,即特征选择和特征提取,也称为特征构造(Guyon和Elisseeff 2003)。特征选择是去除后验过程中不相关或不协调的特征,以进行数据表示和分类。另一方面,特征提取是将原始数据集投影到一个新空间中,在这个新空间中,特征(轴或新空间的变量)的线性依赖被最小化,从而导致所需特征的数量减少。文和陈(2012)给出了一个应用领域内的例子。注意,在特征提取中,产生的特征与原始特征不同。

尽管特征提取类似于主成分分析的PCA(主成分分析)、独立成分分析(ICA)或奇异值分解(SVD)可以用于特征加权和选择,但重要的是要注意所有原始变量的测量有助于定义最终子空间,以及只考虑特征之间的线性关系,即,高阶交互被忽略。这些方面使得特征提取方法通常不太适合于特征选择。在任何情况下,特征选择和特征提取并不相互排斥;恰恰相反。在将特征投影到优化空间(特征提取)之前,消除不相关的特征(特征选择)是一个有用的步骤。我们的工作只涉及到特征选择,而不是特征提取。

5特征生成成本

DARPA(美国国防高级研究计划局)1998年、1999年的KDD Cup和NSL-KDD数据集收集的41个特征代表了IDS中使用的典型观测数据,它们是由网络中的流量观测和主机上的审计过程生成的。创建数据集时,特征生成的成本不是问题。使用嗅探器来捕获网络中通信量的完整包跟踪,并在主机上安装了审计工具。观察到的数据被储存起来,可以离线分析。然而,在一个实时系统中,特征生成的成本是相关的。网络运营商需要能够以一种及时和成本效益高的方式生成这些功能,而这41个功能与生成这些功能所需的努力是不相等的。如果我们设法删除昂贵的特征,并且仍然获得良好的检测结果,那么我们就可以比忽略那些生成成本较低的特征时减少更多的资源。为了检查特征的有用性与生成特征的成本之间是否存在关系,我们提供了关于特征生成成本的特征分类。此外,我们还检查了哪些特征可以从路由器的标准流量测量中生成,哪些特征需要额外的分析功能,这些功能仅在IDS中可用。

5.1特性分类

NSL-KDD数据集区分基本、内容和流量特性。从网络中观察到的数据包的报头(IP和传输报头)可以推断出基本分类(f1-f9)的特征。然而,(在一个活动系统中)生成它们的努力是不相等的。有些特性只需要简单地检查标头字段(例如f2协议),是路由器流量测量报告的标准特性(见5.2节)。另一些则需要比较值(例如f7 land),甚至需要保持连接状态(f4标志)。这些功能需要额外的工作,通常在IDS中实现,例如Bro。

类别内容的特性(f10-f22)需要处理分组内容。捕获整个包比捕获包头要昂贵得多。此外,必须检查数据包有效负载,并重新组装应用程序数据。因此,从网络度量中获得内容特性是非常昂贵的。此外,如果通信是端到端加密的,那么包负载只能在通信主机上解密,而不能在网络上解密。这需要对网络中所有主机进行测量,也就是说,需要付出更多的努力。

类别流量的特性(f23-f41)考虑了以前连接的统计信息。f23-f31包含关于最近两个s内到同一目的地的连接的统计信息,而f32-f41则查看到同一目的地的最后100个连接,而不考虑时间段。所有这些特性都需要为连接的不同特性保留计数器和表。但是,通过检查包头可以生成其中的一些特性(例如f23 count、f24 srv_count、f32 dst_host_count),而其他特性则需要重新组装连接的各个部分(例如f25 serror_rate)。

5.2从标准IPFIX度量中提取特征

典型的网络分析工具允许包捕获或流量测量。包捕获收集在一个观察点上观察到的所有包,这个观察点通常安装在路由器上。大多数工具都允许配置一个snap大小,该大小定义了包捕获中包含多少包有效负载。流度量将具有公共属性(例如,公共源、目标、协议、端口)的数据包聚合到流中(Claise et al. 2013)。由于信息包被聚合到流中,需要存储的数据要少得多,但是来自单个信息包的信息也会丢失。Cisco NetFlow是在Cisco路由器上广泛部署的流量测量协议。IP流信息导出(IPFIX)协议是未来流测量的标准,提供了灵活的流定义(Claise et al. 2013)。由于NetFlow(以及将来的IPFIX)已经可以在许多路由器上使用,如果一个特性可以直接从IPFIX或NetFlow测量中推断出来,那么它是有益的。

我们查看来自网络测量的所有特性,并考虑是否可以从IPFIX推导出这些特性,或者是否需要进行任何额外的分析。IPFIX流是使用流键形成的,通常来自包头字段(Claise et al. 2013)。IPFIX中的流键定义非常灵活,可以包含许多允许将包聚合到流中的不同特性。然而,最常见的是使用一个流关键数据包根据5-tuple有别于IP和传输头字段:源和目标IP地址,源和目标端口号和协议类型。然后使用IPFIX信息元素向收集器报告特定流的特征。在IANA注册中心可以找到所有当前定义的IPFIX元素的概述。

经典的5元组流键允许使用IPFIX测量来区分TCP连接。一个不同之处在于IPFIX关注单向流,而TCP连接则建立双向通信。但是基于地址和端口号(在流键中使用),流可以与TCP连接匹配(Trammell和Boschi 2008)。protocol_type (f2)是流键的一部分。服务(f3)可以从端口号派生。这两个特性很容易从IPFIX获得。流的持续时间(f1)和传输的字节数(f5, f6)可以在标准的IPFIX信息元素中报告(flowDurationMicroseconds, octetTotalCount)。land (f7)不是由IPFIX直接报告的,但是可以通过对流键中的地址和端口进行简单的比较来推断,即需要额外的工作。此外,还需要一些额外的工作来计算紧急数据包的数量(f9)。尽管IPFIX为此提供了一个信息元素(tcpUrgTotalCount),但是路由器必须检查每个观察到的包的TCP报头中的标志。status (f4)需要保持TCP连接的连接状态,不能直接从IPFIX记录获取。error _fragment (f8)需要在TCP连接中使用错误的校验和来计算数据包。这个信息也不能直接从IPFIX获得。

内容特性(f10-f22)需要处理数据包内容。这不是IPFIX的一部分,需要额外的工作来捕获、存储和处理。

特性计数(f23)描述了在过去2秒内连接到同一主机的数量。这可以通过比较观察到的流动的流键和流动的开始时间(flowStartSysUpTime)来推断。因此,它可以基于IPFIX完成,但是需要做一些额外的工作来保持关于过去流的统计数据。同样,对于同一主机和同一服务的流量(same_srv_rate, f29),在过去几秒钟内流向相同服务的流量(srv_count, f24),流向相同主机和不同服务的流量(diff_srv_rate, f30),以及流向相同服务和不同主机的流量(srv_diff_host_rate, f31)都可以得到同样的推断。对于从最后100个连接(f32-f37)中查看服务和目的地主机的特性来说也是如此。为了找出有SYN错误(f25、f26、f38、f39)或REJ错误(f27、f28、f40、f41)的连接数量,必须维护连接状态,因此这些特征成本更高。

我们将生成功能的工作分为小型、中型或大型。表1显示了特征选择过程(相关性)的结果,以及我们对特征的分类,以及生成特征的努力。我们还展示了哪些IPFIX信息元素可以用来报告特定的特性。理想的特征对异常检测有很大的贡献,并且易于生成,即。f3(服务)。此外,如果一个特性生成成本很高,但对检测贡献很小,那么省略它是有益的。f8(wrong_fragment)。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,458评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,454评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,171评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,062评论 0 207
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,440评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,661评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,906评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,609评论 0 200
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,379评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,600评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,085评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,409评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,072评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,088评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,860评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,704评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,608评论 2 270

推荐阅读更多精彩内容