fail2ban → ipset自動連携|攻撃IPをfirewalldで自動遮断する方法

水冷パソコンの水温 Security

本記事では、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のみ公開する方法

コメント

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