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 形式のパッケージをダウンロードし、ローカルからインストールしました。
| 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
へインストールされました。
| # which goflow2
/usr/bin/goflow2
|
対話的な実行
特に何もオプションを指定せず、実行可能です。 この場合、「sFlow は UDP/6343、NetFlow は UDP/2055」で Listen し、フロントジョブとして実行されます。
Cisco デフォルトに合わせて「NetFlow のポート番号を UDP/9995 へ変更する」場合は以下のように実行します。
| goflow2 -listen sflow://:6343,netflow://:9995
|
サービスとして実行
GoFlow2 は systemd 用の Unit ファイルが同梱されており、パッケージからインストールした時点でサービス登録自体は行われていました。
| # 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
が存在せず、サービスが起動しません。 その為、予めこのディレクトリを作成しておきます。
| mkdir -p /usr/share/goflow2
|
GoFlow2 はデフォルトでログを標準出力に出力するようです。 出力先をファイルへ変更するには -transport.file
オプションを利用します。 上記の Unit ファイル中の定義 (ExecStart
) を見ると分かりますが、GoFlow2 をサービスとして起動する際の引数は /etc/default/goflow2
ファイル中の GOFLOW2_ARGS
が参照されていることが分かります。 その為、今回は以下のようにこのファイルを修正します。
修正前
修正後
| GOFLOW2_ARGS="-listen sflow://:6343,netflow://:9995 -transport.file /var/log/goflow2.log"
|
ここまで準備が出来たらサービスの起動&自動起動設定を行います。
| systemctl start goflow2
systemctl enable goflow2
|
これで GoFlow2 がサービスとして起動しました。
| # 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)
|