本記事では、fail2ban で検知した攻撃元IPを firewalld の ipset に自動登録し、継続的に遮断する方法を解説します。
この構成にすると、SSH や WordPress、メールサーバーへの不正アクセスを検知したIPをまとめて管理できます。
■ この構成でできること
・fail2ban が不正アクセスを検知
・攻撃元IPを ipset に追加
・firewalld がそのIPを遮断
■ 全体構成
fail2ban
↓
ipset(blacklist)
↓
firewalld rich ruleでdrop
■ 前提
以下が導入済みであることを前提にしています。
・fail2ban
・firewalld
・ipset
■ ① blacklist 用 ipset を作成
まず、攻撃元IPを入れる ipset を作成します。
sudo firewall-cmd --permanent --new-ipset=blacklist --type=hash:ip
firewalld では ipset を作成し、ゾーンや rich rule のソースとして使えます。
■ ② blacklist を drop する rich rule を追加
sudo firewall-cmd --permanent \
--add-rich-rule='rule family="ipv4" source ipset="blacklist" drop'
rich rule では source に ipset を指定でき、drop / reject / accept などの動作を定義できます。
■ ③ 設定反映
sudo firewall-cmd --reload
■ ④ 動作確認
sudo firewall-cmd --get-ipsets
sudo firewall-cmd --list-rich-rules
■ ⑤ fail2ban の action を作成
fail2ban から firewalld の ipset に追加・削除する専用 action を作ります。
sudo vi /etc/fail2ban/action.d/firewalld-ipset-blacklist.conf
■ 内容(そのままコピペ)
[Definition]actionstart =
actionstop =
actioncheck =
actionflush =actionban = firewall-cmd --permanent --ipset=blacklist --add-entry=<ip> && firewall-cmd --reload
actionunban = firewall-cmd --permanent --ipset=blacklist --remove-entry=<ip> && firewall-cmd --reload
■ ⑥ jail.local に設定を追加
sudo vi /etc/fail2ban/jail.local
たとえば SSH に適用する場合はこうします。
[sshd]
enabled = true
port = 10022
logpath = %(sshd_log)s
backend = systemd
maxretry = 3
findtime = 600
bantime = 604800
action = firewalld-ipset-blacklist
メールサーバーにも同じ action を使えます。
[postfix-sasl]
enabled = true
action = firewalld-ipset-blacklist[dovecot]
enabled = true
action = firewalld-ipset-blacklist
■ ⑦ fail2ban 再起動
sudo systemctl restart fail2ban
sudo systemctl enable fail2ban
■ ⑧ 状態確認
sudo fail2ban-client status
sudo fail2ban-client status sshd
■ ⑨ ipset 側の確認
sudo firewall-cmd --permanent --ipset=blacklist --get-entries
ここに攻撃元IPが入っていればOKです。
■ 手動テスト
手動で ban して確認できます。
sudo fail2ban-client set sshd banip 1.2.3.4
確認:
sudo firewall-cmd --permanent --ipset=blacklist --get-entries
解除:
sudo fail2ban-client set sshd unbanip 1.2.3.4
■ よくあるトラブル
● IPが追加されない
→ action 名の指定ミス
→ fail2ban 再起動忘れ
● 追加されても遮断されない
→ firewalld の rich rule 未設定
→ reload 失敗
● reload が多すぎて重い
→ 攻撃が多い環境では負荷になる場合があります
■ 運用上の注意
この方法は分かりやすい反面、ban / unban のたびに firewall-cmd --reload を実行するので、攻撃が非常に多い環境では少し重くなることがあります。
まずはこのシンプル版で運用し、必要なら後で direct rule やより高度な action に進むのがおすすめです。firewalld では複雑な制御に rich rule を使えますが、ルール順序や優先度の概念もあります。
■ この構成のメリット
・firewalld に blacklist を集約できる
・fail2ban の jail を増やしても管理しやすい
・SSH / WordPress / メールサーバーをまとめて防御できる
■ 関連記事
→ fail2ban 設定
→ firewalld 導入
→ ipset で特定の国だけ遮断する方法
→ WordPressを日本IPのみ公開する方法

コメント