Nemea:用于对网络流量进行流化分析的框架

来源:《Nemea: Framework for stream-wise analysis of network traffic》,2013

文摘:因为网络异常、攻击和其他事件不再是例外,网络监控和分析在网络管理中扮演着重要的角色。该技术报告涉及高速网络中的流量分析。特别地,报告描述了我们的框架Nemea,它提供了对网络流量数据的流化分析。


1介绍

网络服务、应用程序以及连接的用户都是网络安全威胁增加的目标。当监控网络流量并以自动化的方式分析观察到的数据时,最好检测到其中的一些威胁。一个常见的方法是收集并将被监控的数据存储到一个存储系统中(例如,在RAID模式中设置的多个硬盘驱动器)。随后,分析对存储的数据进行操作。该分析寻找可疑行为或特定的通信模式,以揭示异常、攻击或其他不兼容的事件和状态。随着网络和威胁的演变,分析也必须如此。为此,我们研究和开发流数据处理框架,作为传统的存储和事后分析方法的替代方案。

在大型网络的情况下,需要收集和分析大量的数据。在2013年,我们的测量点每天产生约100亿的流量记录(在营业时间内大约有11万流量/s,在营业时间内流量为160000流量/s,最高达到40万流量/s)。测量点部署在CESNET2网络的外围,每个监测点有一个或多个Gbps线。在[1]中描述了测量点的先导部署。

存储和发布的方法有一定的局限性。监控数据的数量以及复杂的方法使得访问存储在硬盘上的数据变得不可行的。新出现的威胁以及实现更好的检测精度的需要,需要分析新的数据类型,并在数据可用时分析数据,而不是延迟可能的响应。此外,数据通常存储在块中,每个块分别进行分析。这种分离使得检测对块的某些威胁视而不见。

这份技术报告总结了我们实现在线和无缝网络流量分析的目标。该报告描述了一个分布式和模块化的网络流分析框架(Nemea),以及我们的流量分析平台(TRAP),用于在Nemea中实例化的网络分析过程中的快速数据传输。Nemea系统由一组模块组成。每个模块都是一个独立的过程,利用TRAP与其他进程进行通信。通常,模块连接在一个单向树中,其中根的输入通常是流的数据,而叶子的输出是分析的结果。

Nemea数据访问与传统的方法有很大的不同。Nemea中的数据处理遵循两个概念:流化处理和硬盘上没有数据存储。这使得数据分析和快速数据访问成为可能。此外,TRAP允许在不同机器上的进程之间以透明的方式对进程本身进行通信。

2Nemea

网络测量分析(Nemea)是一种框架,它允许对从网络监控过程中实时收集的流量记录进行自动分析。该系统由称为模块的独立构建块组成。这些模块通过接口相互连接。

该模块是一个独立的工作单元,它通常接收来自其输入(s)的数据记录流,处理或分析数据记录,并向其输出发送另一条记录流。例如,模块可以根据接收的流记录计算一些统计信息,并检测网络攻击。攻击由数据记录描述,数据记录被发送到模块的输出。其他模块可以利用另一个模块之前计算的统计数据来检测异常,或者可以聚合检测结果,并将最重要的数据报告给操作员或其他报告系统。一个复杂的网络流量实时分析系统是由几个这样的模块相互连接而成的。

Nemea还可以与存储和前发布的方法兼容,这是在第1个案例中,以最简单的一个Nemea的例子作为实例。有两个模块通过一个接口相互连接。第一个模块从一个文件读取流记录并将它们发送到第二个模块。第二个模块计算流、包和字节的总数。图2显示了一个更复杂的系统的例子,在这个系统中,通过我们的IPFIX收集器的插件,实时地从网络接收流数据[4]。对数据进行再处理,通过几种攻击/异常检测算法进行分析,并对检测结果进行汇总,然后进行报告。每个特定的任务由一个独立的模块实现。这允许在系统的不同位置实例化某些模块,并将一个模块的结果共享给多个其他模块。


Nemea模块化设计的主要优点之一是可以通过几种算法共享常见任务。例如,在流量的时间序列中,存在大量的检测异常的算法,包括数据包头字段的熵或其他统计信息。如图2中的示例所示,有一个模块可以计算来自传入流记录的统计信息,并定期将它们发送到多个时间序列模块。因此,常见的预处理任务由所有算法共享。共享前处理的其他示例包括在分析模块本身之前连接的聚合和重复删除模块或前缀过滤模块。

