FireHOL (L1-L3) を活用した最小&強固な iptables 構成
FireHOL の不正アクセス判定リスト(Level 1~3)を軸にした、シンプルかつ堅牢な iptables 構成を紹介します。
個別のカスタムルールを増やすのではなく、「FireHOL が分類した悪性IPを DROP するだけ」という設計に集約することで、メンテナンス性を高めています。
1. FireHOL 各レベルの役割
FireHOL は複数のブラックリストを統合しており、レベルが上がるほど「直近の活動」や「特定の攻撃」にフォーカスした内容になります。
Spamhaus DROP/EDROP等を含む、全通信を拒否すべき「最悪のIP」リスト。誤検出が極めて少なく、常時全遮断推奨。
過去48時間以内に攻撃やスパム送信が確認されたIP。踏み台ノードも含まれるため、Level 1 同様、公開サービスへのアクセスを制限するのに非常に有効です。
2. 自動更新スクリプトの導入
以下のスクリプトは firehol_level1 を例にしていますが、変数 IPSET_NAME と LIST_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_level1 ~ level3 のセットを 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 1 よりもリストの入り替わりが激しいため、誤検出が起きる可能性がわずかに高まります。
特に自宅外から SSH や VPN で接続する場合は、自分の接続元 IP がリストに含まれていないかの確認、あるいは自分の IP を別途
ホワイトリスト 扱いにするなどの対策を推奨します。
- 定期実行:
0 4 * * * /path/to/scriptのように cron で定期更新してください。 - 監視:
ipset -L firehol_level1 | head等で、エントリ数が数万規模で入っているか時々確認しましょう。
まとめ
iptables 単体では管理不可能な「膨大なブラックリスト」を ipset にアウトソーシングすることで、サーバの負荷を抑えつつ、Spamhaus をはじめとする主要な攻撃元DBを丸ごと防御に活用できます。
Level 1~3 を一貫したスクリプトで管理し、セキュアなサーバ運用を実現しましょう。