概要
本記事では、以下をすべて統合した「実運用レベルの防御構成」を構築します。
- 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 で状況確認
- メール送受信チェック
まとめ
本構成により:
✔ 再起動しても崩れない
✔ 攻撃を自動遮断
✔ 最小開放で安全運用
👉 実運用レベルのセキュリティ基盤完成

コメント