ふと、zabbixサーバの管理画面にあるIPから大量のログイン失敗履歴があることに気づいたので、以下、対策。
Linuxサーバー(Red Hat Enterprise Linux 9 / RHEL9)を運用していると、特定のIPアドレスから不審なアクセスを受け、即座に通信を遮断したい場面に遭遇することがあります。
今回は、RHEL9の標準ファイアウォールである firewalld を使い、特定のIPアドレスからの通信を安全かつ確実に拒否する手順を解説します。
なぜ「drop」アクションがおすすめなのか?
firewalldで通信を拒否する場合、主に reject と drop の2つのアクションが選べます。
-
reject: 送信元に対して「拒否しました」という応答(ICMPエラーなど)を返します。
-
drop: 応答を一切返さず、パケットを完全に無視(破棄)します。
セキュリティの観点からは、drop アクションを指定するのが最もおすすめです。サーバーが存在していること(パケットが到達していること)自体を攻撃者に対して完全に隠蔽できるため、よりセキュアな状態を作ることができます。
1. 特定のIPアドレスからの通信を拒否する手順
firewalldで細かい条件を指定して制御を行うには、リッチルール(--add-rich-rule)を使用します。
STEP 1:拒否ルールの追加(永続化)
以下のコマンドを実行し、指定したIPアドレス(例として 192.168.1.100)からのすべての通信を遮断するルールを追加します。後で再起動しても消えないように --permanent オプションを付与します。
Bash
sudo firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address="192.168.1.100" drop'
STEP 2:設定のリロード(反映)
ルールを追加しただけではまだ反映されていません。設定をリロードしてシステムに適用します。
Bash
sudo firewall-cmd --reload
2. 【応用】その他の便利な設定・運用オプション
実務でよく使う、リッチルールの応用操作をまとめました。
■ 特定のポート(サービス)のみを拒否する場合
「すべての通信を遮断するのではなく、特定のIPからのSSH接続(22番ポート)だけを拒否したい」という場合は、以下のようにポート番号とプロトコルを指定します。
Bash
sudo firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address="192.168.1.100" port port="22" protocol="tcp" drop'
sudo firewall-cmd --reload
■ 設定されているルールの確認方法
現在適用されているリッチルールの一覧を表示して、意図したIPアドレスが正しく登録されているか確認します。
Bash
sudo firewall-cmd --list-rich-rules
rule family="ipv4" source address="xxx.xxx.xxx.xxx" drop
■ 設定したルールを削除(解除)したい場合
誤って設定してしまった場合や、ブロックを解除したい場合は、追加時と同じ条件を指定して --remove-rich-rule を実行します。
Bash
sudo firewall-cmd --permanent --remove-rich-rule='rule family=ipv4 source address="192.168.1.100" drop'
sudo firewall-cmd --reload
まとめ
RHEL9のfirewalldで特定のIPを弾くには、リッチルールの drop を使うのが最も手軽で安全です。
不審なログを見つけたら、二次被害を防ぐためにも迅速に firewall-cmd で対処できるようにしておきましょう。より詳細なパラメータの指定方法や、複数のIP帯(CIDR表記)での一括拒否などについては、Red Hatの公式ドキュメントも併せて確認してみてください。
