0x00 概述

很多客户使用GTM/DNS为企业业务提供动态智能解析,解决应用就近性访问、优选问题。对于已经实施多数据中心双活的客户,则会使用GSLB提供双活流量调度。DNS作为企业业务访问的指路者,在整个IT基础架构系统中有着举足轻重的作用,一旦DNS无法提供服务,将导致客户无法访问业务系统,造成重大经济损失。因此构建一套高弹性分布式的高安全DNS架构是IT系统建设的基础之石,通常为了保证系统的正常运行,运维人员为了实时掌握系统运行状态如解析速率、失败率、延迟、来源地址位置、智能选路、解析类型、是否存在DNS攻击,要采集大量的实时解析、日志等数据,然而分布式的DNS架构在解决了弹性扩展与安全容错等问题的同时却也增加了运维难度,数据零散在不同的线路设备上,无法从整体上从数据中获取有价值信息,为此netops人员需要同时监控多台设备的日志、解析记录,并分析这些来自多台设备上的数据关系,将这些分散的数据集中记录、存储到统一的系统并进行数据挖掘可大大帮助运维人员实时、直观的掌握DNS系统运行状态、解析状态,帮助快速识别和定位问题。

对于一个DNS解析日志数据分析系统来说,应该考虑具备以下能力:

  1. 实时显示当前解析统计,包含实时的请求数,实时响应数、失败数
  2. 能够实时区分智能解析与非智能解析数量
  3. 解析请求的地理分布图,这些地理分布要能够做到根据线路、IP、域名、解析类型自动关联展现
  4. 每条线路的解析统计,能够做到统计某条线路上解析的域名、解析类型、智能解析数量、非智能解析数量、失败数量、地理分布
  5. 失败解析的统计,包含失败解析对应的域名,解析类型,地理分布,线路分布
  6. 解析域名统计,根据不同的域名能够做到一个关联统计与这个域名有关的不同线路、不同地理位置、不同解析记录类型上的统计,这个域名的解析中有多少是智能解析的,有多少是非智能解析的,有多少是失败的,这个域名的解析在不同时刻点的解析总量等
  7. 响应状态统计,通过指定的响应状态反查相关的解析来源,线路,域名等

本文描述如何结合ELK与F5 DNS logging profile,通过BIGIP HSL将日志高速发送至ELK系统,进行集中存储、分析和可视化。

0x01 logstash配置

[root@F5ELK-NODE01 ~]# cat /etc/logstash/conf.d/dns-log-to-elasticsearch.conf
input {
tcp {
port =>
type => 'f5-dns'
}
} filter {
if [type] == 'f5-dns' and [message] =~ 'query:' {
grok {
match => { "message" => "%{TIMESTAMP_ISO8601:requesttime} %{HOSTNAME:F5hostname} qid %{NUMBER:queryid} from %{IP:clientip}#%{POSINT:clientport}: view %{GREEDYDATA:viewname}: query: %{HOSTNAME:queryname} IN %{GREEDYDATA:querytype} \+ \(%{IP:listenervs}\%%{NUMBER:routedomain}\)" }
}
geoip {
source => "clientip"
target => "geoip"
}
} else if [type] == 'f5-dns' and [message] =~ '; '{
grok {
match => { "message" => "%{TIMESTAMP_ISO8601:responsetime} %{HOSTNAME:F5Reponsehostname} qid %{NUMBER:queryid} to %{IP:clientip}#%{POSINT:clientport}: \[%{WORD:responsecode} %{GREEDYDATA:responseflag}\] response: %{HOSTNAME:responsename}\. %{GREEDYDATA:answer}" }
add_field => [ "iswideip", "no" ]
}
geoip {
source => "clientip"
target => "geoipresponse"
}
} else if [type] == 'f5-dns' and [message] =~ ': empty' {
grok {
match => { "message" => "%{TIMESTAMP_ISO8601:responsetime} %{HOSTNAME:F5Reponsehostname} qid %{NUMBER:queryid} to %{IP:clientip}#%{POSINT:clientport}: \[%{WORD:responsecode} %{GREEDYDATA:responseflag}\] response: %{GREEDYDATA:answer}" }
add_field => [ "emptyresponse", "yes" ]
}
geoip {
source => "clientip"
target => "geoipresponse"
}
} else if [type] == 'f5-dns' {
grok {
match => { "message" => "%{TIMESTAMP_ISO8601:responsetime} %{HOSTNAME:F5Reponsehostname} qid %{NUMBER:queryid} to %{IP:clientip}#%{POSINT:clientport}: \[%{WORD:responsecode} %{GREEDYDATA:responseflag}\] response: %{HOSTNAME:responsename}\. %{GREEDYDATA:answer}" }
}
geoip {
source => "clientip"
target => "geoipresponse"
}
}
} output {
elasticsearch {
hosts => ["192.168.214.130:9200"]
index => "f5-dns-%{+YYYY.MM.dd}"
template_name => "f5-dns"
}
}