2.1模块

每个模块都是一个独立的应用程序,也就是说它作为一个单独的系统进程运行。虽然这可能比其他可能的解决方案效率要低一些,比如将模块作为单独的代码片段连接到一个二进制文件中,或者将模块编译成共享库,然后将它们动态加载到一个进程中,这个解决方案提供了几个优势。

首先,可以很容易地独立地启动和停止进程,并通过操作系统提供的方法来监视它们的资源使用情况。还可以开发各种编程语言的模块,甚至是解释的模块(例如Python),如果所有模块都作为一个进程运行,则会更加困难。最后但并非最不重要的是,当每个模块作为一个单独的进程运行时,一个故障模块不会崩溃整个系统(例如,通过一个分段错误)。还可以设置内存和其他系统资源的配额,以避免出现故障的模块,通过消耗主机的所有资源来禁用系统。

可以动态地从系统中添加或删除Nemea模块。当一个新模块启动时,它尝试连接到其他模块的指定接口。如果一个连接在当时是不可能的(例如,因为另一个模块还没有启动),它会尝试定期连接,直到连接建立。类似地,当某些连接丢失时,模块尝试自动重新连接。由于这种行为,从系统中添加或删除模块就像运行或停止应用程序一样简单。这些模块的“热插拔”和“热交换”的能力对于添加新的分析算法或用它们的新版本替换现有模块非常有用,对系统的其余部分没有或几乎没有影响。

2.2接口

所有接口都是单向的,它们以单个记录的形式传输数据(例如,流记录或描述检测到的异常的记录)。通过一个接口发送的所有记录必须具有相同的格式,即它们必须包含相同的字段集,但是不同的接口可能使用不同的格式。

当模块连接到系统中时,给定接口使用的格式将被动态指定。动态格式规范使它成为可能,例如,向流记录添加一个新字段,而不需要更改模块处理这些记录的代码。指定如何定义这些格式以及如何创建和使用记录的协议称为UniRec。有关更多信息,请参见第3.2节。

有不同类型的接口,其区别在于底层的通信方法。在同一主机和不同主机之间有可靠的通信接口,所有的接口都有统一和简单的API。连接的参数(它的类型和连接的另一个站点)在模块开始时给出。该模块对于特定的接口类型是完全不确定的,因为连接机制被隐藏在模块中。关于接口的更多信息见第3.1节。

Nemea利用了流量分析平台(TRAP)——一个实现这些接口的库(名为libtrap的共享库)。TRAP如第3节所述。

2.3流媒体的概念

Nemea框架中的模块处理数据流,即数据以单个记录的方式到达一个模块。这些记录没有被分组成包或任何类型的突发事件(除非它是由模块明确地完成的)。

与现有的网络流量分析框架相比,streamwise和实时处理是主要优势之一。例如,最先进的流收集器NfSen支持插件分析收集的数据。但是数据首先存储在文件中,每个文件包含5分钟间隔的数据。该文件是在完成后才由插件处理的,所以在流量记录到达的时间和分析的时间之间可能会有5分钟的延迟。在Nemea中没有这样的延迟,这导致了及时的分析。

所提议的概念对主机的存储子系统也非常友好,因为不需要从硬盘中读取数据。收集器可以直接将数据传递给Nemea系统,因此所有的自动化处理都是在主内存(RAM)中完成的。当然,数据也可以存储到硬盘中,以便稍后进行分析。

2.4多功能性

Nemea允许多用途部署。例如,如果需要通过与在线数据相同的方法来分析一些离线数据,那么所有需要的就是用一个模块替换收集器,该模块从一个文件或数据库读取数据,其余部分保持不变(或者如果在线分析必须继续运行的话,可能会被复制)。

另一个有趣的Nemea usecase是一种测试检测算法的可能性,通过在线注入合成的攻击跟踪到真实的数据。如图3所示。



由于有允许通过网络进行通信的接口类型,所以很容易将Nemea系统分布到几个物理机器上。所需要的是在不同的主机上运行模块,并指定适当的接口类型。

Nemea被设计为易于使用和允许快速实现分析算法和其他任务。它提供易于使用的API,具有传递数据的功能,还包括各种公共数据处理功能。

2.5Nemea设置

值得注意的是,Nemea是一个框架,而不是最终的系统本身。Nemea定义了高级体系结构和接口,包括TRAP库、UniRec格式和几个基本模块。一个特定的分析系统,即一组模块和它们的互连,应该总是专门设计来适应特定的网络、可用的数据源和分析需求。此外,虽然Nemea已经包含了很多模块,但是用户也可以实现一些模块来满足他们的特殊需求。

Nemea的设计是为了使模块的实现尽可能容易,从而允许快速实现分析算法和相关任务。Nemea解决数据获取、输入数据的解析或格式化和报告/记录输出。该框架还提供了一些方便的方法,比如处理时间戳和IP地址,或者计算各种散列函数。此外,Nemea的模块化特性允许充分利用现代多核处理器的强大功能,或者在没有任何源代码修改的情况下将系统分发到多个主机上。

Nemea控制脚本允许指定特定的Nemea设置。用户在安装文件中指定自己的Nemea配置。该配置定义了已安装模块的列表,它们的启动参数和模块间互连的定义。控制脚本允许启动和停止给定配置中的所有模块,或者独立启动/停止任何模块。

3流量分析平台

我们已经开发了流量分析平台,可以有效地将数据流到Nemea中。

3.1通信层(libtrap)

Nemea模块使用一个通用的通信接口。通信接口由一个名为libtrap的共享对象表示,该对象由每个Nemea模块链接。两个模块之间通信的概念如图4所示。


Libtrap从实际的底层接口和它的细节中抽象出模块。一旦数据可用,源模块就会将数据从输出接口发送出去。发送操作可能是非阻塞,也可能是基于配置参数的阻塞。Libtrap关心缓冲以及根据配置行为的受控数据丢弃。目标模块从回路中的输入读取数据,但是如果没有可用的数据,则读取被阻塞(这种行为也依赖于配置的参数)。

最低层由两个接口类型组成:TCP套接字(TCP/IP IFC)和Unix socket (Unix IFC)。有一个缓冲层可以减少耗时的传输请求的数量,即它聚合多个传输请求。Libtrap包含各种高级功能,如超时、多读、自动刷新。这些层将进一步详细描述。

Libtrap为模块提供了通过输入和输出通信接口进行通信的API。当前版本的libtrap支持三个主要的libtrap接口类型,可以在图5的最低行看到。大多数使用的接口类型是UNIX套接字(用于本地通信)和TCP/IP套接字(用于独立机器上的模块之间的远程通信)。最后一个可用的通信接口使用共享内存。内存接口只支持一对一的通信,而UNIX套接字和TCP/IP套接字允许用户将N个目标模块连接到一个输出接口。

每个模块的通信接口的类型和参数由用户在启动模块时选择。这种接口初始化的方式提供了使模块与已经运行的其他模块进行通信的可能性。

当Nemea模块成功启动(包括接口参数的处理)时,libtrap会自动将输入接口的连接建立到其他模块的输出接口,并等待新的连接到输出接口。该连接是完全抽象的,模块不需要处理连接尝试。当两个模块之间的连接失败或其中一个模块失败时,libtrap试图自动恢复连接。重新连接是在选定的接口类型上独立完成的。恢复不仅可以容忍物理通信通道的故障,而且可以在不影响系统其余部分的情况下重新启动任何模块。

Nemea模块的目的是处理高吞吐量的高数据量。因此,通信层必须为模块提供高吞吐量的接口。开发的缓冲层可以聚合请求,从而有效地减少与每个传输相关的开销。缓冲增加了可以从一个模块传输到另一个模块的消息的数量。在实验的基础上,我们设置了缓冲区的大小,以实现具有基本网络流信息的消息大小的最优吞吐量。

缓冲层可以用于任何类型的输入或输出接口。用户可以禁用缓冲,以最大限度地减少紧急单个消息传递的延迟。例如,对于产生警告消息的模块,禁用缓冲可能是有用的,即不太频繁但需要尽快交付的消息。

有一组功能块允许用户控制底层的行为。当前提供的特性是自动刷新、超时处理和多读。

缓冲层支持在指定间隔后自动传输缓冲区内容的机制,这些模块会不定期地生成大量消息。这种机制称为自动刷新。它阻止了存储在缓冲区中的消息的老化,因为没有自动刷新的缓冲层不会启动传输,直到缓冲区满了为止。自动刷新特性只支持输出接口。时间间隔是可配置的,用户可以禁用自动刷新。

