FastNetMonの導入:NetFlow/sFlowによる「軽量な」DDoS検知ソリューション

Network tutorial - IT technology blog
Network tutorial - IT technology blog

なぜあなたのシステムにFastNetMonのような「門番」が必要なのか?

以前、私は50人規模のオフィスと小規模なデータセンターのインフラを管理していました。ある日、突然インターネットが極端に重くなりました。社員はメールのチェックすらできなくなりましたが、不思議なことにサーバーのCPUやRAMの使用率は極めて低いままでした。15分ほど tcpdump と格闘した末、ようやく特定のIPが激しいトラフィックのフラッド攻撃を受けていることを突き止めました。緊急時に手動でログを精査するのは、まさに苦行です。

そこで役立つのがFastNetMonです。リソースを大量に消費するパケットキャプチャ(packet capture)を行う代わりに、このツールはフローデータ(NetFlow, sFlow, IPFIX)を分析します。これは、すべての通話を盗聴するのではなく、通話料金の明細をチェックして嫌がらせ電話の発信元を特定するようなものです。このアプローチにより、従来の手法と比較してCPU負荷を最大90%削減でき、わずか2〜5秒で攻撃を検知することが可能になります。

FastNetMon(Community Edition)のインストール

FastNetMonにはAdvanced(有料版)とCommunity(無料版)の2つのエディションがあります。オフィスネットワークや中規模データセンターの管理であれば、Community版で十分です。今回は互換性の高いUbuntu 22.04 LTSへのインストールを優先して解説します。

公式スクリプトを使用して素早くインストールできます:

wget https://raw.githubusercontent.com/pavel-odintsov/fastnetmon/master/src/fastnetmon_install.pl -O fastnetmon_install.pl
perl fastnetmon_install.pl

スクリプトがOSを自動判別し、依存関係をインストールします。ネットワーク速度にもよりますが、通常3〜5分ほどで完了します。完了後、fastnetmon サービスが起動可能な状態になります。

トラフィック検知のための詳細設定

メインの設定ファイルは /etc/fastnetmon.conf にあります。ここがシステムの「頭脳」であり、データソースやアラートの閾値を定義する場所です。

1. 保護対象のIPレンジの宣言

FastNetMonは、どのIPレンジが自社の所有であるかを知る必要があります。/etc/networks_list ファイルに1行に1つのレンジを記述してください:

1.2.3.0/24
192.168.1.0/24

2. フロー検知の設定

/etc/fastnetmon.conf を開きます。使用しているネットワーク機器(Ciscoルーター、Mikrotik、Juniperスイッチなど)に合わせて、対応するプロトコルを有効にします:

# NetFlow (Cisco, Mikrotik, Ubiquiti)
netflow = on
netflow_port = 2055
netflow_host = 0.0.0.0

# sFlow (HP, Juniper, Arista)
sflow = on
sflow_port = 6343
sflow_host = 0.0.0.0

3. アラート閾値(Thresholds)の設定

これが重要なステップです。閾値を低く設定しすぎると誤検知が発生し、高く設定しすぎると処理が間に合わずサーバーがダウンしてしまいます。一般的な100Mbps回線の場合、私は通常、以下の安全なパラメータから設定を始めます:

# PPS(1秒あたりのパケット数)の閾値
threshold_pps = 20000

# 帯域幅(Mbps)の閾値
threshold_mbps = 80

# 同時接続数の閾値
threshold_flows = 3500

ファイルを保存し、サービスを再起動して変更を適用します:sudo systemctl restart fastnetmon

攻撃発生時の対応スクリプトの作成

FastNetMonの強みは、notify_script を通じた自動化機能です。IPが閾値を超えたことを検知すると、スクリプトを実行してTelegramへの通知送信やBGP Blackholeের適用などのアクションを実行できます。

設定ファイル内で以下の行を探し、自作スクリプトのパスを指定します:

notify_script_path = /usr/local/bin/fastnetmon_notify.sh

以下は、ログを記録し、一時的にIPをブロックする簡単なスクリプトの例です:

#!/bin/bash
# FastNetMonは3つの引数を渡します:IP、攻撃の方向、強度
IP_TARGET=$1
DIRECTION=$2

echo "警告: IP $IP_TARGET が攻撃を受けています ($DIRECTION) 時刻: $(date)" >> /var/log/fastnetmon_attacks.log

# ゲートウェイで実行している場合、iptablesでIPをブロックできます
# iptables -I FORWARD -d $IP_TARGET -j DROP

実行権限を与えるのを忘れないでください:chmod +x /usr/local/bin/fastnetmon_notify.sh

ダッシュボードによる実際の監視

リアルタイムのトラフィックを監視するには、次のコマンドを使用します:

fastnetmon_client

このツールは、最も帯域を消費しているIPのリストを表示します。hping3 などで擬似的な攻撃テストを行うと、数値が急上昇し、そのIPが即座に「Ban list」に入れられるのが確認できます。

私の経験では、FastNetMonをInfluxDBやGrafanaと組み合わせることをお勧めします。データをグラフで可視化することで、無機質なコマンドラインを見るよりも、攻撃パターン(attack patterns)をはるかに容易に特定できるようになります。

ルーターからフローを送信する初期設定は少し手間がかかるかもしれません。しかし、一度安定して稼働すれば、FastNetMonは静かな守護者となります。予期せぬDDoS攻撃に怯えることなく、枕を高くして眠れるようになるでしょう。

Share: