hostsflowとElasticFlowでホストの通信をサンプリングする

仕事で、どのホストがどれくらいどこと通信してるのかを知る必要があり、同僚が以前検証していた、sFlowを最近触った。sFlowを利用すると通信を一定の間隔でサンプリングして、大体の通信先と量を知ることができる。ただそのデータをどう見るかが問題で、ElasticFlowを利用すると色々見える可できて便利そうだった。詳細はLINEのブログが詳しいです。

これをなんか雑にVMで検証する方法がないかなぁと思って調べていたのだが、hostsflowというものがあって、パッケージを入れるだけで、インストールしたホストで情報を吸い出せるようだった。

パッケージをインストールして、下記のような設定を書くだけで、出力先のコレクターに情報を送ることができる。

% sudo cat /etc/hsflowd.conf
sflow {
     agent = ens3
     polling = 10
     sampling = 1000
     collector { ip=localhost  udpport=9995}
     pcap { dev = ens3 }
}

localhostのUDP:9995では下記のようなdocker-compose.ymlで起動したElasticFlowのコレクタープロセスが起動している。

version: '3'
services:
  # ElastiFlow Unified Flow Collector
  flow-collector:
    image: elastiflow/flow-collector:5.6.0
    container_name: flow-collector
    restart: 'unless-stopped'
    network_mode: 'host'
    volumes:
      - /etc/elastiflow:/etc/elastiflow
    environment:
      EF_FLOW_SERVER_UDP_IP: '0.0.0.0'
      EF_FLOW_SERVER_UDP_PORT: 9995
      EF_FLOW_OUTPUT_STDOUT_ENABLE: 'true'
      EF_FLOW_OUTPUT_STDOUT_FORMAT: 'json_pretty'

この設定は、標準出力にダンプしているだけなのだが、例えばElasticsearchやKafkaにデータを送ることができるので、色々分析可能になって便利そう。便利になった内容はどこかでいつか話す。