1、需求想通過地圖形式可視化展示 IP 地址對應的經緯度坐標的分布。2、方案探討實現藉助第三方工具:https://ipstack.com/第二步:經緯度坐標藉助可視化工具(如:echarts)渲染展示。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 地址。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)的方式。零寫入代碼修改:甚至寫入數據的代碼一行都不需要改就可以。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.continent_name:大陸名稱geoip.country_iso_code:國家編碼geoip.location:經緯度坐標,必須是:geo_point 類型geoip.region_iso_code:地域編碼比如:所有的默認字符串類型改成: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,寫入數據不需要做任何特殊處理了。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/點擊查看「閱讀原文」,獲取近10小時進階視頻教程,和全球近1000 位 Elastic 愛好者一起每日精進 ELK 技能!