1 简介
1.1 DSC的结构
DSC,全称Dns Statistics Collector,主要包含采集器(collector,或简称dsc)和展示器(presenter,或简称dsp)两大部分。具体的框架结构如下:
如图1.1所示,采集器(collector)可以安装在多个DNS服务器/节点上,采集器每60秒对DNS流量情况进行采集并生成xml格式的文件。随后,一个定时任务通过ssh将这些xml文件上传到展示器(presenter)的指定目录下。展示器中的xml文件解析器(extractor)通过一个定时任务,从该文件上传目录下读取并解析xml文件,生成.dat格式的文件。图像生成器(grapher)通过perl脚本读取.dat文件并生成展示页面。
1.2 采集器(Collector)
采集器是一个名为dsc的二进制程序,用于监视DNS消息。它是用C编写的,并使用libpcap进行包的捕获。dsc使用一个相对简单的配置文件dsc.conf。其中可以定义某些参数和选项以及dsc收集的数据集。
1.3 展示器(Presenter)
展示器主要包含extractor和grapher两部分,他们都在一个名为dsp的安装包中。展示器负责将采集的数据解析并展示。
1.3.1 xml文件解析器(Extractor)
XML文件解析器是一个Perl脚本,本质上是将xml结构的数据转换为一种更容易(更快)解析图形化工具的格式——.dat文件。
1.3.2 图像生成器(Grapher)
dsc使用Ploticus2作为绘图引擎。Perl模块和CGI脚本读取提取的.dat数据文件并生成Ploticus脚本文件以生成绘图。页面展示的图表是根据需要通过CGI应用程序生成的。
1.4 页面展示样例图表
2 安装&启动
2.1 DSC(Collector)的安装
2.1.1 安装建议
DSC采集器建议安装在DNS服务器上。需要有root权限。
2.1.2 安装前准备
l 安装C/C++编译环境gcc
l 从官网下载dsc安装包,本文以dsc-2.6.1.tar.gz为例
2.1.3 安装流程
l 解压
tar -xf dsc-2.6.1.tar.gz
l 进入解压后的目录
cd dsc-2.6.1
l 编译、安装
./configure
make
make install
在configure中如果发现有相关依赖未安装,请按照提示安装相关依赖。
至此dsc已经安装完成。
2.1.4 配置&启动
安装dsc成功之后会在/usr/local/etc/dsc目录下(2.6.1版本之前的可能目录结构会有差异)生成dsc.conf.sample文件,这是dsc核心配置文件dsc.conf的样例。我们可以复制一份作为配置文件。
cp dsc.conf.sample dsc.conf
编辑dsc.conf文件
vim dsc.conf
对于其中配置项进行修改。例如,local_address可配置本机ip,也可配置多个ip,支持ipv6格式;run_dir配置运行目录,生成的xml数据文件将保存到此目录;interface配置检测的本机网卡名,也可以配置pcap文件的路径。(具体的配置项含义将在后续章节详细说明)
启动dsc
dsc ./dsc.conf
dsc正常启动后,可以看到两个进程:
root 28430 1 13 12:32 ? 00:19:55 dsc dsc.conf
root 4360 28430 0 14:54 ? 00:00:00 [dsc] <defunct>
第一次启动后大约60秒,会在dsc.conf文件中配置的run_dir目录里看到生成的xml文件。随后每隔60秒生成一个文件。
可使用下列命令对dsc命令进行测试
dsc -d ./dsc.conf
该命令会读取dsc配置文件并立即在运行目录生成采集的结果文件
2.2 DSP(Presentation)的安装
2.2.1 安装前准备
l 安装C/C++编译环境gcc
l 安装perl
l 从官网下载dsp及其相关的安装包,本文以dsc-2.6.1.tar.gz、p5-DSC-2.04.tar.gz、p5-App-DSC-DataTool-0.03.tar.gz为例
l 安装以下Perl依赖:
CGI-Untaint (CGI::Untaint)
CGI.pm (CGI)
Digest-MD5 (Digest::MD5)
File-Flock (File::Flock)
File-Spec (File::Spec)
File-Temp (File::Temp)
Geography-Countries (Geography::Countries)
Hash-Merge (Hash::Merge)
IP-Country (IP::Country)
MIME-Base64 (MIME::Base64)
Math-Calc-Units (Math::Calc::Units)
Scalar-List-Utils (List::Util)
Text-Template (Text::Template)
URI (URI::Escape)
XML-Simple (XML::Simple)
Perl依赖可以用CPAN方式安装,具体命令如下例:
//进入MCPAN控制台
[root@localhost ~]# perl -MCPAN -e shell
//安装 CGI::Untaint依赖
cpan[1]>install CGI::Untaint
若未安装CPAN,请先安装CPAN:
yum install perl-CPAN
l 安装Ploticus
Ploticus用来生成图标,本文以ploticus242为例。
解压后使用make、make install命令编译、安装,安装完成后可以在安装目录上使用pl命令。
2.2.2 安装流程
注意:在进行安装前请确保2.1.2节中的所有依赖、库/包、工具都已正常安装,否则可能造成不能展示数据的异常。下面的安装请按照顺序进行,否则会出现以来确实等情况。
2.2.2.1 安装p5-DSC
p5-DSC包为DSC的相关perl依赖,具体安装步骤如下:
l 解压
tar -xf p5-DSC-2.04.tar.gz
l 进入解压后的目录
cd p5-DSC-2.04
l 编译、安装
perl Makefile.PL
make
make test
make install
安装前使用perl Makefile.PL检测所需perl依赖是否安装,若未安装,请仿照2.2.1节安装相关的perl依赖。
2.2.2.2 安装p5-App-DSC-DataTool
具体安装步骤如下:
l 解压
tar -xf p5-App-DSC-DataTool-0.03.tar.gz
l 进入解压后的目录
cd p5-App-DSC-DataTool-0.03
l 编译、安装
perl Makefile.PL
make
make test
make install
安装前使用perl Makefile.PL检测所需perl依赖是否安装,若未安装,请仿照2.2.1节安装相关的perl依赖。
2.2.2.3 安装DSP
l 解压
tar -xf dsp-2.0.0.tar.gz
l 进入解压后的目录
cd dsp-2.0.0
l 编译、安装
./configure
make
make test
make install
在configure中如果发现有相关依赖未安装,请按照提示安装相关依赖。
至此DSP及其相关组件已经安装完成。
2.2.3 配置&运行
由于版本原因,dsp2.0.0之前版本安装后可能和本文当中的目录不一致,请按实际情况进行配置。
l 创建以下目录
mkdir /usr/local/var
#存放cache文件
mkdir /usr/local/var/cache
mkdir /usr/local/var/cache/dsp
#存放log文件
mkdir /usr/local/var/log
mkdir /usr/local/var/log/dsp
#存放data数据文件
mkdir /usr/local/var/lib
mkdir /usr/local/var/lib/dsp
#SERVER和NODE分别表示服务器名和节点名,与gragher.pm中配置的一致
mkdir /usr/local/var/lib/dsp/SERVER/NODE
#存放从collector传来的原始文件的目录
mkdir /usr/local/var/lib/dsp/SERVER/NODE/incoming
l 在/etc/crontab中增加两条定时任务,用于定时从文件上传目录获取xml文件并解析
* * * * * root /usr/bin/nice -10 /usr/local/libexec/dsp/refile-and-grok.sh
@midnight root find /usr/local/var/lib/dsc | /usr/local/libexec/dsp/remove-xmls.pl 7
l 配置/usr/local/etc/dsp/dsc-grapher.cfg文件
其中可配置服务器、节点、展示粒度、域名列表等
注意服务器名和节点名要和存放数据的目录保持一致,否则展示器无法找到相关服务器和节点的数据文件,如:
server SERVER NODE
l 修改/usr/local/share/perl5/DSC/ploticus.pm中ploticus的安装路径
my $prog = (grep {-f $_} qw(**/home/ploticus/ploticus242/src/pl** /usr/local/bin/ploticus /usr/local/bin/pl /usr/bin/ploticus /usr/bin/pl))[0];
从/usr/local/lib/cgi-bin目录下获取dsc-grapher.pl文件,并进行相关配置
其中dataroot为存放数据文件的目录,configfile为dsc-gragher.cfg文件的路径,cachepath为存放cache文件的目录,htmlpath为存放html相关文件的目录。
my $grapher = DSC::grapher->new(
dataroot => '**/usr/local/var/lib/dsc**',
configfile => '**/usr/local/etc/dsp/dsc-grapher.cfg**',
cachepath => '**/usr/local/var/cache/dsp**',
htmlpath => '**/usr/local/share/dsp/html**',
);
配置完成后,将该pl脚本文件放置到web应用的cgi-bin路径下,启动web应用后,访问http://xxxxxx/cgi-bin/dsc-grapher.pl即可查看到当前页面。
3 数据文件的传输
Collector采集的Xml数据文件需要传输到Presenter才能被解析和展示。Collector的文件传送需要先将生成的xml文件转移到本地的待上传(upload)目录,然后使用一个定时任务将文件每分钟传到Presenter的指定目录。本章将介绍xml文件的传输流程。
3.1 将生成的文件转移到upload目录
请首先在Collector的dsc运行目录下创建upload目录,然后在upload目录下创建NODE目录,NODE为当前监控的主机节点名,然后再NODE目录下建立DEST目录,DEST为要接受xml的安装了Presentor的主机名,一个NODE下可以创建多个DEST目录。
在/etc/crontab文件中加入下列定时任务:
* * * * * root . /etc/profile && . ${HOME}/.bash_profile && /usr/local/libexec/dsc/upload-prep.pl
启动脚本前,请将脚本中的foreach my $conf (</usr/local/dsc/etc/*.conf>)改为dsc配置文件的实际路径。
启动该脚本需要安装perl模块Proc::PID::File
可能需要MakeFile模块
tar -xf Proc-PID-File-1.27.tar.gz
cd Proc-PID-File-1.27
perl Makefile.PL
make
make install
运行perl Makefile.PL语句时可能需要MakeMaker模块,安装步骤同上
该定时任务启动后将会从运行目录获取xml文件并传输到${run_dir}/upload/NODE/DEST下,同时删除运行目录下的xml文件。
3.2 通过ssh上传到DSP服务器
3.2.1 ssh免密登录的配置
在collector安装的服务器上输入以下命令生成key文件:
ssh-keygen -t dsa -C dsc-uploader -f $HOME/.ssh/dsc_uploader_id
将该dsc_uploader_id.pub文件中生成的key加入目的服务器的 authorized_keys文件中,执行以下命令:
ssh-copy-id -i $HOME/.ssh/dsc_uploader_id root@10.21.40.152
输入目的服务器对应用户的密码
至此即可免密进行ssh登录
3.2.2 上传文件
通过定时任务执行upload-rsync.sh脚本将待上传的xml文件传送到目的服务器的指定目录,在/etc/crontab文件中加入下列定时任务:
* * * * * root . /etc/profile && . ${HOME}/.bash_profile && /usr/local/libexec/dsc/upload-rsync.sh slave2 slave1 root@10.21.40.152:/usr/local/var/lib/dsc/slave2/slave2
启动upload-rsync.sh脚本前请修改其中的PREFIX为dsc运行目录,
第37行
cd $PREFIX/$NODE/upload/$DEST
请修改为对应的待上传文件的目录
4 dsc.conf配置文件
dsc.conf是dsc的核心配置文件,dsc命令根据其中的配置项,对DNS的流量进行监控和采集,并输出xml文件。本章主要介绍dsc.conf配置文件的含义。注意:dsc.conf文件每句要以“;”结尾。下面将介绍dsc.conf的主要配置项。
4.1 local address
指定DNS服务器的本地IP地址。它用于确定IP分组的“方向”:发送、接收或其他。可以通过重复本地地址行的任意次数来指定多个本地地址。
Example: local address 172.16.0.1;
Example: local address 2001:4f8:0:2::13;
4.2 run dir
启动后为dsc当前目录的目录。 这里将写入XML文件。
Example: run dir "/var/run/dsc";
4.3 minfree bytes
DSC运行系统的磁盘最小空间,若当前低于这个最小空间,xml文件将直接丢弃不再写入,直到有足够的空间为止。
4.4 pid_file
DSC进程的pid存储的路径
Example:pid_file "/run/dsc.pid";
4.5 bpf program
berkely过滤器程序,用来限制报文的数量和类型。需要写在interface配置项之前。
#只采集udp53端口的DNS数据,若这样配置,基于IP的采集器就无法工作。
Example: bpf program "udp port 53";
只展示DNS查询信息
Example: bpf_program "udp dst port 53 and udp[10:2] & 0x8000 = 0";
4.6 interface
指明探测的接口名/网卡名,可以指定多个接口,也可以是pcap文件
Example: interface fxp0;
Example: interface “/home/dsms/data/dns.pcap”;
4.7 match vlan
设置vlan的编号。 如果设置了该配置项,只有属于这些vlan的数据才会被计算。可使用空格来配置多个。
Example: match vlan 101 102;
4.8 output_format
输出文件格式,默认为xml格式,可支持json/xml
Example: output_format XML;
Example: output_format JSON;
4.9 statistics_interval
数据采集的事件间隔,单位是秒,默认为60秒
Example: statistics_interval 60;
4.10 qname_ftlter
dsc的自定义过滤器,可以在dataset中指定使用在此处定义的过滤器。定义过滤器的语句是一个正则表达式。
#qname过滤器定义
qname_filter WWW-Only ^www\. ;
#qname过滤器在dataset中使用
dataset qtype dns All:null Qtype:qtype queries-only,WWW-Only ;
4.11 dataset
DSC配置文件的核心,dsc进程根据dataset数据集的配置采集、统计需要的数据,可配置多个。dataset的格式如下:
dataset name protocol Label1:Indexer1 Label2:Indexer2 filter [parameters] ;
dataset为配置项关键字;
name为dataset的名字,这些名字和最终采集的数据名字一致,目前支持的name有:
qtype、rcode、opcode、edns_version、rd_bit、tc_bit、idn_qname、do_bit、client_subnet、client_subnet2、certain_qnames_vs_qtype、qtype_vs_tld、client_addr_vs_rcode、direction_vs_ipproto、idn_vs_tld、ipv6_rsn_abusers、qtype_vs_qnamelen、rcode_vs_replylen、chaos_types_and_names、transport_vs_qtype、dns_ip_version_vs_qtype、client_ports、client_port_range、edns_bufsiz、second_ld_vs_rcode、third_ld_vs_rcode、pcap_stats、priming_queries、priming_responses、qr_aa_bits;
protocol 为数据集合的协议,可设置为dns或者ip
label1 为维度1的名字,目前提供的label见表4.11.1和4.11.2
indexer1 为维度1的indexer,用来将报文中的信息转化为整型数字的方法,目前提供的indexer见表4.11.1和4.11.2
label2 为维度2的名字,目前提供的label见表4.11.1和4.11.2
indexer2 为维度2的indexer,用来将报文中的信息转化为整型数字的方法,目前提供的indexer见表4.11.1和4.11.2
filter 过滤器,目前支持的过滤器有any、queries-only、replies-only、popular-qtypes、idn-only、aaaa-or-a6-only、root-servers-net-only、chaos-class以及自己定义的qname过滤器
parameters 参数,选填。目前支持的参数有:min-count=NN、max-cells=NN
protocol 为ip的相关Label 和indexer:
protocol 为dns的相关Label 和indexer:
dataset一般使用dsc.conf.simple中提供的配置即可,下面是一个dataset配置的例子:
dataset qtype dns All:null Qtype:qtype queries-only;
在上述例子中,dataset的name为qtype,protocol为dns,由于只有一个维度的数据,所以该条配置中维度1的Label为All,对应的indexer为null,维度2为Qtype,对应的indexer为qtype,filter为queries-only,表示仅统计DNS查询报文的相关数据。
5 采集结果文件格式
dsc的采集结果文件可支持XML和JSON两种数据格式,数据格式可在dsc.conf文件中的utput_format配置项进行配置,默认为XML格式,DSP仅支持XML格式。
5.1 XML格式
XML格式的数据结果文件中的一个dataset如下:
<array name="dataset-name" dimensions="2" start_time="unix-seconds"
stop_time="unix-seconds">
<dimension number="1" type="Label1"/>
<dimension number="2" type="Label2"/>
<data>
<Label1 val="D1-V1">
<Label2 val="D2-V1" count="N1"/>
<Label2 val="D2-V2" count="N2"/>
<Label2 val="D2-V3" count="N3"/>
</Label1>
<Label1 val="D1-V2">
<Label2 val="D2-V1" count="N1"/>
<Label2 val="D2-V2" count="N2"/>
<Label2 val="D2-V3" count="N3"/>
</Label1>
</data>
</array>
如上所示,array标签上的属性name为dataset的name,dimensions为维度数,start_time、end_time为统计的起始时间戳,单位为秒,通常为60秒。
dimension标签表明该dataset的维度,如果只有一个维度,那么维度1应该写为:
<dimension number="1" type="All"/>
data标签为具体的数据,其下一层标签为维度1的名称,维度1标签下为维度2的具体数值。
5.2 JSON格式
JSON格式的数据结果文件的一个dataset如下:
{
"name": "dataset-name",
"start_time": unix-seconds,
"stop_time": unix-seconds,
"dimensions": [ "Label1", "Label2" ],
"data": [
{
"Label1": "Label1",
"Label2": [
{ "val": "D2-V1", "count": N1 },
{ "val": "D2-V2", "count": N2 },
{ "val": "D2-V3", "count": N3 }
]
},
{
"Label1": "D1-V2",
"Label2": [
{ "val": "D2-V1", "count": N1 },
{ "val": "D2-V2", "count": N2 },
{ "val": "D2-V3", "count": N3 }
]
}
]
}
如上所示,name为dataset的名称,start_time、end_time为统计的起始时间戳,单位为秒,通常为60秒。dimension标签表明该dataset的维度,如果只有一个维度,那么维度1应为All。data下为具体的采集数据。
5.3文件名称格式
XML数据文件名称命名为时间戳.dscdata.xml,例如1532935320.dscdata.xml,数据文件存在对应日期的文件夹下,如2018-07-30/1532935320.dscdata.xml
6 性能
6.1 磁盘占用
dsc采集器不会占用的磁盘,只要配置了文件上传,dsc采集器会在每分钟将采集的数据结果文件传到dsp展示器。同时删除本地的结果文件,所以几乎不占用磁盘空间。
dsp展示器会将dsc上传的xml结果文件解析为.dat结果文件,.dat文件占用的磁盘大约每天1M左右。同时dsp会保留xml结果文件7天,这些原始xml数据文件大约占用磁盘每天12M左右。
6.2 时延
dsc采集器每分钟生成采集统计的结果数据文件,几乎不存在时延。
dsp展示器每分钟获取从dsc通过ssh传输的文件,并进行解析展示。由于ssh传输和定时任务原因,可能存在1-2分钟时延。
6.3 性能测试
10Wqps:
此时libpcap的丢包率较低,CPU占用率大约在18%-80%
20Wqps:
开始出现丢包
30Wqps(pcap_buffer_size为4M左右):
出现严重的丢包,超过一半被丢弃
30Wqps(pcap_buffer_size为400M左右):
由于调高了pcap_buffer_size,丢包率略有降低,但是此时CPU负载已达100%,出现一分钟内无法生成xm结果文件的问题,且监测的流量忽高忽低。