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

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 (处理器)就能达到这个目的。

整体架构图如下图所示:

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 创建关联索引模板

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

4.4.2  创建坐标图

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

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

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

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

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

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

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

换 dark 风格显示如下:

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

6、小结

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

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

参考

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

推荐:

  1. 全网首发!《 Elasticsearch 最少必要知识教程 V1.0 》低调发布

  2. 从实战中来,到实战中去——Elasticsearch 技能更快提升方法论

  3. 实战 | ELK实现全量Elastic日报(2017-2019)多维度可视化分析

  4. 相信坚持的力量!Elastic 日报 1000期+ 了......


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

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

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

铭毅天下

和你一起,死磕Elastic!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值