关于发送和接收功能的时间延迟有不同的要求。在这种情况下,时间延迟意味着模块之间的最大时间调用函数并获得操作的结果。Libtrap有三个特殊的超时定义:TRAP_WAIT、TRAP_NO_WAIT、TRAP_HALFWAIT。这些定义的超时用于控制模块要等待传输的时间。TRAP_WAIT相当于阻塞系统调用。它等待输出接口发送消息,或者消息被输入接口完全接收。因此,当接口的超时设置为TRAP_WAIT,而在该接口上没有建立到另一个模块的连接时,它会阻塞模块,直到连接到其他模块为止。TRAP_NO_WAIT与TRAP_WAIT相反。它充当非阻塞函数,在没有传递消息时返回错误。在两次暂停之间,TRAP_HALFWAIT是一个折衷方案。它表现为TRAP_WAIT,但是在连接的另一个站点上没有连接模块时,它不会阻塞模块。除了这些特定的超时之外,TRAP还支持超时时间间隔,即在存根操作的情况下,函数等待指定的微秒数,然后返回。

最后一个特性叫做多读。它可以在使用多个输入接口的模块中使用。多读允许并行地读取由掩码启用的所有接口的消息。读取操作由等待传入数据的一组进程线程完成。多读操作的结果以数组的形式提供,其中数组的每个元素包含操作的结果代码、接收的消息大小和接收到的消息数据的指针。

3.2统一记录

统一记录(UniRec)是通过TRAP接口发送的消息的特定数据格式。模块需要交换各种类型的数据,并且数据量可能非常大。这意味着在UniRec中反映了三个要求:

1)格式应该是灵活的,即它应该允许动态创建新的消息结构。

2)它还需要提高内存效率,也就是说,在消息传输过程中,它应该实现接近简单C结构的效率,以减少开销。

3)处理消息中的数据应该是快速的,即对消息元素的访问不应构成模块的瓶颈。

每个UniRec记录由多个字段组成,每个字段都有一个名称和一个类型。记录中的字段集称为模板。模板是通过枚举所有字段的名称来指定的。在全局配置文件中给出了可能字段名的列表,以及它们的类型和含义(当需要一个新字段时可以很容易地进行扩展)。每个TRAP接口只使用一个模板,即通过特定接口发送的所有消息都是相同的格式。任何由接口相互连接的两个模块必须在通用接口上使用相同的UniRec格式。模块的每个接口的模板在模块的初始化过程中定义。虽然输出接口的格式是由模块的函数提供的,但许多模块允许通过命令行参数指定其输入所期望的格式。

当存储在内存中或通过TRAP接口发送时,记录看起来类似于简单的C结构——单个字段一个接一个地存储,不需要额外的数据或填充。记录由一个静态部分组成,其中所有字段都有静态大小和动态部分,其中存储了动态大小的字段,见图6。动态字段存储在记录的末尾。对指向这些字段的末端的偏移量存储在静态部分的末尾。

模板(通常)是在模块的初始化过程中指定的,它提供了一个包含记录中所有字段名称的字符串。它被存储为一种结构信息,用于描述所使用的字段、其偏移量的表以及其他一些辅助信息。偏移表允许快速访问记录中的各个字段。

模板规范中的字段名顺序并不重要。记录中字段的顺序总是由以下规则决定:

1、首先是静态字段,然后是动态字段的偏移量,然后是动态字段的值。

2、静态部分中的字段按照递减顺序排列(因此,如果记录的开头是对齐的,那么所有字段都位于内存中的对齐位置)。

3、具有相同长度的字段按照名称的字母顺序进行排序。

使用简单的宏来访问字段,该宏将指针指向模板结构,指针指向记录的开头和字段的标识符。

与普通的C结构相比,对静态字段的访问只需要一个额外的CPU指令。额外的指令分别代表对小模板表的访问(很容易安装到L1缓存中),因此开销很小。不过,UniRec能够在运行时创建新的结构(模板),并支持具有动态大小的字段。

UniRec字段可能是由C语言支持的任何基本类型(签名/无符号整数和各种宽度的浮点数),一串字符,或两种特殊类型之一—一种用于存储时间戳的类型,具有子秒精度和通用结构来处理IPv4和IPv6地址。

出于性能方面的原因,UniRec中的所有数字字段都使用主机的本机字节。IP地址被认为是一组字节而不是一个数字,所以地址存储在大的endian(网络顺序)中。

