「ただ通す」だけじゃ満足できないあなたへ
こんにちは!「リナックス先生」です。
Firewalld講座、記念すべき第10回です。
これまでは「ゾーン」と「サービス」を使って、比較的シンプルな門番の役割を果たしてきました。
しかし、サーバーエンジニアとして経験を積むと、こんな要望が出てくるはずです。
- 「SSHで誰かがログインしようとしたら、その記録(ログ)を残したい」
- 「特定の怪しいIPアドレスだけをピンポイントで拒否したい」
- 「パスワード総当たり攻撃が怖いから、1分間に3回間違えたら遮断したい」
標準のゾーン設定(--add-service)だけでは、これらの要望は叶えられません。
そこで登場するのが、より細かく、リッチ(豊富)な条件を記述できる「リッチルール(Rich Rules)」です。
先生、「リッチ」って名前がつくと急に難しそうなんですけど…。
コマンドも長くなりそうだし、僕に扱えますかね?
確かに構文は少し長くなるわ。
でも、英語の「S(主語)+ V(動詞)+ O(目的語)」の文法と同じだと思えば簡単よ。
「誰が」「何をしたら」「どうする」を並べるだけ。今日は使えるパターンをコピペで覚えちゃいましょう!
1. リッチルールの基本構文
リッチルールは、基本的に以下のコマンド形式で追加します。'シングルクォート' で囲むのがポイントです。
sudo firewall-cmd --permanent --add-rich-rule='ルールの中身'
ルールの中身は以下のような構造になっています。
- family: IPv4 か IPv6 か
- source: 誰からの通信か(IPアドレス)
- service/port: どのサービスか(SSHや80番など)
- log: ログを取るかどうか(省略可)
- action: どうするか(accept / reject / drop)
言葉で説明するより、実例を見たほうが早いでしょう。
2. 【実践】特定のIPアドレスをブロックする(ブラックリスト)
「このIPアドレス(例: 1.2.3.4)から不審なアクセスが続いている!今すぐ遮断したい!」
そんな時は、drop アクションを使います。
ブロック設定の追加
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="1.2.3.4" drop'
sudo firewall-cmd --reload
これは「IPv4で、送信元が1.2.3.4の通信は、問答無用で捨てる(drop)」という意味です。drop は相手に返事をせず無視します。reject にすると「拒否されました」という通知を相手に返します。
設定の確認
リッチルールは専用のコマンドで確認します。
sudo firewall-cmd --list-rich-rules
▼実行結果
rule family="ipv4" source address="1.2.3.4" drop
3. 【実践】SSH接続のログを記録する
通常、Firewalldは通信を許可しても「許可しました」というログは残しません。
しかし、SSHのような重要な入り口は「いつ誰が入ったか」を記録しておきたいものです。
ログ付き許可ルールの追加
既存のSSH許可(--add-service=ssh)とは別に、リッチルールで上書きするイメージです。
sudo firewall-cmd --permanent --add-rich-rule='rule service name="ssh" log prefix="SSH_ACCESS: " level="info" accept'
sudo firewall-cmd --reload
- log prefix=”SSH_ACCESS: “: ログの先頭に目印をつける(検索しやすくするため)。
- level=”info”: ログの重要度。
- accept: ログを取った上で「許可」する。
ログはどこに出る?
AlmaLinux 9の場合、システムのメインログファイルに記録されます。
以下のコマンドでリアルタイムに確認できます。
sudo tail -f /var/log/messages | grep "SSH_ACCESS"
または
sudo dmesg | grep "SSH_ACCESS"
SSH接続を試みると、以下のようなログが流れるはずです。
kernel: SSH_ACCESS: IN=eth0 OUT= MAC=... SRC=192.168.1.10 DST=...
4. 【実践】総当たり攻撃を防ぐ(レートリミット)
これがリッチルールの真骨頂です。
「1分間に○回以上接続してきたらブロックする」という制限(Rate Limit)をかけます。
SSHに接続制限をかける
「SSH接続は許可するが、同一IPからは1分間に3回まで」というルールです。
sudo firewall-cmd --permanent --add-rich-rule='rule service name="ssh" limit value="3/m" accept'
sudo firewall-cmd --reload
value="3/m" は「1分間に3回」です。1/s(1秒に1回)や 10/h(1時間に10回)なども指定できます。
これにより、機械的なパスワード総当たり攻撃(ブルートフォースアタック)の大半を無効化できます。
これすごい!
Fail2Banみたいな専用ツールを入れなくても、Firewalldだけで簡易的な防御ができるんですね。
個人サーバーならこれだけで十分かも。
5. リッチルールの削除方法
リッチルールは複雑な文字列なので、削除する時も「追加した時の文字列」をそのまま指定する必要があります。
少し面倒ですが、コピー&ペーストで対応しましょう。
削除の手順
まず、現在設定されているルールを一覧表示して、文字列をコピーします。
sudo firewall-cmd --list-rich-rules
次に、--add-rich-rule の部分を --remove-rich-rule に変えて実行します。
sudo firewall-cmd --permanent --remove-rich-rule='rule family="ipv4" source address="1.2.3.4" drop'
sudo firewall-cmd --reload
6. 優先順位のワナに注意
Firewalldにはルールの適用順序(優先順位)があります。
リッチルールを使い始めると、ここでハマることがあります。
Firewalldの処理順序
- Direct Rules(直接ルール):iptablesコマンド互換の最強ルール(今回は扱いません)。
- Rich Rules(リッチルール):今回学んだルール。ログ記録やDROPはここで処理される。
- Zones/Services(標準設定):
--add-serviceなどで設定した通常の許可。
【重要ポイント】
例えば、標準設定で「SSHを許可(accept)」していても、リッチルールで「このIPは拒否(drop)」と書けば、リッチルールが優先されてブロックされます。
逆に、リッチルールで「許可(accept)」すれば、標準設定になくても通信は通ります。
「標準設定」はあくまで「リッチルールで指定されなかったものの受け皿」だとイメージしてください。
まとめ:防御力を底上げする技術
第10回では、Firewalldの応用機能「リッチルール」を学びました。
- リッチルールを使えば、標準機能ではできない「条件付き制御」が可能になる。
- 特定の攻撃IPを drop でブロックできる(ブラックリスト)。
- 重要サービスへの接続を log で記録できる。
- limit を使えば、総当たり攻撃を速度制限で防げる。
- リッチルールは標準のゾーン設定よりも優先順位が高い。
これで、あなたのFirewalld運用能力は「上級者レベル」に達しました。
単にポートを開け閉めするだけでなく、攻撃の兆候を掴み、防ぐことができるエンジニアです。
次回(第11回)は、少し視点を変えてネットワークの応用設定「マスカレード(NAPT)とポートフォワーディング」について解説します。
Linuxサーバーを「ルーター」として使ったり、受けた通信を別のサーバーに転送したりする、インフラエンジニア憧れの技術です。お楽しみに!
▼攻撃テストも試せるVPS
レートリミットが実際に機能するかどうか、あえて自分で連打してテストするには、他人に迷惑をかけない自分専用のVPS環境が必須です。リッチルールの実験場として最適なAlmaLinux 9対応VPSはこちら。



コメント