0x02 F5 配置

ltm virtual listener_192.168.214. {
destination 192.168.214.253:domain
ip-protocol udp
mask 255.255.255.255
profiles {
my_dns { }
udp_gtm_dns { }
}
source 0.0.0.0/
translate-address disabled
translate-port disabled
vs-index
}
root@(a)(cfg-sync Standalone)(Active)(/Common)(tmos)# list ltm profile dns-logging
ltm profile dns-logging dns_local_logging_profile {
enable-response-logging yes
include-query-id yes
log-publisher dns-local-logging
} ltm profile dns my_dns {
app-service none
defaults-from dns
enable-logging yes
log-profile dns_local_logging_profile
} sys log-config publisher dns-local-logging {
destinations {
local-syslog { }
logstash-hsl { }
}
} sys log-config destination remote-high-speed-log logstash-hsl {
pool-name logstash-pool
}

0x03 elasticsearch设置

由于需要显示地理分布图,所以索引里的每个文档需要包含类型为geo_point的字段。系统默认的logstash mapping template已经包含了这样的设置,但是由于我们是自定义的index,所以系统不会使用logstash template,我们需要自定义一个模板并增加一个geoipresponse的geo_point类型字段:

{
"template": "f5-dns-*",
"mappings": {
"_default_": {
"_all": {
"enabled": true,
"norms": false
},
"dynamic_templates": [
{
"message_field": {
"path_match": "message",
"match_mapping_type": "string",
"mapping": {
"type": "text",
"norms": false
}
}
}
,
{
"string_fields": {
"match": "*",
"match_mapping_type": "string",
"mapping": {
"type": "text",
"norms": false,
"fields": {
"keyword": {
"type": "keyword",
"ignore_above":
}
}
}
}
}
],
"properties": {
"@timestamp": {
"type": "date",
"include_in_all": false
},
"@version": {
"type": "keyword",
"include_in_all": false
},
"geoip": {
"dynamic": true,
"properties": {
"ip": {
"type": "ip"
},
"location": {
"type": "geo_point"
},
"latitude": {
"type": "half_float"
},
"longitude": {
"type": "half_float"
}
}
},
"geoipresponse": {
"dynamic": true,
"properties": {
"ip": {
"type": "ip"
},
"location": {
"type": "geo_point"
},
"latitude": {
"type": "half_float"
},
"longitude": {
"type": "half_float"
}
}
}
}
}
},
"aliases": { }
}

update模板:

curl -XPUT http://localhost:9200/_template/f5-dns?pretty -d @dns-log-index-template_with_geoipresponse.json

注意设置好系统时间,启动logstash

/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/dns-log-to-elasticsearch.conf

0x04 Kibana设置

设置kibana可视图,最后形成dashboard:

通过上述dashboard可以直观的看到

实时解析统计,智能解析统计,非智能解析统计,地理分布(请求、响应),线路统计,请求排名前十LDNS,总解析数,失败解析数,总响应数,失败请求发生的最新时间以及对应query id,请求和响应域名top30排名,响应状态走势图,查询类型柱状图,LDNS来源(包含响应维度统计)

0x05 场景分析举例

1. 无法响应或empty响应

