4

基于 Elasticsearch + kibana 实现 IP 地址分布地图可视化

 3 years ago
source link: https://mp.weixin.qq.com/s?__biz=MzI2NDY1MTA3OQ%3D%3D&%3Bmid=2247486105&%3Bidx=1&%3Bsn=6681402c76c52e95a51a3d26ea8ebf0c
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

1、需求

  • 有一批特定用途(文末揭晓)的 IP 地址。

  • 想通过地图形式可视化展示 IP 地址对应的经纬度坐标的分布。

2、方案探讨

基础方案如下:

  • 第一步:IP 地址转经纬度坐标。

实现借助第三方工具:https://ipstack.com/

  • 第二步:经纬度坐标借助可视化工具(如:echarts)渲染展示。

这时候不免进一步思考:

有没有更快捷的方案呢?ELK 能实现不?

已知的知识点:

  • Elasticsearch 支持 Geo-point、Geo-shape 数据类型。

  • Kibana 支持 Coordinate Map(坐标图)、Region Map(区域地图)可视化地图展示。

两个已知知识点一整合不就是基于 Elasticsearch + Kibana 的可视化展示方案吗?

且慢,有没有更快捷的 IP 地址转经纬度坐标的信息呢?

有的。Ingest 数据预处理管道的 GeoIP processor (处理器)就能达到这个目的。

整体架构图如下图所示:

aeuuquE.png!mobile

3、GeoIp processor 介绍

官方解读如下:GeoIp processor 根据来自 Maxmind 数据库的数据添加有关IP地址地理位置的信息。

默认情况下,GeoIp processor 将此信息添加到 geoip 字段下。GeoIp processor 可以解析 IPv4 和 IPv6 地址。

更多  Maxmind 数据库信息参见:

https://dev.maxmind.com/geoip/geoip2/geolite2/

在 Elasticsearch 早期版本中 GeoIp processor 需要安装插件才能使用。7.X 版本后,ES 已自带,不需要安装。

4、导入一条数据实战一把

4.1 步骤 1:创建预处理管道

PUT _ingest/pipeline/geoip_pipeline

{

"description""Add geoip info" ,

"processors" : [

{

"geoip" : {

"field""ip"

}

}

]

}

该预处理的 目的 就是:将输入的 IP 字段转换为:Geoip 类型。具体 Geoip 类型张什么样?后面会揭晓。

4.2 步骤 2:创建索引

DELETE niu_20210215

PUT niu_20210215

{

"settings" : {

"index.default_pipeline""geoip_pipeline" ,

"number_of_shards" : 1,

"number_of_replicas" : 0

},

"mappings" : {

"properties" : {

"geoip" : {

"properties" : {

"location" : {

"type""geo_point"

}

}

},

"ip" :{

"type" : "keyword"

}

}

}

}

考虑到后面要批量导入数千条+数据,我们采用了取巧的方式。

使用了在创建索引的时候指定缺省管道(index.default_pipeline)的方式。

这样的 好处 是:

  • 灵活:用户只关心 bulk 批量写入数据。

  • 零写入代码修改:甚至写入数据的代码一行都不需要改就可以。

4.3 步骤 3:写入一条数据

PUT niu_20210215/_doc/1

{

"ip""8.8.8.8"

}

这时候,我们查看一下完整的 Mapping 张什么样?

{

"niu_20210215" : {

"mappings" : {

"properties" : {

"geoip" : {

"properties" : {

"city_name" : {

"type""text" ,

"fields" : {

"keyword" : {

"type""keyword" ,

"ignore_above" : 256

}

}

},

"continent_name" : {

"type""text" ,

"fields" : {

"keyword" : {

"type""keyword" ,

"ignore_above" : 256

}

}

},

"country_iso_code" : {

"type""text" ,

"fields" : {

"keyword" : {

"type""keyword" ,

"ignore_above" : 256

}

}

},

"location" : {

"type""geo_point"

},

"region_iso_code" : {

"type""text" ,

"fields" : {

"keyword" : {

"type""keyword" ,

"ignore_above" : 256

}

}

},

"region_name" : {

"type""text" ,

"fields" : {

"keyword" : {

"type""keyword" ,

"ignore_above" : 256

}

}

}

}

},

"ip" : {

"type""keyword"

}

}

}

}

}

写入后的数据,查看返回如下:

"_source" : {

"geoip" : {

"continent_name""North America" ,

"country_iso_code""US" ,

"location" : {

"lon" : -97.822,

"lat" : 37.751

}

},

"ip""8.8.8.8"

}

有点长,铭毅解读一下:

第一:geoip 是 object 类型,它有几个子字段,含义如下:

  • geoip.city_name:城市

  • geoip.continent_name:大陆名称

  • geoip.country_iso_code:国家编码

  • geoip.location:经纬度坐标,必须是:geo_point 类型

  • geoip.region_iso_code:地域编码

  • geoip.region_name:地域名称

第二:为节省存储,Mapping 可以优化。

  • 比如:所有的默认字符串类型改成:keyword 类型。

第三:为了后面的作图必须将 location 设置为 geo_point 类型。

以上三个步骤:就完成了单条数据的写入。

4.4 步骤 4:kibana 可视化展示

4.4.1 创建关联索引模板

目的:创建可视化需要关联的索引数据。

IJNzmui.png!mobile

4.4.2  创建坐标图

选择左侧导航栏的 Visualize,然后选择右侧 Create new visualization,然后再选择:Coordinate Map 即可。

本文Elasticsearch + kibana 均选用 7.2  版本。

ZVnuInF.png!mobile

4.4.3  可视化基础设置,执行后,就能看到可视化结果。

如前所述,这里要强调的是:geoip.location 必须是  geo_point 类型。

3aAzYvj.jpg!mobile

5、批量导入数据后可视化展示

基于第 4 节的导入一条数据,python 批量 bulk 导入本地文件数据后,可视化效果如下图所示:

  • 因为 全局设置了 default_pipeline,写入数据不需要做任何特殊处理了。

eMZ7nen.jpg!mobile

换 dark 风格显示如下:

jQjAvuV.png!mobile

PS:文章开头提到的:特定用途——通过模拟 port scan 获取的全网部分开放 9200 端口的公网 IP(仅个人学习用,未任何其他用途)。

6、小结

Jze6Vrq.png!mobile

  • 基础方案大家都能想到,有没有更简单的、更快捷的方式呢?是需要我们考虑的。

  • 本文抛砖引玉,Kibana 新版本的可视化功能更强大,需要学习的点还有很多......

参考

https://blog.ruanbekker.com/blog/2018/09/12/using-the-geoip-processor-plugin-with-elasticsearch-to-enrich-your-location-based-data/

ZB3iMfR.png!mobile

中国最大的 Elastic 非官方公众号

点击查看“ 阅读原文 ”,获取近10小时进阶 视频教程 ,和全球近1000 位 Elastic 爱好者一起每日精进 ELK 技能!


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK