1 簡介
1.1 DSC的結(jié)構(gòu)
DSC,全稱Dns Statistics Collector,主要包含采集器(collector,或簡稱dsc)和展示器(presenter,或簡稱dsp)兩大部分。具體的框架結(jié)構(gòu)如下:

如圖1.1所示,采集器(collector)可以安裝在多個DNS服務(wù)器/節(jié)點上,采集器每60秒對DNS流量情況進(jìn)行采集并生成xml格式的文件。隨后,一個定時任務(wù)通過ssh將這些xml文件上傳到展示器(presenter)的指定目錄下。展示器中的xml文件解析器(extractor)通過一個定時任務(wù),從該文件上傳目錄下讀取并解析xml文件,生成.dat格式的文件。圖像生成器(grapher)通過perl腳本讀取.dat文件并生成展示頁面。
1.2 采集器(Collector)
采集器是一個名為dsc的二進(jìn)制程序,用于監(jiān)視DNS消息。它是用C編寫的,并使用libpcap進(jìn)行包的捕獲。dsc使用一個相對簡單的配置文件dsc.conf。其中可以定義某些參數(shù)和選項以及dsc收集的數(shù)據(jù)集。
1.3 展示器(Presenter)
展示器主要包含extractor和grapher兩部分,他們都在一個名為dsp的安裝包中。展示器負(fù)責(zé)將采集的數(shù)據(jù)解析并展示。
1.3.1 xml文件解析器(Extractor)
XML文件解析器是一個Perl腳本,本質(zhì)上是將xml結(jié)構(gòu)的數(shù)據(jù)轉(zhuǎn)換為一種更容易(更快)解析圖形化工具的格式——.dat文件。
1.3.2 圖像生成器(Grapher)
dsc使用Ploticus2作為繪圖引擎。Perl模塊和CGI腳本讀取提取的.dat數(shù)據(jù)文件并生成Ploticus腳本文件以生成繪圖。頁面展示的圖表是根據(jù)需要通過CGI應(yīng)用程序生成的。
1.4 頁面展示樣例圖表



