firewall-cmdでポートを開放する方法は知っていても、接続元を絞る設定が分からないと、すべてのIPからアクセスを受け付けたままになります。
この記事では、RHEL 9系(Rocky Linux 9・AlmaLinux 9含む)を想定環境として、firewalldのrichルール(--add-rich-rule)を使った接続元IP制限の設定方法を解説します。SSHポートへの適用例から、HTTPSへの応用、複数IPの許可設定、設定ミスでロックアウトされないための作業順序まで、実務で使える形で説明します。
この記事のポイント
・ richルールは「接続元IP+ポート」を組み合わせた高度なアクセス制御ができる
・ firewall-cmd --add-rich-rule でルールを追加し、--permanent で永続化する
・ --timeout を使ったテスト実行で設定ミスによるロックアウトを防げる
・ 通常の --add-service 許可ルールより richルールのほうが先に評価される
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
richルールと通常ルールの違い
firewalldの通常のルール(--add-service や --add-port)は、「このポートへのアクセスをすべて許可する」という設定です。接続元のIPアドレスに関係なく、ポートが開いていれば誰でも接続できます。
richルールは、これに加えて「接続元のIPアドレス」「プロトコル」「ポート」「アクション」を組み合わせた条件を書けます。
「SSHポート(22/tcp)は203.0.113.10からだけ許可し、それ以外はrejectする」という設定が1本のrichルールで実現できます。
richルールと通常ルールの主な違いは次のとおりです。
| 項目 | 通常ルール(--add-service等) | richルール(--add-rich-rule) |
|---|---|---|
| 接続元IP指定 | できない | できる(source address=) |
| アクション | 許可のみ | accept / reject / drop / log |
| 評価の優先順位 | 通常の優先度 | 通常ルールより先に評価 |
| 書き方 | シンプル | 構文の記述が必要 |
たとえば、SSHのデフォルト許可(--add-service=ssh)と、特定IPだけを許可するrichルールを両方設定すると、デフォルト許可が残っている限り全IPからの接続が許可されたままになります。
接続元IP制限を有効にするには、richルールの追加後にSSHのデフォルト許可を削除する必要があります。
richルールの基本構文と書き方
richルールを追加するコマンドの基本形は次のとおりです。# richルールを追加する基本形 firewall-cmd --add-rich-rule='rule family="ipv4" source address="IPアドレス" port port="ポート番号" protocol="tcp" accept'
・family="ipv4":IPv4ルールであることを指定します。IPv6の場合は ipv6 と書きます
・source address="...":接続元のIPアドレスまたはCIDRブロック(例:203.0.113.0/24)を指定します
・port port="..." protocol="...":ポート番号とプロトコル(tcp または udp)を指定します
・accept:一致した通信を許可します
アクションの種類(accept・reject・drop)
richルールで指定できるアクションは次の3種類です。・accept:通信を許可します
・reject:通信を拒否し、接続元に「拒否した」というエラーを返します
・drop:通信を拒否し、接続元には何も応答しません(タイムアウト待ちになります)
管理目的の接続元IP制限では、rejectを使うとすぐにエラーが分かるため確認しやすくなります。
外部からの不正なアクセスを防ぐ目的であればdropにして応答を返さない設定にする場合もあります。
SSHへの接続元IP制限を設定する手順
ここでは、SSHポート(22/tcp)への接続を特定のIPアドレスだけに制限する設定を行います。作業は一時適用でテストしてから問題がなければ永続化する、という順序で進めます。
1. 現在のfirewalldの状態を確認する
まず、現在のルールとSSHの許可状態を確認します。firewall-cmd --list-all
public (active) target: default interfaces: eth0 services: cockpit dhcpv6-client ssh ports: rich rules:
rich rules 行が空であれば、まだrichルールは設定されていません。
2. --timeoutを使って一時適用でテストする
設定ミスで自分がSSH接続できなくなるのを防ぐため、まずは --timeout オプションを使って一時的にルールを追加します。--timeout に秒数を指定すると、指定した秒数が経過したあとにルールが自動で削除されます。
# SSHへの接続を 203.0.113.10 だけに許可(120秒の一時適用) firewall-cmd --add-rich-rule='rule family="ipv4" source address="203.0.113.10" port port="22" protocol="tcp" accept' --timeout=120 # SSHのデフォルト許可(全IP)を一時的に削除 firewall-cmd --remove-service=ssh
120秒後には richルールが自動削除されます。
テストに問題がなければ次の永続設定の手順に進みます。
テスト中に問題があれば、次のコマンドでSSHのデフォルト許可を戻します。
# SSHのデフォルト許可を戻す firewall-cmd --add-service=ssh
3. 永続設定に書き込む
テストに問題がなければ、永続設定として書き込みます。# richルールを永続設定に追加 firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.10" port port="22" protocol="tcp" accept' # SSHのデフォルト許可を永続設定から削除 firewall-cmd --permanent --remove-service=ssh # 設定を反映する firewall-cmd --reload
HTTPSポート(443/tcp)への接続元IP制限
richルールはSSH以外のポートにも同様に使えます。たとえば、管理画面へのHTTPS(443/tcp)を特定のIPアドレスからだけ許可する場合は次のようにします。
# 443/tcpへのアクセスを特定IPだけに許可 firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.10" port port="443" protocol="tcp" accept' # httpsのデフォルト許可を削除 firewall-cmd --permanent --remove-service=https firewall-cmd --reload
管理用のポートや内部向けAPIのポートを特定の接続元に限定したい場合に活用してください。
許可IPを複数設定する方法
接続を許可するIPが複数ある場合は、richルールをIPごとに追加します。1つのrichルールで複数のIPをまとめて指定する構文はないため、IPの数だけコマンドを実行します。
# 2つ目のIPを追加する firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="198.51.100.20" port port="22" protocol="tcp" accept' # サブネット全体を許可する場合(/24) firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.0.2.0/24" port port="22" protocol="tcp" accept' firewall-cmd --reload
社内のVPNアドレス帯やオフィスのグローバルIPレンジを指定するときに使います。
richルールの確認・削除・操作
richルールの一覧を確認する
現在適用されているrichルールは --list-rich-rules で確認できます。# 現在のrichルール一覧 firewall-cmd --list-rich-rules # 永続設定のrichルール一覧 firewall-cmd --permanent --list-rich-rules
rule family="ipv4" source address="203.0.113.10" port port="22" protocol="tcp" accept rule family="ipv4" source address="198.51.100.20" port port="22" protocol="tcp" accept
richルールを削除する
richルールを削除するときは --remove-rich-rule を使い、追加時と同じルール文字列を指定します。# 永続設定からrichルールを削除して反映する firewall-cmd --permanent --remove-rich-rule='rule family="ipv4" source address="203.0.113.10" port port="22" protocol="tcp" accept' firewall-cmd --reload
自分がロックアウトされないための作業順序
サーバーのファイアウォール設定でよく起きるのが、設定操作中に自分がアクセスできなくなるロックアウトです。次の順序で作業すると、ロックアウトのリスクを低く抑えられます。
1. 現在の自分の接続元IPを確認する
作業を始める前に、自分のPCのグローバルIPアドレスを確認します。サーバー側で次のコマンドを実行すると、現在SSHでつながっているセッションの接続元IPが確認できます。
# 現在のSSH接続の接続元IPを確認する who
user01 pts/0 2026-11-12 09:30 (203.0.113.10)
このIPを richルールで許可してから、SSHのデフォルト許可を削除します。
2. --timeoutで一時適用し、別ターミナルで動作を確認する
前の節で説明した --timeout を使ったテスト手順を必ず実施します。許可IPから正常に接続できること、許可外のIPからは接続が拒否されることを確認してから永続設定に書き込みます。
サーバーのポート状態を確認するときは、Linux ポート確認の全コマンドも参考にしてください。
ロックアウトしてしまった場合の対処
設定ミスでSSHに接続できなくなった場合は、コンソール接続(VPSの管理画面など)からサーバーにアクセスし、次のコマンドでSSHのデフォルト許可を戻します。# SSHのデフォルト許可を戻す(コンソール接続から実行) firewall-cmd --add-service=ssh
Linuxサーバーのセキュリティ設定全体を体系的に学びたい方は、【初心者向けLinuxセミナー(2日間ハンズオン)】もご参照ください。
本記事のまとめ
| やりたいこと | コマンド |
|---|---|
| richルールを追加する(一時) | firewall-cmd --add-rich-rule='rule ...' |
| richルールを追加する(永続) | firewall-cmd --permanent --add-rich-rule='rule ...' |
| richルールを一覧表示する | firewall-cmd --list-rich-rules |
| richルールを削除する(永続) | firewall-cmd --permanent --remove-rich-rule='rule ...' |
| 設定を反映する | firewall-cmd --reload |
| 一時適用でテストする | firewall-cmd --add-rich-rule='rule ...' --timeout=120 |
SSH以外にも、管理画面へのHTTPS(443/tcp)やカスタムポートへのアクセス制限に応用できます。
まずは --timeout を使ってテストする習慣をつけておくと、設定ミスでの締め出しを防げます。
>>【初心者向けLinuxセミナー(2日間ハンズオン)】
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら
- 前のページへ:systemd Unitファイルのセキュリティオプションで最小権限のサービスを設計する方法|DynamicUser・ProtectSystem・PrivateTmpの実践パターン
- この記事の属するカテゴリ:セキュリティへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。
登録無料・いつでも解除できます