数据采集技术归纳
流量采集技术
- Sniffer
嗅探法是一种常用的网络技术,通过在交换机的镜像端口设置数据采集点,来捕获数据报文的,这种方式采集的信息最全面,可以完全复制网络中的数据报文。但是Sniffer技术的应用也受到了一定的限制,大多数厂商的设备不支持跨VLAN或者跨模块镜像数据,因此可能需要在多个网段安装装探针,在部署上比较复杂,一般企业网络VLAN数量很多,一般都不可能实现全部VLAN的监控。流量很大的网络中采用端口镜像对网络设备的性能也会造成一定的影响,而且对所有数据报文都进行采集在吞吐量很大的网络中也是难以实现的。 - SNMP
Snmp是一种主动的采集方式,采集程序需要定时取出路由器内存中的IPAccounting记录,同时清空相应的内存记录,才能继续采集后续的数据,这对路由器的性能造成较大的影响,取得的数据只包含口层的数据,没有MAC地址信息,对于伪造源口地址的蠕虫病毒无能为力。 - Netflow
Netflow是Cisco公司的专有技术,早期的Netflow版本需要统计所有的网络数据报文,因此对网络设备性能影响较大,v8以后的版本提供了采样功能,但是Netflow数据中只有基于流的统计信息,只记录口、端口等数据,也没有MAC地址信息。 - sFlow
sflow采用采样的方式,通过设置一定的采样率,进行数据捕获,对网络设备的性能影响很小。sFlow agent一般采集数据报文前128个字节,通过封装后发往sFlow receiver,数据报文中包括了完整的源和目标的MAC地址、协议类型、TCP/UDP、端口号、应用层协议,甚至URL信息。
Netflow技术简介
NetFlow是Cisco公司提出的网络数据包交换技术,该技术首先被用于网络设备对数据交换进行加速,并可同步实现对高速转发的IP数据流(Flow)进行测量和统计。经过多年的技术演进,NetFlow原来用于数据交换加速的功能已经逐步改由网络设备中的专用集成电路(ASIC)芯片实现,而对流经网络设备的IPFlow进行测量和统计的功能却更加成熟,并成为当今互联网领域公认的最主要的IP流量分析、统计和计费行业标准。
为对运营商网络中不同类型的业务流进行准确的流量和流向分析与计量,首先需要对网络中传输的各种类型数据包进行区分。由于IP网络的非面向连接特性,网络中不同类型业务的通信可能是任意一台终端设备向另一台终端设备发送的一组IP数据包,这组数据包实际上就构成了运营商网络中某种业务的一个Flow。如果管理系统能对全网传送的所有Flow进行区分,准确记录传送时间、传送方向和Flow的大小,就可以对运营商全网所有业务的流量和流向进行分析和统计。
通过分析网络中不同Flow之间的差别,可以发现判断任何两个IP数据包是否属于同一个Flow,实际上可以通过分析IP数据包的以下7个属性来实现:
a)源IP地址;
b)目标IP地址;
c)源通信端口号;
d)目标通信端口号;
e)第三层协议类型;
f)服务类型(TOS)字节;
g)网络设备输入或输出的逻辑网络端口(iflndex)。
Cisco公司的NetFlow技术就是利用分析IP数据包的上述7个属性,快速区分网络中传送的各种不同类型业务的Flow。对区分出的每个Flow,NetFlow技术可以进行单独跟踪和准确计量,记录其传送方向和目的地等流向特性,统计其起始和结束时间、服务类型、包含的数据包数量和字节数量等流量信息。
在NetFlow技术的演进过程中,Cisco公司一共开发出了NetFlow V1、NetFlow V5、NetFlow V7、NetFlow V8和NetFlow V9 等5个主要的实用版本。
NetFlow的数据输出要求先在路由器和交换机上定制NetFlow流输出,并选择输出流的版本、个数、缓冲区的大小等,配置相应NetFlow流量收集器(FlowCollector)的IP地址、端口等信息。此时路由器或交换机可以用户数据报协议(UDP)的方式向外发送流信息,然后在NetFlow的FlowCollector端配置接收端口号,设置汇聚、过滤策略和流量文件存放目录、格式等。NetFlow有非采样和采样两种使用模式。
一般来说,NetFlow FlowCollector都选用UNIX工作站来收集数据,NetFlow的FlowCollector收集的数据将存放在本地磁盘中(路径由用户定义)。同时,它也可以通过网关以Socket方式发送信息到其他网管分析软件,或直接读取存放在NetFlow FlowCollector工作站中的数据文件,对其进行分析处理。
NetFlow记录的流包含了丰富的信息,非常适合于网络性能分析。NetFlow不需要其他硬件流量设备的支持,开启和关闭都非常方便,因此在国外已有很多运营商用它来收集流量,服务于网络规划、设计和优化等领域。但开启NetFlow需要消耗一定的路由器资源(CPU和内存)。
根据NetFlow的特点,该技术非常适用于大型网络。NetFlow采集实施成本较低、安装方便,而且不受速率的限制,是目前运营商流量监测的首选技术。
Netflow优点
- NetFlow采集实施成本较低、安装方便。
- NetFlow的非常适用于大型网络。
- NetFlow记录的流包含了丰富的信息,非常适合于网络性能分析。
采集到的NetFlow数据,结合边界网关协议(BGP)路由信息,可以更加精确地分析路由信息和互联流量的自治域(AS)属性。
附加(AS内容):
- 什么是AS自治域?
全球的互联网被分成很多个AS自治域,每个国家的运营商、机构、甚至公司等都可以申请AS号码,AS号码是有限的,最大数目是65536。各自分配的IP地址被标清楚属于哪个AS号码,在全球互联网上,假如一封email从一个a IP地址发往另外一个b IP地址,这封email必须要知道a的IP地址属于的AS号码A到b的IP地址属于的AS号码B如何走,然后就沿着这条路到达目的IP地址。在国外,尤其美国,很多公司都有自己的AS号码,也可能有好几个,而国内申请到的AS号码很少,仅是几个运营商持有,不超过30个。在IPv4的互联网时代,我们是弱势的。 - AS自治域与网络路由协议
根据是否在一个自治域内部使用,动态路由协议分为内部网关协议(IGP:inner gateway protocol)和外部网关
协议(EGP:Exterior Gateway Protocol)。自治域内部采用的路由选择协议称为内部网关协议,常用的有RIP、
OSPF;外部网关协议主要用于多个自治域之间的路由选择,常用的是BGP和BGP-4。BGP是自治系统之间的路由选择协议,用于连接Internet。
- RIP(routing information protocol)路由信息协议
- OSPF (open shortest path first)开放最短路径优先
- BGP ( border gateway protocol ) 边界网关协议
Tcpdump介绍
tcpdump,用简单的语言概括网络上传输的数据包进行捕获的抓包就是dump the traffic on a network, 是一个运行在linux平台可以根据使用者需求对网络上传输的数据包进行捕获的抓包工具,tcpdump可以将网络中传输的数据包的“包头”全部捕获过来进程分析,其支持网络层、特定的传输协议、数据发送和接收的主机、网卡和端口的过滤,并提供and、or、not等语句进行逻辑组合捕获数据包或去掉不用的信息。
命令格式:tcpdump [ 选项 ] [ -c 数量 ] [ -i 网络接口 ] [ -w 文件名 ] [ 表达式 ]
常用选项:
-l:使标准输出变为缓冲行形式;
-c:抓包次数;
-nn:直接以 IP 及 Port Number 显示,而非主机名与服务名称;
-s :<数据包大小> 设置每个数据包的大小;
-i:指定监听的网络接口;
-r:从指定的文件中读取包;
-w:输出信息保存到指定文件;
-a:将网络地址和广播地址转变成名字;
-d:将匹配信息包的代码以人们能够理解的汇编格式给出;
-e:在输出行打印出数据链路层的头部信息;
-f:将外部的Internet地址以数字的形式打印出来;
-t:在输出的每一行不打印时间戳;
-v :输出稍微详细的报文信息;加一个v更详细。
四种表达式:过滤报文条件
1、关于类型的关键字,主要包括host,net,port, 例如 host210.27.48.2,指明 210.27.48.2是一台主机,net 202.0.0.0 指明202.0.0.0是一个网络地址,port 23 指明端口号是23。如果没有指定类型,缺省的类型是host。
2、确定传输方向的关键字,主要包括src, dst ,dst or src, dst and src,这些关键字指明了传输的方向。例如 src210.27.48.2 ,指明ip包中源地址是210.27.48.2, dst net 202.0.0.0 指明目的网络地址是202.0.0.0 。如果没有指明方向关键字,则缺省是src or dst关键字。
3、协议的关键字,主要包括ip,arp,tcp,udp等类型。
4、三种逻辑运算,与运算是’and’,'&&’; 或运算是’or’ ,’||’; 非运算是 ‘not ‘ ‘! ‘。
注意,tcpdump只能抓取流经本机的数据包
(1).默认启动
tcpdump
默认情况下,直接启动tcpdump将监视第一个网络接口(非lo口)上所有流通的数据包。这样抓取的结果会非常多,滚动非常快。
(2).监视指定网络接口的数据包
tcpdump -i eth1
如果不指定网卡,默认tcpdump只会监视第一个网络接口,如eth0。
(3).监视指定主机的数据包,例如所有进入或离开longshuai的数据包
tcpdump host longshuai
(4).打印helios<-->hot或helios<-->ace之间通信的数据包
tcpdump host helios and ( hot or ace )
(5).打印ace与任何其他主机之间通信的IP数据包,但不包括与helios之间的数据包
tcpdump ip host ace and not helios
(6).截获主机hostname发送的所有数据
tcpdump src host hostname
(7).监视所有发送到主机hostname的数据包
tcpdump dst host hostname
(8).监视指定主机和端口的数据包
tcpdump tcp port 22 and host hostname
(9).对本机的udp 123端口进行监视(123为ntp的服务端口)
tcpdump udp port 123
(10).监视指定网络的数据包,如本机与192.168网段通信的数据包,"-c 10"表示只抓取10个包
tcpdump -c 10 net 192.168
(11).打印所有通过网关snup的ftp数据包(注意,表达式被单引号括起来了,这可以防止shell对其中的括号进行错误解析)
shell> tcpdump 'gateway snup and (port ftp or ftp-data)'
(12).抓取ping包
[[email protected] ~]# tcpdump -c 5 -nn -i eth0 icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
12:11:23.273638 IP 192.168.100.70 > 192.168.100.62: ICMP echo request, id 16422, seq 10, length 64
12:11:23.273666 IP 192.168.100.62 > 192.168.100.70: ICMP echo reply, id 16422, seq 10, length 64
12:11:24.356915 IP 192.168.100.70 > 192.168.100.62: ICMP echo request, id 16422, seq 11, length 64
12:11:24.356936 IP 192.168.100.62 > 192.168.100.70: ICMP echo reply, id 16422, seq 11, length 64
12:11:25.440887 IP 192.168.100.70 > 192.168.100.62: ICMP echo request, id 16422, seq 12, length 64
5 packets captured
6 packets received by filter
0 packets dropped by kernel
如果明确要抓取主机为192.168.100.70对本机的ping,则使用and操作符。
[[email protected] ~]# tcpdump -c 5 -nn -i eth0 icmp and src 192.168.100.62
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
12:09:29.957132 IP 192.168.100.70 > 192.168.100.62: ICMP echo request, id 16166, seq 1, length 64
12:09:31.041035 IP 192.168.100.70 > 192.168.100.62: ICMP echo request, id 16166, seq 2, length 64
12:09:32.124562 IP 192.168.100.70 > 192.168.100.62: ICMP echo request, id 16166, seq 3, length 64
12:09:33.208514 IP 192.168.100.70 > 192.168.100.62: ICMP echo request, id 16166, seq 4, length 64
12:09:34.292222 IP 192.168.100.70 > 192.168.100.62: ICMP echo request, id 16166, seq 5, length 64
5 packets captured
5 packets received by filter
0 packets dropped by kernel
注意不能直接写icmp src 192.168.100.70,因为icmp协议不支持直接应用host这个type。
(13).抓取到本机22端口包
[[email protected] ~]# tcpdump -c 10 -nn -i eth0 tcp dst port 22
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
12:06:57.574293 IP 192.168.100.1.5788 > 192.168.100.62.22: Flags [.], ack 535528834, win 2053, length 0
12:06:57.629125 IP 192.168.100.1.5788 > 192.168.100.62.22: Flags [.], ack 193, win 2052, length 0
12:06:57.684688 IP 192.168.100.1.5788 > 192.168.100.62.22: Flags [.], ack 385, win 2051, length 0
12:06:57.738977 IP 192.168.100.1.5788 > 192.168.100.62.22: Flags [.], ack 577, win 2050, length 0
12:06:57.794305 IP 192.168.100.1.5788 > 192.168.100.62.22: Flags [.], ack 769, win 2050, length 0
12:06:57.848720 IP 192.168.100.1.5788 > 192.168.100.62.22: Flags [.], ack 961, win 2049, length 0
12:06:57.904057 IP 192.168.100.1.5788 > 192.168.100.62.22: Flags [.], ack 1153, win 2048, length 0
12:06:57.958477 IP 192.168.100.1.5788 > 192.168.100.62.22: Flags [.], ack 1345, win 2047, length 0
12:06:58.014338 IP 192.168.100.1.5788 > 192.168.100.62.22: Flags [.], ack 1537, win 2053, length 0
12:06:58.069361 IP 192.168.100.1.5788 > 192.168.100.62.22: Flags [.], ack 1729, win 2052, length 0
10 packets captured
10 packets received by filter
0 packets dropped by kernel
(14).解析包数据
[[email protected] ~]# tcpdump -c 2 -q -XX -vvv -nn -i eth0 tcp dst port 22
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
12:15:54.788812 IP (tos 0x0, ttl 64, id 19303, offset 0, flags [DF], proto TCP (6), length 40)
192.168.100.1.5788 > 192.168.100.62.22: tcp 0
0x0000: 000c 2908 9234 0050 56c0 0008 0800 4500 ..)..4.PV.....E.
0x0010: 0028 4b67 4000 4006 a5d8 c0a8 6401 c0a8 .([email protected]@.....d...
0x0020: 643e 169c 0016 2426 5fd6 1fec 2b62 5010 d>....$&_...+bP.
0x0030: 0803 7844 0000 0000 0000 0000 ..xD........
12:15:54.842641 IP (tos 0x0, ttl 64, id 19304, offset 0, flags [DF], proto TCP (6), length 40)
192.168.100.1.5788 > 192.168.100.62.22: tcp 0
0x0000: 000c 2908 9234 0050 56c0 0008 0800 4500 ..)..4.PV.....E.
0x0010: 0028 4b68 4000 4006 a5d7 c0a8 6401 c0a8 .([email protected]@.....d...
0x0020: 643e 169c 0016 2426 5fd6 1fec 2d62 5010 d>....$&_...-bP.
0x0030: 0801 7646 0000 0000 0000 0000 ..vF........
2 packets captured
2 packets received by filter
0 packets dropped by kernel
tcpdump能帮助我们捕捉并保存网络包,保存下来的网络包可用于分析网络负载情况,包可通过tcpdump命令解析,也可以保存成后缀为pcap的文件,使用wireshark等软件进行查看。
以下将给出9个使用tcpdump的例子,以说明tcpdump的具体使用方法。
1.针对特定网口抓包(-i选项)
当我们不加任何选项执行tcpdump时,tcpdump将抓取通过所有网口的包;使用-i选项,我们可以在某个指定的网口抓包:
linux:/tmp/lx # tcpdump -i eth0
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
10:50:28.607429 IP 10.70.121.92.autodesk-lm > 10.71.171.140.ssh: . ack 116 win 64951
10:50:28.607436 IP 10.71.171.140.ssh > 10.70.121.92.autodesk-lm: P 116:232(116) ack 1 win 12864
10:50:30.384195 arp who-has 128.128.128.35 tell 128.128.128.35
2.抓取指定数目的包(-c选项)
默认情况下tcpdump将一直抓包,直到按下”ctrl+c”中止,使用-c选项我们可以指定抓包的数量:
linux:/tmp/lx # tcpdump -c 2 -i eth0
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
10:58:05.656104 IP 10.71.171.140.ssh > 10.70.121.92.autodesk-lm: P 1210443473:1210443589(116) ack 2583117929 win 12864
10:58:05.657074 IP 10.70.121.92.autodesk-lm > 10.71.171.140.ssh: . ack 116 win 65211
packets captured
packets received by filter
packets dropped by kernel
以上例子中,只针对eth0网口抓2个包。
3.将抓到包写入文件中(-w选项)
使用-w选项,我们可将抓包记录到一个指定文件中,以供后续分析
linux:/tmp/lx # tcpdump -w 20120606.pcap -i eth0
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
packets captured
packets received by filter
packets dropped by kernel
应当保存为.pcap后缀的文件,方便我们使用wireshark等工具读取分析。
4.读取tcpdump保存文件(-r选项)
对于保存的抓包文件,我们可以使用-r选项进行读取:
linux:/tmp/lx # tcpdump -r 20120606.pcap
reading from file 20120606.pcap, link-type EN10MB (Ethernet)
11:01:57.392907 IP 10.71.171.140.ssh > 10.70.121.92.autodesk-lm: P 1210446405:1210446457(52) ack 2583119957 win 12864
11:01:57.392917 IP 10.71.171.140.ssh > 10.70.121.92.autodesk-lm: P 52:168(116) ack 1 win 12864
11:01:57.393649 IP 10.70.121.92.autodesk-lm > 10.71.171.140.ssh: . ack 52 win 65327
5.抓包时不进行域名解析(-n选项)
默认情况下,tcpdump抓包结果中将进行域名解析,显示的是域名地址而非ip地址,使用-n选项,可指定显示ip地址
6.增加抓包时间戳(-tttt选项)
使用-tttt选项,抓包结果中将包含抓包日期:
linux:/tmp/lx # tcpdump -n -tttt -i eth0
2012-06-06 11:14:59.539736 IP 10.71.171.140.22 > 10.70.121.95.1787: P 1:53(52) ack 100 win 7504
2012-06-06 11:14:59.539754 IP 10.71.171.140.22 > 10.70.121.95.1787: P 53:105(52) ack 100 win 7504
2012-06-06 11:14:59.539770 IP 10.71.171.140.22 > 10.70.121.95.1787: P 105:157(52) ack 100 win 7504
7.抓取特定目标ip和端口的包
网络包的内容中,包含了源ip地址、端口和目标ip、端口,我们可以根据目标ip和端口过滤tcpdump抓包结果,以下命令说明了此用法:
linux:/tmp/lx # tcpdump -i eth0 dst 10.70.121.92 and port 22