はじめに
firewalldで「特定のIPアドレスからの通信だけ拒否したい」ときは、drop zoneへsourceを登録する方法があります。
今回の記事では、RHEL 10.1環境で `172.16.82.96` をdrop zoneへ登録し、`172.16.82.96` から `172.16.82.53` へのSSH接続がタイムアウトすることを確認しました。
この記事では、特定IPをdrop zoneへ登録する方法、確認方法、削除して戻す方法を画像付きで短く整理します。
【注意】
自分のSSH接続元IPをdrop zoneへ登録しないでください。
誤って登録すると、SSHで再接続できなくなる可能性があります。
firewalldで特定IPを拒否する考え方
firewalldのzoneは、通信に適用するルールの入れ物です。
たとえば、public zoneで動いているサーバに対して、特定IPだけdrop zoneへsource登録すると、通常の通信はpublic zoneで処理され、指定したIPからの通信だけdrop zoneで処理されます。
default zone = public
interface = public
172.16.82.96 = drop zoneにsource登録
この場合の考え方は次のとおりです。
通常の通信 → public zoneで処理
172.16.82.96 → drop zoneで処理
public zoneのservicesやportsが変更されるわけではありません。 指定したsource IPからの通信だけがdrop zoneで処理されます。
firewalld全体の初期設定や、SSH接続中にfirewalldを起動する前の注意点は、以下の記事で詳しく解説しています。
firewalld初期設定と起動前の注意事項|SSH切断を防ぐ安全な起動手順【RHEL 10.1検証】
検証環境
今回の検証環境は以下です。
| 役割 | IPアドレス |
| 作業端末 Windows 11 | `172.16.81.41` |
| 実験台 RHEL10サーバ | `172.16.82.53` |
| 拒否対象 RHEL10サーバ | `172.16.82.96` |
`172.16.82.53` 上でfirewalldのdrop zoneに `172.16.82.96` をsource登録し、`172.16.82.96` から `172.16.82.53` へのSSH接続が遮断されることを確認しました。
検証後はdrop zoneからsourceを削除し、元の状態へ戻しています。
実行前にSSH接続元IPを確認する
まず、実験台サーバ `172.16.82.53` で、SSH接続元IPとfirewalldの状態を確認します。
echo "$SSH_CLIENT"
firewall-cmd --state
firewall-cmd --get-active-zones
firewall-cmd --get-default-zone
firewall-cmd --zone=drop --list-sources
確認結果:
172.16.81.41 53990 22
running
public (default)
interfaces: enp0s3
public
確認できたこと:
- Windows端末 `172.16.81.41` からSSH接続している
- firewalldは `running`
- active zoneは `public`
- default zoneは `public`
- drop zoneのsourcesは空

【注意】
自分のSSH接続元IPをdrop zoneへ登録しないでください。
本番環境では、コンソールや別経路を確保してから作業してください。
特定IPをdrop zoneへ登録する
実験台サーバ `172.16.82.53` で、拒否対象の `172.16.82.96` をdrop zoneへ登録します。
firewall-cmd --add-source=172.16.82.96 --zone=drop
firewall-cmd --zone=drop --list-sources
firewall-cmd --get-active-zones
確認結果:
success
172.16.82.96
drop
sources: 172.16.82.96
public (default)
interfaces: enp0s3
確認できたこと:
- `172.16.82.96` をdrop zoneへ登録できた
- drop zoneがactiveになった
- public zoneは `enp0s3` に適用されたまま

public zoneのservicesやportsが変更されるわけではありません。 通常の通信はpublic zoneで処理され、`172.16.82.96` からの通信だけがdrop zoneで処理されます。
設定を確認する
drop zoneの詳細は、次のコマンドで確認します。
firewall-cmd --zone=drop --list-all
確認結果:
drop (active)
target: DROP
interfaces:
sources: 172.16.82.96
services:
ports:
rich rules:
確認できたこと:
- drop zoneはactive
- targetは `DROP`
- sourcesに `172.16.82.96` が表示された

