「RHEL/AlmaLinux系のファイアウォール設定をどう確認・変更すればいいのか分からない」
RHEL 9.4 / AlmaLinux 9.4 / Rocky Linux 9.4 で動作確認済みの解説です。
この記事では、
firewall-cmd コマンドの基本的な使い方から、ポート開放・サービス許可・ゾーンの切り替え・永続化(--permanent)のルール、そして「設定したのにアクセスできない」時のトラブルシュートまで、現場で使える手順をまとめて解説します。この記事のポイント
・firewall-cmd --list-all で現在のゾーン設定を一括確認できる
・ポート開放は --add-port=8080/tcp --permanent で永続化する
・--permanent を付けた変更は --reload で反映する
・ゾーンの概念を理解すれば複数NICのサーバーも安全に扱える
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
firewall-cmdとは?(firewalldの操作コマンド)
firewall-cmd は、RHEL 7以降(CentOS/AlmaLinux/Rocky Linux含む)で標準搭載されているファイアウォール管理サービス firewalld を操作するためのコマンドです。従来の
iptables とは異なり、ゾーン(zone)という単位でセキュリティポリシーを管理し、サービスの再起動なしにルールを動的に変更できるのが特徴です。内部的には
nftables(RHEL 8以降)をバックエンドとして利用していますが、運用者が意識する必要はほとんどありません。firewall-cmd を正しく使えば、iptables や nftables の構文を直接触らなくても、実務で必要な設定はすべてカバーできます。firewalldの起動確認とゾーンの基本
1. firewalldが起動しているか確認する
まずはfirewalld サービスが稼働しているかを確認します。# firewalldの稼働状態を確認する # systemctl status firewalld * firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; preset: enabled) Active: active (running) since Tue 2026-04-14 09:12:03 JST; 2 days ago # firewall-cmd自体でも状態確認できる # firewall-cmd --state running
active (running) と表示されれば正常稼働中です。停止している場合は systemctl start firewalld で起動してください。2. 現在のデフォルトゾーンを確認する
firewalldは「ゾーン」という単位でルールを管理します。ネットワークインターフェースごとにゾーンを割り当てることで、複数のNICを持つサーバーでも柔軟にセキュリティポリシーを適用できます。# デフォルトゾーンを確認する # firewall-cmd --get-default-zone public # 利用可能なすべてのゾーンを一覧表示する # firewall-cmd --get-zones block dmz drop external home internal nm-shared public trusted work # アクティブ(NICが割り当てられている)ゾーンを確認する # firewall-cmd --get-active-zones public interfaces: ens192
public ゾーンがデフォルトになっています。3. 現在のゾーン設定を一括確認する(最頻出)
実務で最も使うのが--list-all です。許可されているポート・サービス・送信元・インターフェースなどが一画面で確認できます。# デフォルトゾーンの設定を一括確認する # firewall-cmd --list-all public (active) target: default icmp-block-inversion: no interfaces: ens192 sources: services: cockpit dhcpv6-client ssh ports: 8080/tcp protocols: forward: yes masquerade: no forward-ports: source-ports: rich rules:
ポートを開放・削除する(--add-port / --remove-port)
4. 一時的にポートを開放する
まずは一時的な開放から見ていきます。--permanent を付けないコマンドは、サーバー再起動または firewalld 再起動で消える設定です。# 8080/tcp を一時的に開放する(現在のセッションのみ有効) # firewall-cmd --add-port=8080/tcp success # 許可されているポートを確認する # firewall-cmd --list-ports 8080/tcp
--permanent で永続化する流れが安全です。5. ポートを永続的に開放する(--permanent)
再起動後も設定を残すには--permanent オプションを付けます。ただし、--permanent を付けたコマンドは 即時には反映されません。設定ファイルへの書き込みのみが行われ、反映には --reload が必要です。# 8080/tcp を永続的に開放する(設定ファイルへ書き込み) # firewall-cmd --permanent --add-port=8080/tcp success # 設定を反映する(リロード) # firewall-cmd --reload success # 永続設定のポート一覧を確認する # firewall-cmd --permanent --list-ports 8080/tcp
--add-port で開けても、--permanent を付けなければ再起動で消えます。逆に --permanent --add-port だけだと、--reload するまで現在のセッションには反映されません。この挙動を理解していないと「追加したのに効いていない/再起動したら消えた」の事故が起きます。6. 永続設定と一時設定を同時に反映する定石
現場では「今すぐ反映したい+再起動後も残したい」が大半です。その場合は以下のように2回叩くか、--runtime-to-permanent を使います。# パターンA:2回叩く(確実) # firewall-cmd --add-port=8080/tcp # firewall-cmd --permanent --add-port=8080/tcp # パターンB:現在の一時設定を永続化する(推奨) # firewall-cmd --add-port=8080/tcp # firewall-cmd --runtime-to-permanent
--runtime-to-permanent は「今動いている設定をそのまま永続設定にコピーする」オプションです。複数のルールを一時的に試してから一括で永続化したい時に便利です。7. ポートを削除する
不要になったポートは必ず閉じます。「開いたまま」は最大のセキュリティリスクです。# 8080/tcp を永続設定から削除する # firewall-cmd --permanent --remove-port=8080/tcp success # 反映する # firewall-cmd --reload success
サービス単位で許可する(--add-service)
8. 事前定義されたサービスの一覧を確認する
firewalldには、主要なプロトコルのポート番号が「サービス」として事前定義されています。http、https、ssh、mysql などを名前で指定できるため、ポート番号を覚えていなくても直感的に操作できます。# 事前定義されているサービス一覧を表示する # firewall-cmd --get-services RH-Satellite-6 amanda-client bacula bacula-client ceph ceph-mon cockpit ...(省略)... http https ssh mysql postgresql samba smtp ... # サービスの中身(使うポート)を確認する # firewall-cmd --info-service=http http ports: 80/tcp protocols: source-ports: modules: destination:
9. サービスを永続的に許可する
たとえばWebサーバー(HTTP/HTTPS)を公開する場合、ポート番号ではなくサービス名で指定するのが推奨です。# httpとhttpsを永続的に許可する # firewall-cmd --permanent --add-service=http success # firewall-cmd --permanent --add-service=https success # 反映する # firewall-cmd --reload success # 現在許可されているサービスを確認する # firewall-cmd --list-services cockpit dhcpv6-client http https ssh
特定のIPアドレスからのみ許可する(rich rule)
10. 送信元IPを絞ってアクセス許可する
「社内ネットワークからのSSHだけを許可したい」といった要件には、rich rule(リッチルール)を使います。# 192.0.2.0/24 からのSSHだけを永続許可する # firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.0.2.0/24" service name="ssh" accept' success # 反映する # firewall-cmd --reload success # リッチルールを確認する # firewall-cmd --list-rich-rules rule family="ipv4" source address="192.0.2.0/24" service name="ssh" accept
【重要】SSH経由での作業時の注意
リモートからSSHで作業している時に、誤って自分自身のアクセス元を遮断すると接続が切れて復旧できなくなります。特に
--remove-service=ssh や、送信元を限定するrich rule追加時は、コンソールアクセスの手段(クラウドならシリアルコンソール)を確保してから実行するのが鉄則です。本番環境では必ず検証機で手順を確認してから本番に適用してください。ゾーンを切り替える(複数NIC環境の実務)
11. インターフェースのゾーンを変更する
複数のNICを持つサーバー(外部向け・内部向けを分離したケース)では、NICごとに異なるゾーンを割り当てます。# ens224 を internal ゾーンに割り当てる(永続) # firewall-cmd --permanent --zone=internal --change-interface=ens224 The interface is under control of NetworkManager, setting zone to 'internal'. success # 反映する # firewall-cmd --reload success # 現在のアクティブゾーンを確認する # firewall-cmd --get-active-zones internal interfaces: ens224 public interfaces: ens192
public ゾーンは厳しめ(基本拒否・明示許可のみ)、internal ゾーンは緩め(社内信頼前提)のデフォルトルールが用意されているため、用途に応じて使い分けてください。「設定したのにアクセスできない」時のトラブルシュート
12. firewalldではなく別の要因を疑う場合
firewall-cmdで許可したはずなのに外部から接続できない時、問題はfirewallだけとは限りません。以下の4層を順に確認してください。・アプリ自体が起動しているか:
systemctl status httpd 等でサービスの稼働を確認・LISTENしているIPが正しいか:
ss -tlnp で 0.0.0.0 や :: にバインドされているかを確認(127.0.0.1 のみなら外部接続不可)・firewalldが許可しているか:
firewall-cmd --list-all で該当ポート・サービスの許可を確認・SELinuxでブロックされていないか:
getenforce が Enforcing なら sealert -a /var/log/audit/audit.log で拒否ログを確認13. --permanent を付け忘れて設定が消えた場合
「昨日まで動いていたのに、サーバー再起動後にアクセスできなくなった」という時は、--permanent を付けずに一時設定のまま運用していた可能性が高いです。# 永続設定の内容を確認する # firewall-cmd --permanent --list-all public target: default services: cockpit dhcpv6-client ssh ports: # 現在の一時設定を確認する(差分があれば永続化漏れ) # firewall-cmd --list-all public (active) services: cockpit dhcpv6-client http https ssh ports: 8080/tcp
--permanent --list-all と --list-all に差分があれば、その差分が「永続化されていない設定」です。--runtime-to-permanent で一括保存するか、必要なものだけ個別に --permanent --add-xxx を再実行してください。14. 「ZONE_ALREADY_SET」エラーが出る時
--change-interface で既に割り当て済みのゾーンに再度割り当てようとすると ZONE_ALREADY_SET が出ます。これは異常ではないので、現状を --get-active-zones で確認してから判断してください。firewalldとiptablesの使い分け
RHEL系の現行バージョン(RHEL 7以降)では、firewalldが標準です。iptables を直接触る運用は、firewalldと競合するため推奨されません。・firewalld推奨の場面:RHEL 7以降のサーバー運用全般、ゾーンでNICを分けたい、動的にルールを変えたい
・iptables直接を検討する場面:古いCentOS 6環境、firewalldを停止して明示的にiptables-servicesに切り替える運用(特殊ケース)
なお、Ubuntu/Debian系では標準が
ufw や nftables になるため、ディストリビューションに合わせてツールを選んでください。本記事のまとめ(firewall-cmdコマンド早見表)
| やりたいこと | コマンド |
|---|---|
| firewalldの稼働状態を確認する | firewall-cmd --state |
| 現在のゾーン設定を一括確認する | firewall-cmd --list-all |
| デフォルトゾーンを確認する | firewall-cmd --get-default-zone |
| アクティブなゾーンを確認する | firewall-cmd --get-active-zones |
| ポートを永続的に開放する | firewall-cmd --permanent --add-port=8080/tcp |
| ポートを永続的に閉じる | firewall-cmd --permanent --remove-port=8080/tcp |
| サービスを永続的に許可する | firewall-cmd --permanent --add-service=http |
| サービスを永続的に削除する | firewall-cmd --permanent --remove-service=http |
| 送信元IPを絞って許可する | firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.0.2.0/24" service name="ssh" accept' |
| 一時設定を永続設定に保存する | firewall-cmd --runtime-to-permanent |
| 設定を反映する(リロード) | firewall-cmd --reload |
| NICのゾーンを変更する | firewall-cmd --permanent --zone=internal --change-interface=ens224 |
firewall-cmdの「--permanent」、付け忘れていませんか?
ファイアウォール設定の「一時/永続」の取り違えは、サーバー再起動後に「アクセスできない」「ポートが勝手に閉じた」と慌てる典型的な事故です。現場では、こうした小さな取り違え一つがサービス停止に直結します。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら

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