Cloud Native应用交付

  • 首页
  • 关于本站
  • 个人介绍
  • Downloads
  • Repo
    • Github
    • Container
  • F5
    • F5 Python SDK
    • F5-container
    • F5-LBaaS
  • 社交
    • 联系我
    • 微信/微博
    • 公众号
    • 打赏赞助
行至水穷处 坐看云起时
Cloud Native Application Services: cnadn.net
  1. 首页
  2. F5 with ELK
  3. 正文

F5利用Elastic stack(ELK)进行应用数据挖掘系列(2)-DNS

2017年11月20日 45582点热度 15人点赞 6条评论

很多客户使用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系统,进行集中存储、分析和可视化。

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类型字段:

Scheme
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

相关文章

  • 构建基于kafka(confluent)双活数据中心弹性F5 Bigdata Engine 架构-ELK_1.0
  • F5 DNS可视化让DNS运维更安全更高效-F5 ELK可视化方案系列(3)
  • F5利用Elastic stack(ELK)进行应用数据挖掘系列(1)-HTTP
  • ELK stack (Elasticsearch,logstash,Kibana)集群安装步骤备忘
  • 基于kakfa (confluent)搭建elk(备忘)
本作品采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可
标签: DNS dns logging ELK F5
最后更新:2020年06月29日

纳米

linjing.io

打赏 点赞
< 上一篇
下一篇 >

文章评论

  • Andrew Zong

    :smile:

    2020年01月27日
    回复
  • Andrew Zong

    :smile:

    2020年01月27日
    回复
  • liaojianxiong

    love you~

    2021年01月5日
    回复
    • 纳米

      @liaojianxiong metoo

      2021年01月5日
      回复
  • 汤姆

    大佬,kib的页面可以分享下吗?谢谢

    2024年09月9日
    回复
  • 汤姆

    嗨,楼主,里面的json怎么下载啊,怎么收费啊?

    2024年09月10日
    回复
  • razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
    回复 Andrew Zong 取消回复

    这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理。

    页面AI聊天助手

    纳米

    linjing.io

    ☁️迈向Cloud Native ADC ☁️

    认证获得:
    TOGAF: ID 152743
    Kubernetes: CKA #664
    Microsoft: MCSE MCDBA
    Cisco: CCNP
    Juniper: JNCIS
    F5:
    F5 Certified Solution Expert, Security
    F5 Certified Technology Specialist, LTM/GTM/APM/ASM
    F5 Certified BIG-IP Administrator
  • 点击查看本博技术要素列表
  • 归档
    分类
    • AI
    • Automation
    • Avi Networks
    • Cisco ACI
    • CISCO资源
    • F5 with ELK
    • F5-Tech tips
    • F5技术
    • Juniper
    • Linux
    • NGINX
    • SDN
    • ServiceMesh
    • WEB编程
    • WINDOWS相关
    • 业界文章
    • 交换机技术
    • 化云为雨/Openstack
    • 协议原理
    • 容器/k8s
    • 我的工作
    • 我的生活
    • 网站技术
    • 路由器技术
    • 项目案例
    标签聚合
    network gtm envoy F5 irule flannel openstack k8s istio nginx neutron DNS api bigip docker
    最近评论
    汤姆 发布于 9 个月前(09月10日) 嗨,楼主,里面的json怎么下载啊,怎么收费啊?
    汤姆 发布于 9 个月前(09月09日) 大佬,kib的页面可以分享下吗?谢谢
    zhangsha 发布于 1 年前(05月12日) 资料发给我下,谢谢纳米同志!!!!lyx895@qq.com
    李成才 发布于 1 年前(01月02日) 麻烦了,谢谢大佬
    纳米 发布于 1 年前(01月02日) 你好。是的,因为以前下载系统插件在一次升级后将所有的下载生成信息全弄丢了。所以不少文件无法下载。DN...
    浏览次数
    • Downloads - 184,464 views
    • 联系我 - 118,966 views
    • 迄今为止最全最深入的BIGIP-DNS/GTM原理及培训资料 - 117,761 views
    • Github - 104,409 views
    • F5常见log日志解释 - 80,022 views
    • 从传统ADC迈向CLOUD NATIVE ADC - 下载 - 75,646 views
    • Sniffer Pro 4 70 530抓包软件 中文版+视频教程 - 74,320 views
    • 迄今为止最全最深入的BIGIP-DNS/GTM原理及培训资料 - 67,770 views
    • 关于本站 - 61,306 views
    • 这篇文档您是否感兴趣 - 55,670 views
    链接表
    • F5SE创新
    • Jimmy Song‘s Blog
    • SDNlab
    • Service Mesh社区
    • 三斗室
    • 个人profile
    • 云原生社区

    COPYRIGHT © 2023 Cloud Native 应用交付. ALL RIGHTS RESERVED.

    Theme Kratos Made By Seaton Jiang

    京ICP备14048088号-1

    京公网安备 11010502041506号