実際にSSH接続が拒否されるか確認する
drop zoneへsource登録する前は、`172.16.82.96` から `172.16.82.53` へSSH接続できることを確認しました。
拒否対象サーバ `172.16.82.96` 側で実行:
hostname -I
ssh -o ConnectTimeout=5 172.16.82.53
接続後、`172.16.82.53` 側で実行:
hostname -I
exit
確認できたこと:
- `172.16.82.96` から `172.16.82.53` へSSH接続できた
- 接続後の `hostname -I` で `172.16.82.53` が表示された
- `exit` で `172.16.82.96` 側へ戻れた

次に、`172.16.82.53` 側で `172.16.82.96` をdrop zoneへ登録したあと、`172.16.82.96` 側からSSH接続を試しました。
ssh -o ConnectTimeout=5 172.16.82.53
確認結果:
ssh: connect to host 172.16.82.53 port 22: Connection timed out
drop zoneへsource登録したあと、拒否対象の `172.16.82.96` から `172.16.82.53` へSSH接続を試すと、`Connection timed out` となり接続できないことを確認しました。

設定を削除して戻す
検証後は、drop zoneからsourceを削除して元に戻します。
firewall-cmd --zone=drop --remove-source=172.16.82.96
firewall-cmd --zone=drop --list-sources
firewall-cmd --get-active-zones
確認結果:
success
public (default)
interfaces: enp0s3
確認できたこと:
- `172.16.82.96` をdrop zoneから削除できた
- drop zoneのsourcesは空になった
- active zoneはpublicのみになった

最後に、実験台サーバ `172.16.82.53` が元の状態へ戻っていることを確認しました。
firewall-cmd --state
firewall-cmd --get-active-zones
firewall-cmd --get-default-zone
firewall-cmd --zone=drop --list-sources
firewall-cmd --list-all
確認結果の要点:
running
public (default)
interfaces: enp0s3
public
public (default, active)
services: cockpit dhcpv6-client ssh
ports:
rich rules:
永続化する場合の注意
今回の検証では、一時的なruntime設定としてsourceを追加・削除しました。
再起動後も残したい場合は、`--permanent`を使います。
追加する例:
firewall-cmd --permanent --zone=drop --add-source=172.16.82.96
firewall-cmd --reload
削除する例:
firewall-cmd --permanent --zone=drop --remove-source=172.16.82.96
firewall-cmd --reload
【注意】
`--permanent` と `firewall-cmd --reload` は影響が大きい操作です。
reload後に通信状態が変わる可能性があります。
不安な場合は、検証環境で確認してから本番環境へ反映してください。
親記事への内部リンク
firewalldの初期設定や、SSH接続中にfirewalldを起動する前の注意点は、以下の記事で詳しく解説しています。
firewalld初期設定と起動前の注意事項|SSH切断を防ぐ安全な起動手順【RHEL 10.1検証】
この記事では、特定IPアドレスの拒否に絞って説明しました。 trusted暫定起動やzone全体の考え方は、親記事を参照してください。
まとめ
firewalldで特定IPを拒否したい場合は、drop zoneへsource登録する方法があります。
今回の検証では、`172.16.82.96` をdrop zoneへ登録すると、`172.16.82.96` から `172.16.82.53` へのSSH接続がタイムアウトすることを確認しました。
重要なポイントは次のとおりです。
- 自分のSSH接続元IPをdrop zoneへ登録しない
- `--add-source=IP --zone=drop` で特定IPをdrop zoneへ登録できる
- public zone自体を書き換えるわけではない
- 指定したsource IPからの通信だけがdrop zoneで処理される
- 設定は削除して元に戻せる
- `--permanent` と `--reload` は慎重に扱う
画像内に公開したくないIPアドレスやホスト名が写らないよう注意し、まずは検証環境で確認してから本番環境へ反映してください。

コメント