firewalldのrichルールで接続元IPを制限する方法|SSH・HTTPSへの送信元フィルタリングと永続化手順

運営:リナックスマスター.JP(代表 宮崎智広)
HOME > Linux技術 リナックスマスター.JP(Linuxマスター.JP) > Linuxtips > セキュリティ > firewalldのrichルールで接続元IPを制限する方法|SSH・HTTPSへの送信元フィルタリングと永続化手順
「SSHのポートは開放しているのに、特定のIPアドレスからしか接続を受け付けたくない」と思ったことはありませんか。
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ルールのほうが先に評価される


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

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
評価の優先順位 通常の優先度 通常ルールより先に評価
書き方 シンプル 構文の記述が必要
richルールと通常ルールが両方存在する場合、richルールが先に評価されます。
たとえば、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'

richルールは引用符の中に書く1つの文字列です。主な要素は次のとおりです。

・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:

services 行に ssh が含まれていれば、現時点では全IPからSSHポートへの接続が許可されています。
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

この2つのコマンドを実行した状態で、203.0.113.10 以外のIPから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

--reload のあとに --list-all を実行して、rich rules 行に追加したルールが表示されていれば設定が反映されています。

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

カスタムポートも同様に port="8443" のように番号を変えるだけで対応できます。
管理用のポートや内部向け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

サブネット(CIDR表記)で指定すると、そのネットワーク内のすべてのアドレスを一括で許可できます。
社内の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

削除後は --list-rich-rules で該当ルールが消えていることを確認します。

自分がロックアウトされないための作業順序

サーバーのファイアウォール設定でよく起きるのが、設定操作中に自分がアクセスできなくなるロックアウトです。
次の順序で作業すると、ロックアウトのリスクを低く抑えられます。

1. 現在の自分の接続元IPを確認する

作業を始める前に、自分のPCのグローバルIPアドレスを確認します。
サーバー側で次のコマンドを実行すると、現在SSHでつながっているセッションの接続元IPが確認できます。

# 現在のSSH接続の接続元IPを確認する who

出力例(環境により異なります):

user01 pts/0 2026-11-12 09:30 (203.0.113.10)

括弧の中にある 203.0.113.10 が自分の接続元IPです。
このIPを richルールで許可してから、SSHのデフォルト許可を削除します。

2. --timeoutで一時適用し、別ターミナルで動作を確認する

前の節で説明した --timeout を使ったテスト手順を必ず実施します。
許可IPから正常に接続できること、許可外のIPからは接続が拒否されることを確認してから永続設定に書き込みます。

サーバーのポート状態を確認するときは、Linux ポート確認の全コマンドも参考にしてください。

ロックアウトしてしまった場合の対処

設定ミスでSSHに接続できなくなった場合は、コンソール接続(VPSの管理画面など)からサーバーにアクセスし、次のコマンドでSSHのデフォルト許可を戻します。

# SSHのデフォルト許可を戻す(コンソール接続から実行) firewall-cmd --add-service=ssh

これで接続できるようになったら、richルールの設定を見直します。

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
richルールは、ポートを全体に開けるだけでは実現できない「接続元を絞った許可」ができます。
SSH以外にも、管理画面へのHTTPS(443/tcp)やカスタムポートへのアクセス制限に応用できます。
まずは --timeout を使ってテストする習慣をつけておくと、設定ミスでの締め出しを防げます。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、
>>【初心者向けLinuxセミナー(2日間ハンズオン)】

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録

運営

リナックスマスター.JP(代表 宮崎智広)

株式会社イーネットマーキュリーが運営するLinux教育サイトです。代表の宮崎智広は現役のLinuxサーバー管理者として20年以上の実務経験を持ち、累計3,100名以上のエンジニアを指導してきました。実践型のLinuxセミナーや無料マニュアルの配布を通じてLinux人材の育成に取り組んでいます。