hostsflowとElasticFlowでホストの通信をサンプリングする
仕事で、どのホストがどれくらいどこと通信してるのかを知る必要があり、同僚が以前検証していた、sFlowを最近触った。sFlowを利用すると通信を一定の間隔でサンプリングして、大体の通信先と量を知ることができる。ただそのデータをどう見るかが問題で、ElasticFlowを利用すると色々見える可できて便利そうだった。詳細はLINEのブログが詳しいです。
https://engineering.linecorp.com/ja/blog/internet-traffic-by-elastiflow/
これをなんか雑に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にデータを送ることができるので、色々分析可能になって便利そう。便利になった内容はどこかでいつか話す。