2 安裝&啟動
2.1 DSC(Collector)的安裝
2.1.1 安裝建議
DSC采集器建議安裝在DNS服務(wù)器上。需要有root權(quán)限。
2.1.2 安裝前準(zhǔn)備
l 安裝C/C++編譯環(huán)境gcc
l 從官網(wǎng)下載dsc安裝包,本文以dsc-2.6.1.tar.gz為例
2.1.3 安裝流程
l 解壓
tar -xf dsc-2.6.1.tar.gz
l 進(jìn)入解壓后的目錄
cd dsc-2.6.1
l 編譯、安裝
./configure
make
make install
在configure中如果發(fā)現(xiàn)有相關(guān)依賴未安裝,請按照提示安裝相關(guān)依賴。
至此dsc已經(jīng)安裝完成。
2.1.4 配置&啟動
安裝dsc成功之后會在/usr/local/etc/dsc目錄下(2.6.1版本之前的可能目錄結(jié)構(gòu)會有差異)生成dsc.conf.sample文件,這是dsc核心配置文件dsc.conf的樣例。我們可以復(fù)制一份作為配置文件。
cp dsc.conf.sample dsc.conf
編輯dsc.conf文件
vim dsc.conf
對于其中配置項進(jìn)行修改。例如,local_address可配置本機(jī)ip,也可配置多個ip,支持ipv6格式;run_dir配置運行目錄,生成的xml數(shù)據(jù)文件將保存到此目錄;interface配置檢測的本機(jī)網(wǎng)卡名,也可以配置pcap文件的路徑。(具體的配置項含義將在后續(xù)章節(jié)詳細(xì)說明)
啟動dsc
dsc ./dsc.conf
dsc正常啟動后,可以看到兩個進(jìn)程:
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命令進(jìn)行測試
dsc -d ./dsc.conf
該命令會讀取dsc配置文件并立即在運行目錄生成采集的結(jié)果文件
2.2 DSP(Presentation)的安裝
2.2.1 安裝前準(zhǔn)備
l 安裝C/C++編譯環(huán)境gcc
l 安裝perl
l 從官網(wǎng)下載dsp及其相關(guān)的安裝包,本文以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方式安裝,具體命令如下例:
//進(jìn)入MCPAN控制臺
[root@localhost ~]# perl -MCPAN -e shell
//安裝 CGI::Untaint依賴
cpan[1]>install CGI::Untaint
若未安裝CPAN,請先安裝CPAN:
yum install perl-CPAN
l 安裝Ploticus
Ploticus用來生成圖標(biāo),本文以ploticus242為例。
解壓后使用make、make install命令編譯、安裝,安裝完成后可以在安裝目錄上使用pl命令。
2.2.2 安裝流程
注意:在進(jìn)行安裝前請確保2.1.2節(jié)中的所有依賴、庫/包、工具都已正常安裝,否則可能造成不能展示數(shù)據(jù)的異常。下面的安裝請按照順序進(jìn)行,否則會出現(xiàn)以來確實等情況。
2.2.2.1 安裝p5-DSC
p5-DSC包為DSC的相關(guān)perl依賴,具體安裝步驟如下:
l 解壓
tar -xf p5-DSC-2.04.tar.gz
l 進(jìn)入解壓后的目錄
cd p5-DSC-2.04
l 編譯、安裝
perl Makefile.PL
make
make test
make install
安裝前使用perl Makefile.PL檢測所需perl依賴是否安裝,若未安裝,請仿照2.2.1節(jié)安裝相關(guān)的perl依賴。
2.2.2.2 安裝p5-App-DSC-DataTool
具體安裝步驟如下:
l 解壓
tar -xf p5-App-DSC-DataTool-0.03.tar.gz
l 進(jìn)入解壓后的目錄
cd p5-App-DSC-DataTool-0.03
l 編譯、安裝
perl Makefile.PL
make
make test
make install
安裝前使用perl Makefile.PL檢測所需perl依賴是否安裝,若未安裝,請仿照2.2.1節(jié)安裝相關(guān)的perl依賴。
2.2.2.3 安裝DSP
l 解壓
tar -xf dsp-2.0.0.tar.gz
l 進(jìn)入解壓后的目錄
cd dsp-2.0.0
l 編譯、安裝
./configure
make
make test
make install
在configure中如果發(fā)現(xiàn)有相關(guān)依賴未安裝,請按照提示安裝相關(guān)依賴。
至此DSP及其相關(guān)組件已經(jīng)安裝完成。
2.2.3 配置&運行
由于版本原因,dsp2.0.0之前版本安裝后可能和本文當(dāng)中的目錄不一致,請按實際情況進(jìn)行配置。
l 創(chuàng)建以下目錄
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數(shù)據(jù)文件
mkdir /usr/local/var/lib
mkdir /usr/local/var/lib/dsp
#SERVER和NODE分別表示服務(wù)器名和節(jié)點名,與gragher.pm中配置的一致
mkdir /usr/local/var/lib/dsp/SERVER/NODE
#存放從collector傳來的原始文件的目錄
mkdir /usr/local/var/lib/dsp/SERVER/NODE/incoming
l 在/etc/crontab中增加兩條定時任務(wù),用于定時從文件上傳目錄獲取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文件
其中可配置服務(wù)器、節(jié)點、展示粒度、域名列表等
注意服務(wù)器名和節(jié)點名要和存放數(shù)據(jù)的目錄保持一致,否則展示器無法找到相關(guān)服務(wù)器和節(jié)點的數(shù)據(jù)文件,如:
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文件,并進(jìn)行相關(guān)配置
其中dataroot為存放數(shù)據(jù)文件的目錄,configfile為dsc-gragher.cfg文件的路徑,cachepath為存放cache文件的目錄,htmlpath為存放html相關(guān)文件的目錄。
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應(yīng)用的cgi-bin路徑下,啟動web應(yīng)用后,訪問http://xxxxxx/cgi-bin/dsc-grapher.pl即可查看到當(dāng)前頁面。
3 數(shù)據(jù)文件的傳輸
Collector采集的Xml數(shù)據(jù)文件需要傳輸?shù)絇resenter才能被解析和展示。Collector的文件傳送需要先將生成的xml文件轉(zhuǎn)移到本地的待上傳(upload)目錄,然后使用一個定時任務(wù)將文件每分鐘傳到Presenter的指定目錄。本章將介紹xml文件的傳輸流程。
3.1 將生成的文件轉(zhuǎn)移到upload目錄
請首先在Collector的dsc運行目錄下創(chuàng)建upload目錄,然后在upload目錄下創(chuàng)建NODE目錄,NODE為當(dāng)前監(jiān)控的主機(jī)節(jié)點名,然后再NODE目錄下建立DEST目錄,DEST為要接受xml的安裝了Presentor的主機(jī)名,一個NODE下可以創(chuàng)建多個DEST目錄。
在/etc/crontab文件中加入下列定時任務(wù):
* * * * * 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模塊,安裝步驟同上
該定時任務(wù)啟動后將會從運行目錄獲取xml文件并傳輸?shù)?{run_dir}/upload/NODE/DEST下,同時刪除運行目錄下的xml文件。
3.2 通過ssh上傳到DSP服務(wù)器
3.2.1 ssh免密登錄的配置
在collector安裝的服務(wù)器上輸入以下命令生成key文件:
ssh-keygen -t dsa -C dsc-uploader -f $HOME/.ssh/dsc_uploader_id
將該dsc_uploader_id.pub文件中生成的key加入目的服務(wù)器的 authorized_keys文件中,執(zhí)行以下命令:
ssh-copy-id -i $HOME/.ssh/dsc_uploader_id root@10.21.40.152
輸入目的服務(wù)器對應(yīng)用戶的密碼
至此即可免密進(jìn)行ssh登錄
3.2.2 上傳文件
通過定時任務(wù)執(zhí)行upload-rsync.sh腳本將待上傳的xml文件傳送到目的服務(wù)器的指定目錄,在/etc/crontab文件中加入下列定時任務(wù):
* * * * * 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
請修改為對應(yīng)的待上傳文件的目錄
4 dsc.conf配置文件
dsc.conf是dsc的核心配置文件,dsc命令根據(jù)其中的配置項,對DNS的流量進(jìn)行監(jiān)控和采集,并輸出xml文件。本章主要介紹dsc.conf配置文件的含義。注意:dsc.conf文件每句要以“;”結(jié)尾。下面將介紹dsc.conf的主要配置項。
4.1 local address
指定DNS服務(wù)器的本地IP地址。它用于確定IP分組的“方向”:發(fā)送、接收或其他??梢酝ㄟ^重復(fù)本地地址行的任意次數(shù)來指定多個本地地址。
Example: local address 172.16.0.1;
Example: local address 2001:4f8:0:2::13;
4.2 run dir
啟動后為dsc當(dāng)前目錄的目錄。 這里將寫入XML文件。
Example: run dir "/var/run/dsc";
4.3 minfree bytes
DSC運行系統(tǒng)的磁盤最小空間,若當(dāng)前低于這個最小空間,xml文件將直接丟棄不再寫入,直到有足夠的空間為止。
4.4 pid_file
DSC進(jìn)程的pid存儲的路徑
Example:pid_file "/run/dsc.pid";
4.5 bpf program
berkely過濾器程序,用來限制報文的數(shù)量和類型。需要寫在interface配置項之前。
#只采集udp53端口的DNS數(shù)據(jù),若這樣配置,基于IP的采集器就無法工作。
Example: bpf program "udp port 53";
只展示DNS查詢信息
Example: bpf_program "udp dst port 53 and udp[10:2] & 0x8000 = 0";
4.6 interface
指明探測的接口名/網(wǎng)卡名,可以指定多個接口,也可以是pcap文件
Example: interface fxp0;
Example: interface “/home/dsms/data/dns.pcap”;
4.7 match vlan
設(shè)置vlan的編號。 如果設(shè)置了該配置項,只有屬于這些vlan的數(shù)據(jù)才會被計算??墒褂每崭駚砼渲枚鄠€。
Example: match vlan 101 102;
4.8 output_format
輸出文件格式,默認(rèn)為xml格式,可支持json/xml
Example: output_format XML;
Example: output_format JSON;
4.9 statistics_interval
數(shù)據(jù)采集的事件間隔,單位是秒,默認(rèn)為60秒
Example: statistics_interval 60;
4.10 qname_ftlter
dsc的自定義過濾器,可以在dataset中指定使用在此處定義的過濾器。定義過濾器的語句是一個正則表達(dá)式。
#qname過濾器定義
qname_filter WWW-Only ^www\. ;
#qname過濾器在dataset中使用
dataset qtype dns All:null Qtype:qtype queries-only,WWW-Only ;
4.11 dataset
DSC配置文件的核心,dsc進(jìn)程根據(jù)dataset數(shù)據(jù)集的配置采集、統(tǒng)計需要的數(shù)據(jù),可配置多個。dataset的格式如下:
dataset name protocol Label1:Indexer1 Label2:Indexer2 filter [parameters] ;
dataset為配置項關(guān)鍵字;
name為dataset的名字,這些名字和最終采集的數(shù)據(jù)名字一致,目前支持的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 為數(shù)據(jù)集合的協(xié)議,可設(shè)置為dns或者ip
label1 為維度1的名字,目前提供的label見表4.11.1和4.11.2
indexer1 為維度1的indexer,用來將報文中的信息轉(zhuǎn)化為整型數(shù)字的方法,目前提供的indexer見表4.11.1和4.11.2
label2 為維度2的名字,目前提供的label見表4.11.1和4.11.2
indexer2 為維度2的indexer,用來將報文中的信息轉(zhuǎn)化為整型數(shù)字的方法,目前提供的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 參數(shù),選填。目前支持的參數(shù)有:min-count=NN、max-cells=NN
protocol 為ip的相關(guān)Label 和indexer:

protocol 為dns的相關(guān)Label 和indexer:

dataset一般使用dsc.conf.simple中提供的配置即可,下面是一個dataset配置的例子:
dataset qtype dns All:null Qtype:qtype queries-only;
在上述例子中,dataset的name為qtype,protocol為dns,由于只有一個維度的數(shù)據(jù),所以該條配置中維度1的Label為All,對應(yīng)的indexer為null,維度2為Qtype,對應(yīng)的indexer為qtype,filter為queries-only,表示僅統(tǒng)計DNS查詢報文的相關(guān)數(shù)據(jù)。
5 采集結(jié)果文件格式
dsc的采集結(jié)果文件可支持XML和JSON兩種數(shù)據(jù)格式,數(shù)據(jù)格式可在dsc.conf文件中的utput_format配置項進(jìn)行配置,默認(rèn)為XML格式,DSP僅支持XML格式。
5.1 XML格式
XML格式的數(shù)據(jù)結(jié)果文件中的一個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標(biāo)簽上的屬性name為dataset的name,dimensions為維度數(shù),start_time、end_time為統(tǒng)計的起始時間戳,單位為秒,通常為60秒。
dimension標(biāo)簽表明該dataset的維度,如果只有一個維度,那么維度1應(yīng)該寫為:
<dimension number="1" type="All"/>
data標(biāo)簽為具體的數(shù)據(jù),其下一層標(biāo)簽為維度1的名稱,維度1標(biāo)簽下為維度2的具體數(shù)值。
5.2 JSON格式
JSON格式的數(shù)據(jù)結(jié)果文件的一個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為統(tǒng)計的起始時間戳,單位為秒,通常為60秒。dimension標(biāo)簽表明該dataset的維度,如果只有一個維度,那么維度1應(yīng)為All。data下為具體的采集數(shù)據(jù)。
5.3文件名稱格式
XML數(shù)據(jù)文件名稱命名為時間戳.dscdata.xml,例如1532935320.dscdata.xml,數(shù)據(jù)文件存在對應(yīng)日期的文件夾下,如2018-07-30/1532935320.dscdata.xml
6 性能
6.1 磁盤占用
dsc采集器不會占用的磁盤,只要配置了文件上傳,dsc采集器會在每分鐘將采集的數(shù)據(jù)結(jié)果文件傳到dsp展示器。同時刪除本地的結(jié)果文件,所以幾乎不占用磁盤空間。
dsp展示器會將dsc上傳的xml結(jié)果文件解析為.dat結(jié)果文件,.dat文件占用的磁盤大約每天1M左右。同時dsp會保留xml結(jié)果文件7天,這些原始xml數(shù)據(jù)文件大約占用磁盤每天12M左右。
6.2 時延
dsc采集器每分鐘生成采集統(tǒng)計的結(jié)果數(shù)據(jù)文件,幾乎不存在時延。
dsp展示器每分鐘獲取從dsc通過ssh傳輸?shù)奈募?,并進(jìn)行解析展示。由于ssh傳輸和定時任務(wù)原因,可能存在1-2分鐘時延。
6.3 性能測試
10Wqps:
此時libpcap的丟包率較低,CPU占用率大約在18%-80%



20Wqps:
開始出現(xiàn)丟包

30Wqps(pcap_buffer_size為4M左右):
出現(xiàn)嚴(yán)重的丟包,超過一半被丟棄


30Wqps(pcap_buffer_size為400M左右):
由于調(diào)高了pcap_buffer_size,丟包率略有降低,但是此時CPU負(fù)載已達(dá)100%,出現(xiàn)一分鐘內(nèi)無法生成xm結(jié)果文件的問題,且監(jiān)測的流量忽高忽低。


