Raspberry Pi (Linux)Security

FireHOL (L1-L3) を活用した最小&強固な iptables 構成

公開日: 2025-12-11 | 改訂版: IPset 運用ガイド

FireHOL の不正アクセス判定リスト(Level 1~3)を軸にした、シンプルかつ堅牢な iptables 構成を紹介します。
個別のカスタムルールを増やすのではなく、「FireHOL が分類した悪性IPを DROP するだけ」という設計に集約することで、メンテナンス性を高めています。

1. FireHOL 各レベルの役割

FireHOL は複数のブラックリストを統合しており、レベルが上がるほど「直近の活動」や「特定の攻撃」にフォーカスした内容になります。

Level 1 (最強固)

Spamhaus DROP/EDROP等を含む、全通信を拒否すべき「最悪のIP」リスト。誤検出が極めて少なく、常時全遮断推奨。

Level 2 & 3 (動的)

過去48時間以内に攻撃やスパム送信が確認されたIP。踏み台ノードも含まれるため、Level 1 同様、公開サービスへのアクセスを制限するのに非常に有効です。

2. 自動更新スクリプトの導入

以下のスクリプトは firehol_level1 を例にしていますが、変数 IPSET_NAMELIST_URL を変更することで、Level 2 / 3 についても全く同様の手順で運用が可能です。
Levelごとにスクリプトを作成するか、ループ処理に書き換えて運用してください。

#!/bin/bash
# /usr/local/bin/update-firehol.sh
# ※Level 2, 3 の場合は URL末尾を firehol_level2.netset 等に変更して使用します。

IPSET_NAME="firehol_level1"
TMP_IPSET_NAME="${IPSET_NAME}_new"
LIST_URL="https://iplists.firehol.org/files/firehol_level1.netset"
TMPFILE=$(mktemp)
RESTORE_FILE=$(mktemp)

echo "[INFO] Updating ${IPSET_NAME}..."

# 1. ダウンロード
curl -s $LIST_URL -o $TMPFILE
if [ $? -ne 0 ] || [ ! -s "$TMPFILE" ]; then
    echo "[ERROR] Download failed."
    rm -f $TMPFILE $RESTORE_FILE
    exit 1
fi

# 2. ipset restore 用ファイルの生成
echo "create ${TMP_IPSET_NAME} hash:net" > $RESTORE_FILE
grep -E "^[0-9]" $TMPFILE | awk '{print "add '"${TMP_IPSET_NAME}"' "$1}' >> $RESTORE_FILE

# 3. swap による安全な差し替え
sudo ipset restore -exist -file $RESTORE_FILE
if ! sudo ipset list -n | grep -q "^${IPSET_NAME}$"; then
    sudo ipset create ${IPSET_NAME} hash:net
fi
sudo ipset swap ${TMP_IPSET_NAME} ${IPSET_NAME}
sudo ipset destroy ${TMP_IPSET_NAME}

rm -f $TMPFILE $RESTORE_FILE
echo "[INFO] ${IPSET_NAME} updated."

3. iptables 構成(最終形)

作成した firehol_level1level3 のセットを Chain の先頭付近で呼び出します。
これにより、パケットは公開サービスの許可ルールに到達する前に、効率的にフィルタリングされます。

Chain INPUT(デフォルト DROP)

1  ACCEPT  state RELATED,ESTABLISHED
2  ACCEPT  in br0 (信頼区画)
3  DROP    match-set firehol_level1 src
4  DROP    match-set firehol_level2 src
5  DROP    match-set firehol_level3 src
6  ACCEPT  udp dpt:500 (IPsec)
7  ACCEPT  udp dpt:4500 (IPsec)
8  ACCEPT  in lo

Chain FORWARD(デフォルト DROP)

内部ネットワークから外部へ出る際も、FireHOL を通すことで踏み台ノードや C2 サーバへの意図しない通信を抑制できます。

1   ACCEPT  state RELATED,ESTABLISHED
2   DROP    firehol_level1 src
3   DROP    firehol_level2 src
4   DROP    firehol_level3 src
5   DROP    tcp dpts 137:139 (NetBIOS/SMB)
...
12  ACCEPT  tcp dpt 25 (SMTP)
13  ACCEPT  tcp dpt 80/443 (Web)

4. 運用のアドバイス

Level 2 / 3 の注意点:
これらは Level 1 よりもリストの入り替わりが激しいため、誤検出が起きる可能性がわずかに高まります。
特に自宅外から SSH や VPN で接続する場合は、自分の接続元 IP がリストに含まれていないかの確認、あるいは自分の IP を別途 ホワイトリスト 扱いにするなどの対策を推奨します。

まとめ

iptables 単体では管理不可能な「膨大なブラックリスト」を ipset にアウトソーシングすることで、サーバの負荷を抑えつつ、Spamhaus をはじめとする主要な攻撃元DBを丸ごと防御に活用できます。
Level 1~3 を一貫したスクリプトで管理し、セキュアなサーバ運用を実現しましょう。