《数据驱动的网络分析》——2.2 封包数据

2.2 封包数据

在本书的语境中,封包数据实际上意味着libpcap的输出,这种输出可能是通过IDS或者tcpdump完成。libpcap最初由LBNL的网络研究组开发,是基本的网络捕捉工具,可以作为snort、bro和tcpdump等工具的采集器。

在封包捕捉数据中寻找有价值的信息如同大海捞针。这类数据的捕捉需要平衡海量的可捕捉数据和真正有意义的少数数据之间的关系。

2.2.1 封包和帧格式
在几乎所有现代化系统上,tcpdump将在以太网上捕捉IP,这意味着libpcap捕捉的数据实际上是包含了IP封包的以太网帧。虽然IP包含了超过80个不同的协议,但是在任何可用的网络上,绝大多数流量是从3个协议中产生的:TCP(协议 6)、UDP(协议17)和ICMP(协议 1)。

TCP、UDP和ICMP占据了IP流量的绝大部分,不过许多其他协议也可能出现在网络中,特别是在使用VPN的情况下。IANA有一个IP协议组的完整列表,其中重要的包括IPv6(协议 41)、GRE(协议 47)和ESP(协议 50)。GRE和ESP用于VPN通信。

完全的pcap捕捉往往不切实际。海量的冗余数据使得在合理的时间内保存网络流量中有意义的部分十分困难。封包捕捉数据的过滤和限制机制主要有3种:使用滚动缓存(Rolling buffers)保存同步的子样本;操纵快照长度,只捕捉固定长度的封包(例如报头);用BPF或者其他过滤规则过滤流量。每种方法都是分析上的一种妥协,各有优劣。

2.2.2 滚动缓存
滚动缓存(rolling buffer)是内存中的一个位置,数据在这里循环转储:信息被顺序丢弃,当缓冲区被填满时,数据被转储到缓冲区的开始位置,这一过程重复进行。例2-1给出了tcpdump使用滚动缓冲区的例子。在本例中,该过程向磁盘写入大约128MB数据,然后轮转到一个新的文件。当32个文件被填满(由-W开关指定),过程重新开始。

例2-1 在tcpdump中使用滚动缓存

host$ tcpdump -i en1 -s 0 -w result -C 128 -W 32

滚动缓存在流量分析上实现了一个时间范围:数据只能在缓冲区中读取。因此,建议使用较小的文件尺寸,因为当你发现异常现象时,必须快速地将其从缓存中取出。

2.2.3 限制每个封包中捕捉的数据
捕捉完整封包的替代方法是捕捉载荷的有限子集,在tcpdump中由快照长度(-s)参数控制。快照长度将封包限制在参数中指定的帧尺寸。如果你指定至少68个字节的帧尺寸,就能够记录TCP或者UDP报头(Header)1。这种解决方案不能很好地代替NetFlow(本章后面将作讨论)。

2.2.4 过滤特定类型封包
在交换机上进行过滤的替代方法之一是在镜像端口采集流量之后进行过滤。利用tcpdump和其他工具,这一方法很容易用伯克利封包过滤(Berkeley Packet Filtering,BPF)实现。BPF允许操作员指定任意的复杂过滤,因此你可以选择的范围非常广。本节将用实例说明一些有用的选项。图2-6提供了以太网帧、IP、UDP、ICMP和TCP报头的分解。