4 平台评估(省略)

5 Nemea模块

在2013年底,有20多个Nemea模块实现了。它们中的许多与框架一起发布[6]。其他几个模块目前正在开发中。本节简要介绍一些已发布的模块。Nemea模块通常实现基本的消息处理或分析任务。

5.1处理模块

5.1.1 Nfdump阅读器

该模块是Nemea系统中可能的数据源之一。该模块读取储存在Nfdump格式的流记录的文件。这些流记录被转换成相应的UniRec记录并发送到输出接口。该模块能够按顺序读取多个文件。这些记录通常以最快的速度读取和发送,但是它们可以以较慢的速度发送给用户。

还有一个选项,可以按照流记录的结束时间戳来发送记录,并根据当前时间修改时间戳。

5.1.2流量计数

这个简单的模块有一个输入接口,它接收流记录。它计算这些流中的流和包的数量和流中的字节数。当模块终止时,计数被打印出来。它还可以选择在每N条记录中打印一个点。它主要用于测试。

5.1.3记录器

该模块将所有接收到的记录打印到标准输出或以人类可读格式写入文件。该模块可能有任意数量的输入,任何输入都可以使用任何UniRec格式。它允许选择应记录哪些输入记录字段。默认情况下,使用所有输入格式的联合。例如,该模块可以用于测试或记录某些检测器的结果。

5.1.4 TrapDump / TrapReplay

这些模块允许将任何数据流存储到一个文件中,并在以后重放,不管数据格式如何。这些模块主要用于调试或测试检测器。例如,可以存储一些包含攻击的数据,并将它们反复推送到检测器模块中,每次都使用经过测试的检测算法的不同参数,以查看攻击是否和何时检测到。

5.1.5 Anonymizer

该模块对流量记录流进行动态匿名化。对于在输入接口上接收的每个流记录,流的源和目标IP地址都是匿名的,记录被传递到输出接口。匿名化是使用可配置密钥的CryptoPAN方法完成的。

5.1.6熵

这个模块计算每个时间间隔内数据包头字段的流量和熵的统计信息。默认情况下,每隔5分钟计算出源和目标地址和端口的流、包和字节数和熵。还可以计算各种头字段组合的熵。如果可以获得关于捕获流的链路(或更一般地是关于观察点)的信息,则针对每个链路分别计算统计量。该模块的输出是基于时间序列分析的各种异常探测器的输入。

5.1.7流量过滤器

该模块检测中转流量,即在被监视的网络中不产生或终止的流。当然,这样的模块只有在有多个入口点的网络中才有意义。该模块需要在被监视网络内的所有IP地址范围的列表。它有两个输出,他在第一接口输出中转流量,第二接口输出非中转流量。

5.1.8.IPFIXcol的插件-IPFIX2UniRec

我们将插件应用到IPFIX收集器中以向我们的Nemea系统提供从CESNET计量点中收集的真实数据。IPFIX2UniRec将IPFIX记录转换为UniRec,并将其发送到输出接口。每个输出接口提供一个不同的UniRec模板,以允许不同级别的细节。一个基本的UniRec模板描述了到传输层的流记录。而应用程序级模板描述了属于HTTP和DNS协议的流记录。这个插件被用作Nemea系统中的主要数据来源。

5.1.9邮件报告生成器

该模块使用模板将传入的UniRec记录转换为电子邮件消息,并将其发送到SMTP服务器。该模板是一个电子邮件正文,引用了UniRec字段,该字段被输入记录的相应值所替代。该模块可用于向操作员报告检测模块的输出。

所有以前的模块都是用C或c++实现的。邮件报告生成器是在Python中使用Python包装器实现的模块的一个例子。在Python中编写模块要容易得多,但是这样的模块的性能要低得多,因此不适合需要处理大量数据的模块。

5.2分析模块

5.2.1 PCA

这个模块能检测到不同连接上的流量大小和/或流量特征的异常。该检测方法是基于主成分分析,是由Lakhina etal . al.[2]提出的一种众所周知的方法衍生而来的。对于每个检测到的异常,记录描述异常的记录被发送到模块输出。记录包含异常发生的时间戳、链接标识符和维度(即大小度量或熵字段)。可以通过上面描述的熵模块获得合适的输入数据。

5.2.2Astute

