基础方案如下:
实现借助第三方工具:https://ipstack.com/
这时候不免进一步思考:
有没有更快捷的方案呢?ELK 能实现不?
已知的知识点:
两个已知知识点一整合不就是基于 Elasticsearch + Kibana 的可视化展示方案吗?
且慢,有没有更快捷的 IP 地址转经纬度坐标的信息呢?
有的。Ingest 数据预处理管道的 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 已自带,不需要安装。
PUT _ingest/pipeline/geoip_pipeline
{
"description" : "Add geoip info",
"processors" : [
{
"geoip" : {
"field" : "ip"
}
}
]
}
该预处理的目的就是:将输入的 IP 字段转换为:Geoip 类型。具体 Geoip 类型张什么样?后面会揭晓。
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)的方式。
这样的好处是:
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 类型,它有几个子字段,含义如下:
第二:为节省存储,Mapping 可以优化。
第三:为了后面的作图必须将 location 设置为 geo_point 类型。
以上三个步骤:就完成了单条数据的写入。
目的:创建可视化需要关联的索引数据。
选择左侧导航栏的 Visualize,然后选择右侧 Create new visualization,然后再选择:Coordinate Map 即可。
本文Elasticsearch + kibana 均选用 7.2 版本。
如前所述,这里要强调的是:geoip.location 必须是 geo_point 类型。
基于第 4 节的导入一条数据,python 批量 bulk 导入本地文件数据后,可视化效果如下图所示:
换 dark 风格显示如下:
PS:文章开头提到的:特定用途——通过模拟 port scan 获取的全网部分开放 9200 端口的公网 IP(仅个人学习用,未任何其他用途)。
https://blog.ruanbekker.com/blog/2018/09/12/using-the-geoip-processor-plugin-with-elasticsearch-to-enrich-your-location-based-data/
本文分享自 铭毅天下Elasticsearch 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!