从上图可以看到,所有的解析请求都获得了响应,这里的总响应包含任何获得了DNS回复的解析,即便回应的是Refused,NXDOMAIN等,所以如果发生总响应明显小于总请求,说明发生了请求未获得任何类型的应答,可能为系统丢包或静默无应答,如果发生大量这样的情况则要检查系统,或者解析请求为异常包,如果解析域名明显有很多域名不在响应域名饼图中的,则可能与这些域名有关。同时也可以观察热力图,如果某些区域解析热点很高,但是相应区域的响应热点却很低,说明和这些区域存在关联。

如果请求和响应域名的饼图发生偏差,则说明有部分域名没有得到解析,或者解析的返回的日志内容是empty,也就是说这些域名可能获得是refused,nxdomain等返回:

2. 单域名解析状态跟踪

点击请求域名中的某个域名如f5se.com,可以看到dashboard发生关联变化,可以看到该域名对应的解析记录类型,来源城市,

以及与之相关的线路统计,总请求数等

3. 失败解析分析

可以先通过点击响应状态码类型中异常的解析类型观看这些异常解析都来自哪里,排名很高的LDNS是什么,快速观察是否是由某些固定来源地的解析导致的,如果存在这样的特征,则可能对方在尝试或者攻击,可进一步采取措施封杀这些请求。

其次可以再次点击失败的请求ID,可以看到该失败解析是从哪里来,走的哪条线路,解析的哪个域名,解析的类型是什么,发生了多少次(如果发生次数很多,说明可能存在自动化工具攻击)。

4. 水滴攻击分析

如果发生针对DNS的水滴攻击,通过dashboard可以看到大量的总失败计数,请求域名饼图中可发生大量随机主机名,但是响应域名饼图却不存在,同时解析类型中的refused统计变大。那么此时可以通过点击REFUSED解析类型进行过滤,dashboard将会显示这些请求来自哪些IP,哪些城市,从而快速采取措施:

5. DDOS攻击分析

如果实时统计显示解析速率明显升高异常,可怀疑为DDOS,此时可以通过观察哪条线路的请求统计明显增高,点击明显增高的那条线路,系统自动显示该线路的每秒速率,总解析数,来源城市,来源IP统计,解析的域名,解析的类型。根据这些信息,可了解到DDOS的信息从而进一步决定如何采取措施:

6. GTM/DNS线路解析是否均匀

总体统计下,各条线路的总解析数量应该趋于一致,如果图表显示明显某条线路解析量很大,应怀疑是否针对该线路有攻击行为,可进一步查看关联来源地区,是否存在某些LDNS总解析异常大。也需要考虑,是否其它NS线路是否失败率较高。

7. 非智能解析占比

通过观察图表,非智能解析(本例为能解析出IP,但不是最优IP)占比是否趋于稳定状态且处于较低水平,如果突然升高,是否wideip相关智能解析策略部分存在问题,是否健康检查出现问题,是否topology命中率太低。如果解析类型中出现很多不属于智能解析类型的,也会导致非智能解析占比上升

通过以上可以看出,充分灵活利用dashboard可以非常有效的帮助监控系统状态、性能以及定位问题。本例是通过dns logging profile来实现发生解析日志,某些信息要素没有存在于log中,如果希望做更多更复杂的信息关联分析可通过F5的irule发送包含更多详细信息的日志到ELK系统中来实现更丰富的数据分析。

附件,相关Kibana Visualize以及dashboard 定义的Json文件:

kibana dashboard json

Kibana Visualize json文件

参考