在我们介绍这些主要字段的时候,会指出描述和用于过滤这些字段的BPF宏。在大部分UNIX风格的系统中,pcap-filter manpage提供了BPF语法的汇总,Free BSD 的BPF manpage(http://bit.ly/bsd-manpages)中还总结了可用的命令。
在以太网帧中,最为关键的字段是两个MAC地址。这些48个字节的字段用于识别发送和接收流量的接口硬件地址。MAC地址被限制在一个冲突域中,并会在封包穿越多个网络时被修改(例见图2-5)。在BPF中,MAC地址用ether src和ether dst谓词访问。

tcpdump和MAC地址

大部分tcpdump实现需要一个命令行参数,才能显示链路级(以太网)信息。在Mac OS X中,-e开关将显示MAC地址。
在IP报头中,你最感兴趣的字段通常是IP地址、长度、TTL和协议。IP标识符、标志和用于涉及封包重新组装攻击的分段偏移——但是,它们也是以太网成为通用传输协议之前的历史遗迹。你可以用src host和dst host谓词访问IP地址,这些谓词还可以过滤网络掩码。

BPF中的地址过滤

BPF中的地址可以使用host和net谓词过滤。为了理解这些谓词的工作方式,我们来看一个简单的tcpdump输出。

host$ tcpdump -n -r sample.pcap | head -5
reading from file sample.pcap, link-type EN10MB (Ethernet)
20:01:12.094915 IP 192.168.1.3.56305 > 208.78.7.2.389: Flags [S],
 seq 265488449, win 65535, options [mss 1460,nop, wscale 3,nop,
 nop,TS val 1111716334 ecr 0,sackOK,eol], length 0
20:01:12.094981 IP 192.168.1.3.56302 > 192.168.144.18.389: Flags [S],
 seq 1490713463, win 65535, options [mss 1460,nop,wscale 3,nop,
 nop,TS val 1111716334 ecr 0,sackOK,eol], length 0
20:01:12.471014 IP 192.168.1.102.7600 > 192.168.1.255.7600: UDP, length 36
20:01:12.861101 IP 192.168.1.6.17784 > 255.255.255.255.17784: UDP, length 27
20:01:12.862487 IP 192.168.1.6.51949 > 255.255.255.255.3483: UDP, length 37

src host或者dst host将过滤准确的IP地址,下面过滤进出192.168.1.3的流量:

host$ tcpdump -n -r sample.pcap src host 192.168.1.3 | head -1
reading from file sample.pcap, link-type EN10MB (Ethernet)
20:01:12.094915 IP 192.168.1.3.56305 > 208.78.7.2.389: Flags [S],
 seq 265488449, win 65535, options [mss 1460,nop,wscale 3,nop,
 nop,TS val 1111716334 ecr 0,sackOK,eol], length 0
host$ tcpdump -n -r sample.pcap dst host 192.168.1.3 | head -1
reading from file sample.pcap, link-type EN10MB (Ethernet)
20:01:13.898712 IP 192.168.1.6.48991 > 192.168.1.3.9000: Flags [S],
 seq 2975851986, win 5840, options [mss 1460,sackOK,TS val 911030 ecr 0,
 nop,wscale 1], length 0

src net和dst net可以过滤网络地址块。下面的例子说明如何用地址或者CIDR标记法逐步过滤192.168.1 网络中的地址:

使用 src net 匹配8位字节,进行过滤

host$ tcpdump -n -r sample.pcap src net 192.168.1 | head -3
reading from file sample.pcap, link-type EN10MB (Ethernet)
20:01:12.094915 IP 192.168.1.3.56305 > 208.78.7.2.389: Flags [S],
 seq 265488449, win 65535, options [mss 1460,nop,wscale 3,nop,nop,
 TS val 1111716334 ecr 0,sackOK,eol], length 0
20:01:12.094981 IP 192.168.1.3.56302 > 192.168.144.18.389: Flags [S],
 seq 1490713463, win 65535, options [mss 1460,nop,wscale 3,nop,
 nop,TS val 1111716334 ecr 0,sackOK,eol], length 0

匹配一个地址

host$ tcpdump -n -r sample.pcap src net 192.168.1.5 | head -1
reading from file sample.pcap, link-type EN10MB (Ethernet)
20:01:13.244094 IP 192.168.1.5.50919 > 208.111.133.84.27017: UDP, length 84

使用CIDR地址块匹配

host$ tcpdump -n -r sample.pcap src net 192.168.1.64/26 | head -1
reading from file sample.pcap, link-type EN10MB (Ethernet)
20:01:12.471014 IP 192.168.1.102.7600 > 192.168.1.255.7600: UDP, length 36

使用ip proto谓词可以过滤协议。BPF还提供各种特定于协议的谓词,如tcp、udp和icmp。封包长度可以用less和greater谓词过滤,而TTL的过滤需要更高级的位操作,后面将讨论。

下面的代码片段过滤除了来自指定网络地址块(使用24位掩码的主机)之外的所有流量。

host$ tcpdump -i en1 -s 0 -w result src net 192.168.2.0/24

例2-2演示了tcpdump的过滤。

例2-2 使用tcpdump的过滤示例

host$ # 过滤内部流量之外的所有流量
host$ tcpdump -i en1 -s 0 -w result src net 192.168.2.0/24 && dst net \
    192.168.0.0/16
host$ # 过滤由端口指定的Web流量之外的所有流量
host$ tcpdump -i en1 -s 0 -w result ((src port 80 || src port 443) && \
    (src net 192.168.2.0))

在TCP中,端口号和标志最为关键。TCP标志用于维护TCP状态机制,而端口号用于区分会话和服务标识。端口号可以用src port和dst port开关过滤,也可以用src portrange和dst portrange开关过滤端口范围。BPF支持多种TCP标志谓词,包括tcp-fin、tcp-syn、tcp-rst、tcp-push、tcp-ack和 tcp-urg。

地址分类和CIDR地址块

IPv4地址是一个32位的整数。为方便起见,这些整数通常使用句点分隔四元组标记法,如o1.o2.o3.o4,所以0x000010FF代表的IP地址被写作0.0.16.255。3层路由几乎从来不是对单独的地址进行的,而是对一组地址—历史上曾称作分类(Class),现在称作网段(netblock)。

A类地址(0.0.0.0~127.255.255.255)的最高位设置为0,接下来的7位分配给某个实体,剩下的24位由所有者控制。这为所有者提供了224个地址。B类地址(128.0.0.0~191. 255.255.255)将16位分配给所有者,而C类(192.0.0.0~223.255.255.255)分配8位。这种方法导致地址很快耗尽,1993年开发的无类域际路由(Classless Inter-Domain Routing,CIDR)代替了原来的分类系统。在CIDR方案中,通过地址和一个网络掩码向用户分配网段。网络掩码表示地址中用户可以操纵的位数,根据惯例,这些位被设置为0。例如,拥有192.28.3.0~192.38.3.255的用户所得到的网段为192.28.3.0/24。
和TCP一样,UDP端口号也是最重要的,可以用和TCP相同的port和portrange开关访问。

因为ICMP是互联网的错误信息传递协议,ICMP消息包含的数据往往极其丰富。ICMP类型和代码最为重要,它们定义了后续载荷(如果有的话)的语法。BPF提供了各种特定于类型和代码的过滤器,包括icmp-echoreply、icmp-unreach、 icmptstamp和icmp-redirect。

2.2.5 如果不是以太网怎么办
为了简洁起见,本书专门针对以太网上的IP,但是你可能会经常遇到其他的传输和数据协议。大部分这类协议都是专用的,其中许多种协议除了在libpcap上构建的工具之外还需要其他的捕捉软件。

ATM

异步传输模式(Asynchronous Transfer Mode,ATM)是20世纪90年代重要的IP传输协议,现在大部分用于ISDN和PSTN传输,以及一些遗留的设备。

光纤通道

光纤通道(Fibre Channel)主要用于高速存储,是各种SAN实现的支柱。

CAN

CAN是Controller Area Network(控制器区域网络)的缩写,主要和车载网络等嵌入式系统有关,CAN是一种总线协议,用于在小型的隔离网络中发送消息。

任何形式的过滤都有性能方面的代价。在交换机或者路由上使用镜像端口会牺牲性能,交换机或者路由可能将这些性能用于通信。过滤器越复杂,过滤器软件增加的开销也就越大。在带宽较大的情况下,这可能是一个问题。

时间: 2024-08-14 19:05:43

《数据驱动的网络分析》——2.2 封包数据的相关文章

《数据驱动的网络分析》——第6章 R安全分析简介

第6章 R安全分析简介 R是一个开源统计分析软件包,最初由奥克兰大学的Ross Ihaka和Robert Gentleman开发.R的设计者主要是统计学家和数据分析人员,与商业统计软件包(如S和SPSS)关联.R是用于探索性数据分析的工具包,它提供了统计建模和数据操纵能力.可视化和一个全功能的编程语言. R可以满足多种分析需求.分析工作需要某些工具来创建和操纵汇总原始数据的小型临时数据库.例如,从特定主机采集.按照服务分解的每小时流量汇总.这些数据表比原始数据更复杂,但是其目的不是为了最后发布-

《数据驱动的网络分析》——第2章 网络传感器2.1 网络分层及其对测量的影响

第2章 网络传感器 网络传感器直接从网络通信中采集数据,不需要中介应用程序作为代理,这使其不同于第3章中讨论的基于主机传感器.这方面的例子包括路由器上的NetFlow传感器,以及使用tcpdump等嗅探工具采集流量的传感器. 网络流量所面临的挑战是你在所有日志数据中都会遇到的:真正的安全事件很少,而数据在时间和存储空间上都有代价.只要可能,首选日志数据,因为它清晰(日志数据记录了高级事件)而紧凑.网络流量中的相同事件必需从几百万个数据包中提取,这些数据包往往是冗余.加密或者难以理解的.与此同时,

VB/VB. NET 实现 发送封包数据

问题描述 请问如何使用VB/VB.NET实现发送封包数据我想修改数据包的源地址和源端口然后再发送 解决方案 解决方案二:不好意思,这方面我没经验.没接触过.解决方案三:能做到吗?如果能做到,你可以让别人的QQ消息全转到自己的来了.解决方案四:我对涉及网络通讯这一块的,一窍不同解决方案五:呵呵!!好的!!还是谢谢你来关注!!!解决方案六:我找到一份VC写的发送数据包的!!如果您有空,请帮我看看..能不能转到VB.NET下实现!!谢谢!!解决方案七:socket收发对协议包自己封解包楼主需要列出封包

《数据驱动的网络分析》——导读

内容提要传统的入侵检测和日志文件分析已经不再足以保护当今的复杂网络,本书讲解了多种网络流量数据集的采集和分析技术及工具,借助这些工具,可以迅速定位网络中的问题,并采取相应的行动,保障网络的运行安全. 本书分为3部分,共15章,内容包括数据采集的常规过程,用于采集网络流量的传感器,基于特定系统的传感器,数据存储和分析,使用互联网层次知识系统(SiLK)分析NetFlow数据,用于安全分析的R语言简介.入侵检测系统的工作机制以及实施,确定实施攻击的幕后真凶,探索性数据分析以及数据可视化,检查通信流量

《数据驱动的网络分析》——2.3 NetFlow

2.3 NetFlow NetFlow是Cisco开发的流量汇总标准,最初用于网络服务记账.虽然本意不是为了安全性,但是人们臆测NetFlow对此有益,因为它提供了紧凑的网络通信会话摘要,可以快速访问,并且包含了以相对紧凑的格式保存的最高价值信息.从1999年flow-tools软件包发布以来,NetFlow越来越多地用于安全分析,已经开发出了各种工具,这些工具为NetFlow提供了更多的字段,例如可选择的载荷片段. NetFlow的核心是流(Flow)的概念,它与TCP会话近似.回忆前面介绍的

Science:大数据时代的网络分析,如何挖掘大数据?

我们生活在一个互联实体(entities)构成的复杂世界中.人类涉足的所有领域,从生物学到医学.经济学和气候科学,都充满了大规模数据集. 这些数据集将实体(entities)模拟为节点.节点之间的连接被模拟为边(edges),从不同且互补的角度描述着复杂的真实世界系统.这些网络化数据是特定领域信息的新的丰富来源,不过,目前,大部分信息却隐藏在这种复杂连接模式(wiring patterns)中. 首当其冲的就是解码这些模式,因为计算分析大型网络通常会很棘手,以至于我们关于这个世界的许多疑问都无法

《数据驱动的网络分析》——6.2 R语言基础知识

6.2 R语言基础知识 本节是R语言的速成教程.R是一种特性丰富的语言,我也只是略懂一二.但是,在本节结束时,你就能够编写简单的R程序,在命令行上运行,并将其保存为一个库. 6.2.1 R提示符 启动R,将会显示一个窗口和命令提示符.图6-1展示了一个R控制台的例子.如图所示,控制台主要是一个大的文本窗口,顶部的一系列按钮提供了辅助功能.注意按钮栏下的两个文本框,第一个显示当前工作目录,第二个是帮助功能.R有很好的文档,所以一定要习惯使用帮助框. 在图6-1中,我输入了几条简单的命令: > s<

《数据驱动的网络分析》——6.3 使用R工作区

6.3 使用R工作区 R为用户提供了一个持久化的工作区,也就是说,当用户退出R会话,他们可以选择保存数据和变量供未来使用.这一操作基本上是透明完成的,如下面的命令行示例: > s<-1:15 > s [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 > t<-(s*3) - 5 > t [1] –2 1 4 7 10 13 16 19 22 25 28 31 34 37 40 > Save workspace image? [y/n/

《数据驱动的网络分析》——6.4 数据帧

6.4 数据帧 数据帧(Data Frame)是R的一种独特结构,从分析人员的角度说,它也是最重要的结构.数据帧是一个临时数据表,在这种表格结构中,每列代表一个变量.在其他语言中,数据帧通过使用数组或者散列表部分实现,但是R将数据帧作为一种基本结构,从一开始就提供了更为复杂的数据帧选择.过滤和操纵机制. 我们从创建一个简单的数据帧开始(如例6-1所示).构造数据帧的最简单方法是在一组相同大小的矢量上使用data.frame操作. 例6-1 创建一个数据帧 > names<-c('Manny',