【完成版】fail2ban × ipset × firewalld によるプロ仕様セキュリティ構成(Ubuntu / Fedora対応)

水冷パソコンの水温 Security

概要

本記事では、以下をすべて統合した「実運用レベルの防御構成」を構築します。

  • firewalld(DROPベース)
  • ipset(国別・ASNブロック)
  • fail2ban(動的BAN)
  • 再起動後も崩れない自動復元構成

👉 結論:rebootしても完全復旧する鉄壁構成


構成イメージ

外部アクセス
   ↓
firewalld(DROP)
   ↓
ipset(cn / in / kr / asnblock)
   ↓
fail2ban(リアルタイムBAN)

最終構成

開放ポート

  • 80 / 443 → Web
  • 25 → SMTP
  • 587 → submission
  • 993 → IMAPS
  • 995 → POP3S
  • 1194 → OpenVPN(TCP / UDP)
  • 22 → SSH(自宅IPのみ)

firewalld 状態

zone: drop
target: DROP
sources:
  ipset:blacklist
  ipset:cn
  ipset:kr
  ipset:in
  ipset:asnblock

👉 基本すべて拒否 + 必要な通信のみ許可


ipset 構成

セット一覧

  • blacklist → fail2ban用
  • cn / kr / in → 国別ブロック
  • asnblock → ASNブロック

ipset 保存と復元

保存

sudo ipset save | sudo tee /var/lib/ipset/all.save > /dev/null

elements生成(高速復元用)

sudo awk '/^add (blacklist|cn|kr|in|asnblock) /' /var/lib/ipset/all.save \
| sudo tee /var/lib/ipset/ipset-elements.restore > /dev/null

自動復元(重要)

スクリプト

sudo vi /usr/local/bin/ipset-restore-safe.sh
#!/bin/bash
set -euo pipefail

FILE="/var/lib/ipset/ipset-elements.restore"
[ -f "$FILE" ] || exit 0

ipset create blacklist hash:ip  family inet -exist
ipset create cn        hash:net family inet -exist
ipset create kr        hash:net family inet -exist
ipset create in        hash:net family inet -exist
ipset create asnblock  hash:net family inet -exist

ipset restore -exist -file "$FILE"
sudo chmod +x /usr/local/bin/ipset-restore-safe.sh

systemd登録

sudo vi /etc/systemd/system/ipset-restore.service
[Unit]
Description=Restore ipset elements after firewalld
After=firewalld.service network-online.target
Requires=firewalld.service

[Service]
Type=oneshot
ExecStart=/usr/local/bin/ipset-restore-safe.sh
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable ipset-restore.service

fail2ban 起動順制御

sudo mkdir -p /etc/systemd/system/fail2ban.service.d
sudo vi /etc/systemd/system/fail2ban.service.d/override.conf
[Unit]
After=ipset-restore.service firewalld.service
Requires=firewalld.service

動作確認

ipset

sudo ipset list cn | grep 'Number'

fail2ban

sudo banned

期待値:

cn        : 5000+
in        : 7000+
asnblock  : 20000+
blacklist : 増加中

rebootテスト

sudo reboot

起動後:

sudo banned

👉 数値が復元されていれば成功


よくあるトラブル

① ipset が全部0

原因:

  • restore未実行
  • 起動順ミス

② fail2ban 起動失敗

原因:

  • ipset未生成
  • systemd依存ループ

③ VPN接続できない

原因:

  • OpenVPN未起動
  • firewall未開放

セキュリティ評価

✔ default DROP
✔ 国別ブロック
✔ ASNブロック
✔ 動的BAN
✔ SSH制限

👉 ほぼ鉄壁


運用ポイント

  • 1日1回 ipset save(cron推奨)
  • banned で状況確認
  • メール送受信チェック

まとめ

本構成により:

✔ 再起動しても崩れない
✔ 攻撃を自動遮断
✔ 最小開放で安全運用

👉 実運用レベルのセキュリティ基盤完成

コメント

タイトルとURLをコピーしました