ELK学习笔记之F5利用EELK进行应用数据挖掘系列(2)-DNS的更多相关文章

  1. ELK学习笔记之F5利用ELK进行应用数据挖掘系列(1)-HTTP

    0x00 概述 F5 BIGIP从应用角度位于网络结构的关键咽喉位置,可获取所有应用的流量,针对流量执行L7层处理,即便是TLS加密的流量也可以通过F5进行SSL offload.通过F5可以统一获取 ...

  2. ELK学习笔记之F5 DNS可视化让DNS运维更安全更高效-F5 ELK可视化方案系列(3)

    0x00 概述 此文力求比较详细的解释DNS可视化所能带来的场景意义,无论是运维.还是DNS安全.建议仔细看完下图之后的大篇文字段落,希望能引发您的一些思考. 在“F5利用Elastic stack( ...

  3. Android(java)学习笔记206:利用开源SmartImageView优化网易新闻RSS客户端

    1.我们自己编写的SmartImageView会有很多漏洞,但是我们幸运的可以在网上利用开源项目的,开源项目中有很多成熟的代码,比如SmartImageView都编写的很成熟的 国内我们经常用到htt ...

  4. 【Spring学习笔记-MVC-5】利用spring MVC框架,实现ajax异步请求以及json数据的返回

    作者:ssslinppp      时间:2015年5月26日 15:32:51 1. 摘要 本文讲解如何利用spring MVC框架,实现ajax异步请求以及json数据的返回. Spring MV ...

  5. Android(java)学习笔记149:利用开源SmartImageView优化网易新闻RSS客户端

    1.我们自己编写的SmartImageView会有很多漏洞,但是我们幸运的可以在网上利用开源项目的,开源项目中有很多成熟的代码,比如SmartImageView都编写的很成熟的 国内我们经常用到htt ...

  6. ELK学习笔记(一)安装Elasticsearch、Kibana、Logstash和X-Pack

    最近在学习ELK的时候踩了不少的坑,特此写个笔记记录下学习过程. 日志主要包括系统日志.应用程序日志和安全日志.系统运维和开发人员可以通过日志了解服务器软硬件信息.检查配置过程中的错误及错误发生的原因 ...

  7. ELK学习笔记之基于kakfa (confluent)搭建ELK

    0x00 概述 测试搭建一个使用kafka作为消息队列的ELK环境,数据采集转换实现结构如下: F5 HSL–>logstash(流处理)–> kafka –>elasticsear ...

  8. Android异步载入学习笔记之四:利用缓存优化网络载入图片及ListView载入优化

    假设不做不论什么处理.直接用网络载入图片在网速快的情况下可能没什么不好的感觉.可是假设使用移动流量或是网络不好的时候.问题就来了,要么用户会抱怨流量使用太多.要么抱怨图片载入太慢.如论从哪个角度出发, ...

  9. ELK学习笔记之CentOS 7下ELK(6.2.4)++LogStash+Filebeat+Log4j日志集成环境搭建

    0x00 简介 现在的公司由于绝大部分项目都采用分布式架构,很早就采用ELK了,只不过最近因为额外的工作需要,仔细的研究了分布式系统中,怎么样的日志规范和架构才是合理和能够有效提高问题排查效率的. 经 ...

随机推荐

  1. 【LeetCode每天一题】3Sum Closest(最接近的三数和)

    Given an array nums of n integers and an integer target, find three integers in nums such that the s ...

  2. react 嵌套组件的通信

    在react中经常会用到的组件嵌套,如下: 图中 parent本身是一个自定义的组件,然后内部又加入了 child的自定义组件,那么这种情况,父子之间如何通信 react中在父组件里面有一个 this ...

  3. echo 内容显示颜色

    一,字体显示颜色 #字体颜色:30m-37m 黑.红.绿.黄.蓝.紫.青.白str=”要显示的字体“echo -e "\033[30m ${str}\033[0m"      ## ...

  4. eclipse中tomcat启动成功,浏览器访问失败

    eclipse添加tomcat之后,tomcat有个默认设置,我们需要对tomcat进行重新设置: 1.双击已添加的tomcat,进入到配置页面,找到server locations一栏,可以看到默认 ...

  5. MYSQLi数据访问分页查询

    <?php //分页工具 直接加载使用 /** file: page.class.php 完美分页类 Page */ class Page { private $total; //数据表中总记录 ...

  6. Oracle / PLSQL函数 - DECODE

    1.DECODE( expression , search , result [, search , result]... [, default] ) 参数说明: expression : 表中的某一 ...

  7. linux安装flash player来播放视频

    1下载64位flashplayer插件,可在此下载(偷偷赚俩金币,为省金币也可到官网去搜),得到flashplayer11_b2_install_lin_64_080811.tar.gz: http: ...

  8. web.config 特殊字符转义

    字符 转义码 & 符号 & & 单引号 ' &apos; 双引号 " " 大于 > > 小于 < <

  9. while练习题

    # 1. 使用while循环输出1 2 3 4 5 6 8 9 10count = 1while count <= 10: if count == 7: count += 1 continue ...

  10. Yii2将查询数据变为键值对数组及查询构建器