很多客户使用GTM/DNS为企业业务提供动态智能解析,解决应用就近性访问、优选问题。对于已经实施多数据中心双活的客户,则会使用GSLB提供双活流量调度。DNS作为企业业务访问的指路者,在整个IT基础架构系统中有着举足轻重的作用,一旦DNS无法提供服务,将导致客户无法访问业务系统,造成重大经济损失。因此构建一套高弹性分布式的高安全DNS架构是IT系统建设的基础之石,通常为了保证系统的正常运行,运维人员为了实时掌握系统运行状态如解析速率、失败率、延迟、来源地址位置、智能选路、解析类型、是否存在DNS攻击,要采集大量的实时解析、日志等数据,然而分布式的DNS架构在解决了弹性扩展与安全容错等问题的同时却也增加了运维难度,数据零散在不同的线路设备上,无法从整体上从数据中获取有价值信息,为此netops人员需要同时监控多台设备的日志、解析记录,并分析这些来自多台设备上的数据关系,将这些分散的数据集中记录、存储到统一的系统并进行数据挖掘可大大帮助运维人员实时、直观的掌握DNS系统运行状态、解析状态,帮助快速识别和定位问题。
对于一个DNS解析日志数据分析系统来说,应该考虑具备以下能力:
- 实时显示当前解析统计,包含实时的请求数,实时响应数、失败数
- 能够实时区分智能解析与非智能解析数量
- 解析请求的地理分布图,这些地理分布要能够做到根据线路、IP、域名、解析类型自动关联展现
- 每条线路的解析统计,能够做到统计某条线路上解析的域名、解析类型、智能解析数量、非智能解析数量、失败数量、地理分布
- 失败解析的统计,包含失败解析对应的域名,解析类型,地理分布,线路分布
- 解析域名统计,根据不同的域名能够做到一个关联统计与这个域名有关的不同线路、不同地理位置、不同解析记录类型上的统计,这个域名的解析中有多少是智能解析的,有多少是非智能解析的,有多少是失败的,这个域名的解析在不同时刻点的解析总量等
- 响应状态统计,通过指定的响应状态反查相关的解析来源,线路,域名等
本文描述如何结合ELK与F5 DNS logging profile,通过BIGIP HSL将日志高速发送至ELK系统,进行集中存储、分析和可视化。
logstash配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
[root@F5ELK-NODE01 ~]# cat /etc/logstash/conf.d/dns-log-to-elasticsearch.conf input { tcp { port => 514 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" } } |
F5 配置
1 2 3 4 5 6 7 8 9 10 11 12 13 |
ltm virtual listener_192.168.214.253 { 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/0 translate-address disabled translate-port disabled vs-index 23 } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
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 } |
elasticsearch设置
由于需要显示地理分布图,所以索引里的每个文档需要包含类型为geo_point的字段。系统默认的logstash mapping template已经包含了这样的设置,但是由于我们是自定义的index,所以系统不会使用logstash template,我们需要自定义一个模板并增加一个geoipresponse的geo_point类型字段:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
{ "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": 256 } } } } } ], "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
Kibana设置
设置kibana可视图,最后形成dashboard:
通过上述dashboard可以直观的看到
实时解析统计,智能解析统计,非智能解析统计,地理分布(请求、响应),线路统计,请求排名前十LDNS,总解析数,失败解析数,总响应数,失败请求发生的最新时间以及对应query id,请求和响应域名top30排名,响应状态走势图,查询类型柱状图,LDNS来源(包含响应维度统计)
无法响应或empty响应:
从上图可以看到,所有的解析请求都获得了响应,这里的总响应包含任何获得了DNS回复的解析,即便回应的是Refused,NXDOMAIN等,所以如果发生总响应明显小于总请求,说明发生了请求未获得任何类型的应答,可能为系统丢包或静默无应答,如果发生大量这样的情况则要检查系统,或者解析请求为异常包,如果解析域名明显有很多域名不在响应域名饼图中的,则可能与这些域名有关。同时也可以观察热力图,如果某些区域解析热点很高,但是相应区域的响应热点却很低,说明和这些区域存在关联。
如果请求和响应域名的饼图发生偏差,则说明有部分域名没有得到解析,或者解析的返回的日志内容是empty,也就是说这些域名可能获得是refused,nxdomain等返回:
单域名解析状态跟踪:
点击请求域名中的某个域名如f5se.com,可以看到dashboard发生关联变化,可以看到该域名对应的解析记录类型,来源城市,
失败解析分析:
可以先通过点击响应状态码类型中异常的解析类型观看这些异常解析都来自哪里,排名很高的LDNS是什么,快速观察是否是由某些固定来源地的解析导致的,如果存在这样的特征,则可能对方在尝试或者攻击,可进一步采取措施封杀这些请求。
其次可以再次点击失败的请求ID,可以看到该失败解析是从哪里来,走的哪条线路,解析的哪个域名,解析的类型是什么,发生了多少次(如果发生次数很多,说明可能存在自动化工具攻击)。
水滴攻击分析:
如果发生针对DNS的水滴攻击,通过dashboard可以看到大量的总失败计数,请求域名饼图中可发生大量随机主机名,但是响应域名饼图却不存在,同时解析类型中的refused统计变大。那么此时可以通过点击REFUSED解析类型进行过滤,dashboard将会显示这些请求来自哪些IP,哪些城市,从而快速采取措施:
DDOS攻击分析:
如果实时统计显示解析速率明显升高异常,可怀疑为DDOS,此时可以通过观察哪条线路的请求统计明显增高,点击明显增高的那条线路,系统自动显示该线路的每秒速率,总解析数,来源城市,来源IP统计,解析的域名,解析的类型。根据这些信息,可了解到DDOS的信息从而进一步决定如何采取措施:
GTM/DNS线路解析是否均匀:
总体统计下,各条线路的总解析数量应该趋于一致,如果图表显示明显某条线路解析量很大,应怀疑是否针对该线路有攻击行为,可进一步查看关联来源地区,是否存在某些LDNS总解析异常大。也需要考虑,是否其它NS线路是否失败率较高。
非智能解析占比:
通过观察图表,非智能解析(本例为能解析出IP,但不是最优IP)占比是否趋于稳定状态且处于较低水平,如果突然升高,是否wideip相关智能解析策略部分存在问题,是否健康检查出现问题,是否topology命中率太低。如果解析类型中出现很多不属于智能解析类型的,也会导致非智能解析占比上升:
通过以上可以看出,充分灵活利用dashboard可以非常有效的帮助监控系统状态、性能以及定位问题。本例是通过dns logging profile来实现发生解析日志,某些信息要素没有存在于log中,如果希望做更多更复杂的信息关联分析可通过F5的irule发送包含更多详细信息的日志到ELK系统中来实现更丰富的数据分析。
附件,相关Kibana Visualize以及dashboard 定义的Json文件:
https://www.myf5.net/download/kibana-dashboard-json
https://www.myf5.net/download/kibana-visualize-json%E6%96%87%E4%BB%B6
文章评论
love you~
@liaojianxiong metoo