GeoIPを使って送信元アドレスの地理情報を可視化する


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をクリックすれば、以下のように地理情報として可視化できる。