BETA

Geoipを使ってNetflowをKibanaで国別に可視化する

投稿日:2019-03-21
最終更新:2019-03-21

はじめに

  • 新しくvyosを構築するにあたって、vyosに対するinboundのnetflowをkibanaで可視化した。トラフィックの送信元の国別で出力したいと思ったので導入してみようと思った。
  • さまざまな記事で取り上げられている方法を試したら、Fluentdのアップデートで動作しない部分が多々あったのでまとめた。

環境

  • ubuntu 16.04 Server
    • Elasticsearch 6.6.1
    • Fluentd (td-agent) 1.3.3
    • Kibana 6.6.1

事前準備

  • 上記の環境が整っている
  • vyosでnetflowの設定をしている

Geoipのインストール

関連パッケージのインストール

sudo apt install libgeoip-dev libmaxminddb-dev gcc  

Geoip Pluginのインストール

sudo /opt/td-agent/embedded/bin/fluent-gem install fluent-plugin-geoip  

/etc/td-agent/td-agent.confの編集

hostには自身のelasticsearchのアドレスを記入

<source>  
    type netflow  
     tag netflow.event  
     port 5141  
     versions [5, 9]  
</source>  

<filter netflow.**>  
    @type geoip  
    geoip_lookup_key ipv4_src_addr  
    <record>  
        geoip_country ${country.names.en["ipv4_src_addr"]}  
        geoip_city ${city.names.en["ipv4_src_addr"]}  
        geoip_lat ${location.latitude["ipv4_src_addr"]}  
        geoip_lon ${location.longitude["ipv4_src_addr"]}  
        geoip_pin ${location.latitude["ipv4_src_addr"]},${location.longitude["ipv4_src_addr"]}  
    </record>  
    skip_adding_null_record  
</filter>  

<match netflow.**>  
    @type elasticsearch  
    host xxx.xxx.xxx.xxx  
    port 9200  
    type_name netflow  
    logstash_format true  
    logstash_prefix flow  
    logstash_dateformat %Y%m%d  
</match>  

Fluentdの再起動

/etc/init.d/td-agent restart  

動作確認

NetFlowのindexが追加されていることを確認する。

curl -XGET 'localhost:9200/_cat/indices?v&pretty'  

出力例

yellow open flow-20190312 TKMzh0A3QGmRQRRdgz9f5w 5 1 1895 0 919.4kb  
yellow open flow-20190313 ESVPs7FBQZyrz6c2AruJ9w 5 1 1676 0 940.7kb  

NetFlowのindexにgeoipが追加されていることを確認する。(YYYYMMDDは任意の日付)

curl -XGET 'localhost:9200/flow-YYYYMMDD/_search?pretty'  

出力例

~~~  
"geoip_country" : "United States",  
"geoip_city" : "Mountain View",  
"geoip_lat" : 37.419200000000004,  
"geoip_lon" : -122.0574,  
"geoip_pin" : "37.419200000000004,-122.0574",  
"@timestamp" : "2019-03-13T02:53:19.000000000+09:00"  
~~~  

利用例

KibanaのRegion Mapで表示

  • Visualizeを作成する
    Visualize->New Visualization->Region Mapを選択

  • Buckets->Aggregationを編集する。

Data
Aggregation : Terms
Field : geoip_country.keyword

Options
Vector map : Workd Countries
Join field : name

Reagion Mapが表示される。

問題点

  • kibanaとGeoipの国名の対応付けがずれているため、一部の国が正しく表示されない。
    確認済:South Korea <-> Republic of Korea

    • ISO 3166-1 alpha 2 and alpha 3 codesを利用する or kibanaの更新を待ちましょう。
  • kibanaのAvailable fieldsに、geoip_pinなどが?として認識される。

    • indexのtemplateを更新させることで解決できるらしいですが、うまく更新できませんでした。
    • 非推奨 これまで蓄積したデータ・設定などをすべて消すことで強制的に読み込ませることができます。なるべくやらないでください。
curl -XDELETE 'localhost:9200/*'  
sudo service kibana restart  

まとめ

Kibanaで国別のnetflowが見れた。たのしい。

追記

同様の環境のEFKを構築する方法もそのうち。

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

@sabamisoの技術ブログ

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
目次をみる
技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
or 外部アカウントではじめる
10秒で技術ブログが作れます!