Skip to content

GoFlow2 で NetFlow 情報を取得する

NetFlow のテストを実施する際、「パケットキャプチャで済ませてしまう」か、もしくは NetFlow Collector として ElastiFlow を利用していました。 ElastiFlow を利用する場合は CPU やメモリの要求スペックが高く、貧弱なホストで動作させるのは厳しい場合があります。 Go 言語で書かれた GoFlow や GoFlow2 であればフットプリントが小さく、ElastiFlow 程高機能では無いにしろ、気軽に使えるようです。

今回は Ubuntu 22.04.1 LTS へ GoFlow2 へインストールする手順をメモしておきます。

Cisco 側での NetFlow 設定

GoFlow2 をインストールする前に、NetFlow の送信元となるルータを CML 上に構築しておきます。 CML 上での Catalyst8000V における NetFlow 設定例は以下の通りです。 Exporter への通信はデフォルトで UDP/9995 が利用されます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
flow record flow-record1
 match ipv4 source address
 match ipv4 destination address
 match transport source-port
 match transport destination-port
 collect counter bytes
 collect counter packets
!
flow exporter flow-exporter1
 destination 10.0.0.100
!
flow monitor flow-monitor1
 exporter flow-exporter1
 record flow-record1
!
interface GigabitEthernet1
 ip flow monitor flow-monitor1 input
!
end

パッケージからインストール

GoFlow2 は RPM 形式や DEB 形式でパッケージが提供されています。 今回は Ubuntu 環境なので DEB 形式のパッケージをダウンロードし、ローカルからインストールしました。

1
2
curl -LO https://github.com/netsampler/goflow2/releases/download/v1.3.6/goflow2_1.3.6_amd64.deb
apt -y install ./goflow2_1.3.6_amd64.deb

/usr/bin/goflow2 へインストールされました。

1
2
# which goflow2     
/usr/bin/goflow2

対話的な実行

特に何もオプションを指定せず、実行可能です。 この場合、「sFlow は UDP/6343、NetFlow は UDP/2055」で Listen し、フロントジョブとして実行されます。

1
goflow2

Cisco デフォルトに合わせて「NetFlow のポート番号を UDP/9995 へ変更する」場合は以下のように実行します。

1
goflow2 -listen sflow://:6343,netflow://:9995

サービスとして実行

GoFlow2 は systemd 用の Unit ファイルが同梱されており、パッケージからインストールした時点でサービス登録自体は行われていました。

1
2
3
4
# systemctl status goflow2
○ goflow2.service - GoFlow2
     Loaded: loaded (/lib/systemd/system/goflow2.service; disabled; vendor preset: enabled)
     Active: inactive (dead)

Unit ファイル (/lib/systemd/system/goflow2.service) の内容は下記になっていました。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
[Unit]
Description=GoFlow2
After=network.target

[Service]
Type=simple
EnvironmentFile=/etc/default/goflow2
WorkingDirectory=/usr/share/goflow2
ExecStart=/usr/bin/goflow2 $GOFLOW2_ARGS

[Install]
WantedBy=multi-user.target

私の Ubuntu 22.04LTS 環境では Unit ファイル中で WorkingDirectory として指定されている /usr/share/goflow2 が存在せず、サービスが起動しません。 その為、予めこのディレクトリを作成しておきます。

1
mkdir -p /usr/share/goflow2

GoFlow2 はデフォルトでログを標準出力に出力するようです。 出力先をファイルへ変更するには -transport.file オプションを利用します。 上記の Unit ファイル中の定義 (ExecStart) を見ると分かりますが、GoFlow2 をサービスとして起動する際の引数は /etc/default/goflow2 ファイル中の GOFLOW2_ARGS が参照されていることが分かります。 その為、今回は以下のようにこのファイルを修正します。

修正前

1
GOFLOW2_ARGS=

修正後

1
GOFLOW2_ARGS="-listen sflow://:6343,netflow://:9995 -transport.file /var/log/goflow2.log"

ここまで準備が出来たらサービスの起動&自動起動設定を行います。

1
2
systemctl start goflow2
systemctl enable goflow2

これで GoFlow2 がサービスとして起動しました。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# systemctl status goflow2
● goflow2.service - GoFlow2
     Loaded: loaded (/lib/systemd/system/goflow2.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2023-10-25 20:22:39 JST; 27s ago
   Main PID: 26237 (goflow2)
      Tasks: 6 (limit: 4558)
     Memory: 2.9M
        CPU: 9ms
     CGroup: /system.slice/goflow2.service
             └─26237 /usr/bin/goflow2

/etc/default/goflow2 ファイル中で定義した通り、ログは /var/log/goflow2.log に出力されます。 本格的に長期運用するのであれば、必要に応じてログローテーションの設定なども実施します。

参考

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# goflow2 --help
Usage of goflow2:
  -format string
        Choose the format (available: json, pb, text) (default "json")
  -format.hash string
        List of fields to do hashing, separated by commas (default "SamplerAddress")
  -format.protobuf.fixedlen
        Prefix the protobuf with message length
  -format.selector string
        List of fields to do keep in output
  -format.tag string
        Use format tag
  -listen string
        listen addresses (default "sflow://:6343,netflow://:2055")
  -logfmt string
        Log formatter (default "normal")
  -loglevel string
        Log level (default "info")
  -mapping string
        Configuration file for custom mappings
  -metrics.addr string
        Metrics address (default ":8080")
  -metrics.path string
        Metrics path (default "/metrics")
  -netflow.templates string
        Choose the format (available: memory, file) (default "memory")
  -netflow.templates.file.path string
        Path of file to store templates (default "./templates.json")
  -reuseport
        Enable so_reuseport
  -templates.path string
        NetFlow/IPFIX templates list (default "/templates")
  -transport string
        Choose the transport (available: file, kafka) (default "file")
  -transport.file string
        File/console output (empty for stdout)
  -transport.file.sep string
        Line separator (default "\n")
  -transport.kafka.brokers string
        Kafka brokers list separated by commas (default "127.0.0.1:9092,[::1]:9092")
  -transport.kafka.compression string
        Kafka default compression
  -transport.kafka.flushbytes int
        Kafka flush bytes (default 104857600)
  -transport.kafka.flushfreq duration
        Kafka flush frequency (default 5s)
  -transport.kafka.hashing
        Enable partition hashing
  -transport.kafka.log.err
        Log Kafka errors
  -transport.kafka.maxmsgbytes int
        Kafka max message bytes (default 1000000)
  -transport.kafka.sasl string
        Use SASL to connect to Kafka, available settings: none, plain, scram-sha256, scram-sha512 (TLS is recommended and the environment variables KAFKA_SASL_USER and KAFKA_SASL_PASS need to be set) (default "none")
  -transport.kafka.srv string
        SRV record containing a list of Kafka brokers (or use brokers)
  -transport.kafka.tls
        Use TLS to connect to Kafka
  -transport.kafka.topic string
        Kafka topic to produce to (default "flow-messages")
  -transport.kafka.version string
        Kafka version (default "2.8.0")
  -v    Print version
  -workers int
        Number of workers per collector (default 1)