GeoIPというIPアドレスから地理情報を確認することができるサービスをご存知でしょうか。以前の記事で、Fluent,Elasticsearch,Kibanaを利用したVyOSのNetFlow監視の環境を構築したので、これを応用させてVyOSにアクセスしてくる端末の位置情報をGeoIPを使って、Kibanaに可視化していきたいと思います。
GeoIPの設定
GeoIPコンパイルに必要なパッケージをインストールする。
$ sudo apt-get install libgeoip-dev
fluent-plugin-geoidのインストール
$ sudo /opt/td-agent/embedded/bin/fluent-gem install fluent-plugin-geoip
Fluentdのconfファイルにgeoipタグの設定を書く
$ sudo vim /etc/td-agent/td-agent.conf
--省略--
<match geo.netflow.**>
type geoip
geoip_lookup_key ipv4_src_addr
<record>
geoip_country ${country_code['ipv4_src_addr']}
geoip_city ${city['ipv4_src_addr']}
geoip_lat ${latitude['ipv4_src_addr']}
geoip_lon ${longitude['ipv4_src_addr']}
geoip_pin ${latitude["ipv4_src_addr"]},${longitude["ipv4_src_addr"]}
</record>
remove_tag_prefix geo.
add_tag_prefix es.
skip_adding_null_record
</match>
<match es.netflow.**>
type elasticsearch
host localhost
port 9200
type_name netflow
logstash_format true
logstash_prefix flow
logstash_dateformat %Y%m%d
</match>
<source>
type netflow
tag geo.netflow.event
port 5141
versions [5, 9]
</source>
今までに受信したflowのIndexを削除(しなくても良い。すぐに有効化するため)
curl -XDELETE 'localhost:9200/flow-*'
受信するflowのIndexに"type" : "geo_point"のフォーマットを追加
$ curl -XPUT http://localhost:9200/_template/flow -d '
{
"template" : "flow-*",
"mappings" : {
"netflow" : {
"properties" : {
"@timestamp" : {
"type" : "date",
"format" : "dateOptionalTime"
},
"geoip_pin" : {
"type" : "geo_point"
}
}
}
}
}'
以上、fluend(td-agent)を再起動する
$ /etc/init.d/td-agent restart
動作確認
以下のコマンドでflow-yyyymmddのIndexフォーマットにgeoipのタグがあるか確認
$ curl -XGET 'localhost:9200/_mapping?pretty'
実際のIndexにgeoipのタグがあるか確認
$ curl "http://localhost:9200/flow-yyyymmdd/_search?pretty"
Kiabnaで確認
geoid_pinバーのVisualizeをクリックすれば、以下のように地理情報として可視化できる。