该模块执行[3]中所描述的Astute机敏的检测方法。该方法寻找连续两个时间窗口之间流量的相关变化。它计算了一个所谓的Astute机敏评估值。在正常的流量中,这个值应该接近于零,但是当大量的流量改变了流量或者同时出现/消失时,它就会显著地偏离零点。这些模块在每个时间窗口的末尾(默认为5分钟)输出这个值,用于不同级别的流聚合。随后的模块负责设置这些值的阈值并报告异常情况。

5.2.3 IP欺骗探测器

模块使用[5]中描述的方法检测欺骗源IP地址。该方法是为具有多个入口点的大型网络设计的。该方法学习哪些IP前缀通常通过哪个入口点。如果有太多的流通过不寻常的入口点进入到网络中,那么它就会报告欺骗。它还会查找所谓的bogon地址——在公共Internet中不应该存在的地址,例如来自私有或保留范围的地址和尚未分配的范围。该模块需要在被监视网络内的所有IP地址范围列表和一个bogon范围列表。此外,输入不应包含过境流量。这可以通过上面描述的传输过滤模块实现。

5.2.4黑名单过滤器

这是一组模块,允许使用给定的黑名单过滤流记录。每个传入流记录中的IP地址与一个或多个黑名单进行比较,如果找到匹配,则将匹配黑名单的数量添加到记录中,并将记录发送到输出。如果流记录包含从DNS或HTTP协议中提取的信息,则可能使用域名或url的黑名单,而不是IP地址。

5.2.5僵尸网络检测器

该模块实现了检测活动僵尸网络的方法。检测是基于观察潜在的bot的通信和计算概率值。该模块接收来自黑名单检测器的记录。黑名单检测器标记所有包含黑名单的命令和控制服务器的IP地址的记录。为了减少假警报,该算法观察到标记的通信是否符合bot主动和C&C服务器通信的特征。结果,模块输出IP地址和地址成为bot的概率。

5.2.6 HostStats

HostStatsNemea模块计算网络中每个主机(IP地址)网络流量的统计信息。使用简单的规则集搜索可疑行为的统计信息。这种可疑行为存储在日志文件中。

目前有检测主机扫描网络和检测DoS攻击者和受害者的规则。其他几个模块,主要用于检测各种类型的攻击和异常,正在开发中。此外,还开发了一个用于检测结果智能聚合的模块。该模块应该接收所有检测器的结果,并将它们与历史进行比较,评估每个事件的可信度和重要性,并将选定的事件报告给操作员。

6结论

这份技术报告总结了我们在网络流量分析方面的工作。我们的努力实现并部署了两个框架,TRAP和Nemea。TRAP被用作一种将异构数据以流方式传输到Nemea中实例化的流程的方法。我们的实践经验表明,这一概念是可行的,可以很好地处理从大型网络收集到的数据。Nemea构成了处理流数据和数据分析的各种模块。其中一些模块是随时可用的,并已部署用于分析现实中的网络问题,并取得了令人满意的结果。其他

模块处于不同的开发阶段。

我们未来的工作包括开发更多的模块来解决各种攻击和异常的检测。目标是聚合并关联检测到的事件,以验证攻击以及监视攻击历史。我们还计划进一步阐述行为分析与可用黑名单的相关性。检测结果将反馈给Warden [7], CESNET早期预警系统。额外的工作将集中于分析从应用程序层提取的数据。正在开发一个管理器来管理运行中的Nemea模块。

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

推荐阅读更多精彩内容

  • 来源:Lidong Wang*, Randy Jones。Big Data Analytics for Netwo...
    Threathunter阅读 6,469评论 1 3
  • 点击查看原文 Web SDK 开发手册 SDK 概述 网易云信 SDK 为 Web 应用提供一个完善的 IM 系统...
    layjoy阅读 13,675评论 0 15
  • 提笔想写很多,但又思绪很乱……
    半夏花开_3618阅读 216评论 0 1
  • 记得上一次咳嗽也是去年的这个时候,开始是嗓子疼,后面就开始咳嗽不止,吃了药反而更加咳得厉害,表示无奈…… 现在干脆...
    Air糖阅读 142评论 0 0
  • 这两天吴秀波的设计小三被抓这件事火爆网络,今天日更我也来蹭蹭热度。 对于这件事,现在网络上最流行的就放上一张吴秀波...
    沐月华阅读 289评论 1 3