firewalld – RHEL系Linuxファイアウォールの設定・ポート許可・ゾーン・永続化コマンド一覧

コマンドリファレンス

firewalld は、Red Hat Enterprise Linux(RHEL)、AlmaLinux、Rocky Linux、CentOS、Fedora などの RHEL 系 Linux ディストリビューションに標準搭載されている動的ファイアウォール管理サービスです。
従来の iptables のように設定変更時にすべてのルールを再読み込み・再構築する必要がなく、サービスを止めることなく安全に通信制御ルールを追加・削除できます。
本記事では firewalld の基本概念(ゾーンと永続化ルール)から、操作コマンドである firewall-cmd の使い方、ポート許可・サービス追加、設定の即時反映と永続化(--reload / --permanent)、SSH で締め出されないための注意点まで分かりやすく解説します。

  1. 結論:RHEL系Linuxでfirewalldを安全に設定する最短手順
  2. firewalldの基本概念:ゾーンと永続化(Runtime / Permanent)
    1. 1. ゾーン(Zone)とは
    2. 2. 即時反映(Runtime)と永続化(Permanent)の違い
  3. 構文(Syntax)
  4. インストール状況と動作確認
  5. 主なコマンド一覧
  6. 主なオプション一覧
  7. firewalldの初期セットアップ手順
    1. 1. 有効なゾーンと現在の設定を確認する
    2. 2. SSHサービスを許可する(必須)
    3. 3. Webサーバーなどの公開ポート・サービスを追加する
    4. 4. 設定をリロードして反映する
    5. 5. 最終的な設定一覧を確認する
  8. 実行例
    1. 特定ポートおよびポート範囲を許可・削除する
    2. 特定IPアドレスからの接続のみ許可する(Rich Rules)
    3. ポート転送(Port Forwarding / NAT)を設定する
    4. 一時的にテスト許可する(–timeout オプション)
    5. エラー例:一般ユーザーで実行した場合
  9. 初心者が陥りやすい落とし穴とトラブル対処法
    1. 1. –permanent を指定したのに設定が反映されない
    2. 2. –permanent を忘れていて再起動後に通信不能になった
    3. 3. アプリケーションは起動しているのに外部から接続できない
    4. 4. 緊急時の全通信遮断(パニックモード)
  10. よくある質問(FAQ)
    1. firewalldとufw、iptablesの違いは何ですか?
    2. デフォルトゾーンを変更するにはどうすればいいですか?
    3. 設定変更したのに通信が許可されません
    4. 誤ってSSH接続を遮断してリモート操作できなくなりました
  11. 関連コマンド・記事
  12. 備考
  13. 参考
  14. 関連記事

結論:RHEL系Linuxでfirewalldを安全に設定する最短手順

firewalld を有効化する際、SSH ポート(22番)の許可を行わずに有効化すると、リモートサーバーで接続が切断されて操作不能になる危険があります。必ず SSH 通信を許可してから設定を有効化・反映させてください。

# 1. firewalld サービスの起動と自動起動の有効化
sudo systemctl start firewalld
sudo systemctl enable firewalld

# 2. SSHの通信を永続ルールとして許可(※変更ポート使用時は22/tcpの代わりにポート番号を指定)
sudo firewall-cmd --add-service=ssh --permanent

# 3. Webサーバー用のポート(HTTP / HTTPS)を許可
sudo firewall-cmd --add-service=http --permanent
sudo firewall-cmd --add-service=https --permanent

# 4. 永続化(--permanent)した設定を即座に現在実行中の設定へ反映
sudo firewall-cmd --reload

# 5. 現在のゾーンおよび許可設定の一覧を確認
sudo firewall-cmd --list-all

SSH のポート番号をデフォルトの 22 番から変更している場合は --add-service=ssh ではなく --add-port=2222/tcp のように実際のポート番号を指定してください(詳細はSSH ポートの変更方法を参照)。

firewalldの基本概念:ゾーンと永続化(Runtime / Permanent)

firewalld を扱う上で最も重要となるのが「ゾーン(Zone)」と「即時反映(Runtime)と永続化(Permanent)の違い」です。

1. ゾーン(Zone)とは

ゾーンとは、ネットワークインターフェースや接続環境ごとにセキュリティレベルをグループ化した単位です。標準で以下のようなゾーンがあらかじめ定義されています。

ゾーン名信頼度説明・用途
public低(標準)パブリックな環境用。明示的に許可した通信以外はすべて拒否。VPSなどの既定ゾーン
externalルーターやNAT境界用。マスカレード(IP偽装/NAT)が有効化されたゾーン
internal社内LANやプライベートネットワーク用。比較的信頼できる環境向け
trusted高(最高)すべてのネットワーク通信を無条件で許可するゾーン
dropなし受信パケットを応答なしで黙って破棄(DROP)するゾーン
blockなし受信パケットを拒否応答(ICMP host-prohibitedなど)を返して拒否するゾーン

特に指定しない場合、設定コマンドはデフォルトゾーン(通常は public)に対して適用されます。

2. 即時反映(Runtime)と永続化(Permanent)の違い

firewalld には2つの状態管理モードが存在します。ここを誤解すると「設定したのに有効にならない」「サーバー再起動後に設定が消えた」というトラブルの原因になります。

  • 即時設定(Runtimeモード): --permanent を付けずに実行した場合。メモリ上の現在稼働中の設定に即時反映されますが、サービスの再起動(systemctl restart firewalld)やリロード(firewall-cmd --reload)を行うと消失します。テストに便利です。
  • 永続設定(Permanentモード): --permanent オプションを付けて実行した場合。設定ファイル(/etc/firewalld/zones/)に保存されます。ただし、実行した瞬間は現在稼働中の設定には反映されません。反映させるには必ず sudo firewall-cmd --reload の実行が必要です。

構文(Syntax)

firewall-cmd [OPTIONS...] COMMAND

# 基本的なポート許可コマンド(永続化指定)
sudo firewall-cmd [--zone=ZONE] --add-port=PORT/PROTOCOL --permanent

# 基本的なサービス許可コマンド(永続化指定)
sudo firewall-cmd [--zone=ZONE] --add-service=SERVICE --permanent

# 永続設定の反映
sudo firewall-cmd --reload
  • 設定変更や状態取得を行う管理コマンドは firewall-cmd を使用します。
  • ルール変更操作には root 権限sudo)が必要です。
  • --zone オプションを省略した場合は、デフォルトゾーン(通常 public)が自動選択されます。

インストール状況と動作確認

RHEL / AlmaLinux / Rocky Linux / CentOS では標準で導入されています。最小構成(Minimal Install)環境などで未導入の場合の確認と起動手順は次の通りです。

# インストール状態確認(RHEL系)
rpm -q firewalld

# 未導入の場合のインストールコマンド
sudo dnf install firewalld

# systemd サービス状態確認
sudo systemctl status firewalld

# 動作状態の確認(running と出れば正常稼働)
sudo firewall-cmd --state

出力例(firewall-cmd --state):

running

主なコマンド一覧

コマンド説明使用例
--statefirewalldが動いているか確認(running / not running)sudo firewall-cmd --state
--list-allデフォルトゾーンの全許可設定(ポート/サービス等)を表示sudo firewall-cmd --list-all
--get-active-zonesインターフェースが割り当てられている有効なゾーン一覧を表示sudo firewall-cmd --get-active-zones
--get-zones利用可能なすべてのゾーン一覧を表示sudo firewall-cmd --get-zones
--get-services定義済みの全サービス一覧を表示sudo firewall-cmd --get-services
--add-service=SERVICE指定したサービス(http, sshなど)の通信を許可sudo firewall-cmd --add-service=http --permanent
--remove-service=SERVICE指定したサービスの許可を削除sudo firewall-cmd --remove-service=http --permanent
--add-port=PORT/PROTO指定したポート(例: 8080/tcp)の通信を許可sudo firewall-cmd --add-port=8080/tcp --permanent
--remove-port=PORT/PROTO指定したポートの許可を削除sudo firewall-cmd --remove-port=8080/tcp --permanent
--reload永続化設定(--permanent)を現在稼働中の設定に即時反映sudo firewall-cmd --reload
--panic-onすべてのネットワーク通信を非常緊急遮断(パニックモード有効化)sudo firewall-cmd --panic-on
--panic-off緊急遮断(パニックモード)を解除して通常運用に戻すsudo firewall-cmd --panic-off

主なオプション一覧

オプション説明
--permanent設定を永続化(/etc/firewalld/zones/に保存)。反映には --reload が必要
--zone=ZONE対象のゾーンを明示的に指定(省略時はデフォルトゾーン)
--timeout=TIME指定した時間(例: 5m は5分)だけ一時的にルールを適用する(テストに最適)
-h, --helpヘルプを表示

firewalldの初期セットアップ手順

AlmaLinux や Rocky Linux などの新規サーバー構築時に、安全に firewalld をセットアップする実務手順です。

1. 有効なゾーンと現在の設定を確認する

説明: どのインターフェース(eth0等)がどのゾーンに所属しているかを確認します。
コマンド:

sudo firewall-cmd --get-active-zones

出力例:

public
  interfaces: eth0

2. SSHサービスを許可する(必須)

説明: firewalld 起動時にSSHポートが開いていないとリモート接続不能になります。
コマンド:

# デフォルトの22番ポートを使用している場合
sudo firewall-cmd --add-service=ssh --permanent

# 2222番などに変更している場合
sudo firewall-cmd --add-port=2222/tcp --permanent

3. Webサーバーなどの公開ポート・サービスを追加する

説明: HTTP(80)、HTTPS(443)などの必要なサービスを追加します。
コマンド:

sudo firewall-cmd --add-service=http --permanent
sudo firewall-cmd --add-service=https --permanent

4. 設定をリロードして反映する

説明: --permanent で追加したルールを現在稼働中の設定に反映させます。
コマンド:

sudo firewall-cmd --reload

出力例:

success

5. 最終的な設定一覧を確認する

説明: 意図したサービスやポートが services:ports: に表示されているか確認します。
コマンド:

sudo firewall-cmd --list-all

出力例:

public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources: 
  services: cockpit dhcpv6-client http https ssh
  ports: 
  protocols: 
  forward: yes
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

実行例

特定ポートおよびポート範囲を許可・削除する

説明: Webアプリケーションのテスト用ポート(8080/tcp)や、開発用の複数ポート範囲(6000〜6100/tcp)を開く手順です。
コマンド:

# 8080番ポート(TCP)を許可
sudo firewall-cmd --add-port=8080/tcp --permanent

# 6000から6100番までの範囲ポートを許可
sudo firewall-cmd --add-port=6000-6100/tcp --permanent

# 設定の反映
sudo firewall-cmd --reload

# 不要になった8080番ポートの許可を削除
sudo firewall-cmd --remove-port=8080/tcp --permanent
sudo firewall-cmd --reload

特定IPアドレスからの接続のみ許可する(Rich Rules)

説明: 全世界からの SSH 接続を受け付けず、自社の固定 IP アドレス(例: 203.0.113.100)からのみ許可したい場合は「リッチルール(Rich Rules)」を使用します。
コマンド:

# 特定IPからのSSH(22/tcp)接続のみ許可
sudo firewall-cmd --add-rich-rule="rule family="ipv4" source address="203.0.113.100" service name="ssh" accept" --permanent

# 設定反映
sudo firewall-cmd --reload

# 登録済みリッチルール一覧の確認
sudo firewall-cmd --list-rich-rules

出力例(--list-rich-rules):

rule family="ipv4" source address="203.0.113.100" service name="ssh" accept

ポート転送(Port Forwarding / NAT)を設定する

説明: 外部からの 80 番ポートへのアクセスを、内部で動作する 8080 番ポートへ転送する設定例です。転送機能にはマスカレード(--add-masquerade)の有効化が必要です。
コマンド:

# 1. マスカレードを有効化
sudo firewall-cmd --add-masquerade --permanent

# 2. 80番ポート宛のTCPアクセスを8080番へ転送する設定を追加
sudo firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080 --permanent

# 3. リロードして反映
sudo firewall-cmd --reload

一時的にテスト許可する(–timeout オプション)

説明: 「5分間だけテストでポートを開けたい」「設定ミスでロックアウトされるのが怖いので自動的に元に戻ってほしい」という場合に便利です。--permanent とは併用できません。
コマンド:

# 5分間(5m)だけ 8080/tcp ポートを許可する
sudo firewall-cmd --add-port=8080/tcp --timeout=5m

エラー例:一般ユーザーで実行した場合

説明: sudo 権限がない一般ユーザーで firewall-cmd を実行した場合の表示です。
コマンド:

firewall-cmd --list-all

出力例:

Authorization failed.
    These authorization options exist:

対処: コマンドの前に sudo を付けて実行してください。

初心者が陥りやすい落とし穴とトラブル対処法

1. –permanent を指定したのに設定が反映されない

--permanent を付けて追加した設定は、設定ファイルに書き込まれますが、実行中(Runtime)のメモリルールには自動反映されません
必ず sudo firewall-cmd --reload を実行してリロードを行ってください。

2. –permanent を忘れていて再起動後に通信不能になった

--permanent なしで実行したコマンドは、その場限りの一次テスト設定です。サーバー再起動や firewalld サービスの再起動で消去されます。本番環境で恒久的に開けたいポートやサービスは、必ず --permanent を付けて設定し直し、--reload してください。

確認方法: sudo firewall-cmd --list-all --permanent で永続設定ファイルの中身を直接確認できます。

3. アプリケーションは起動しているのに外部から接続できない

WebサーバーやDBサーバーが LISTEN 状態(ポートが開いている)であっても、firewalld でブロックされているケースが多発します。

  • まずサーバー内部で ss -tulpn または lsof -i :ポート番号 を実行し、該当プロセスが指定ポートで待ち受けているか確認します(詳細はLinuxのポート確認手順を参照)。
  • 待ち受けている場合は、sudo firewall-cmd --list-all を実行して ports:services: に該当の記述があるかチェックします。
  • クラウドアセット(AWS EC2 / さくらのVPS / ConoHa VPS など)を利用している場合は、firewalld とは別にクラウド側のセキュリティグループ(パケットフィルター)で拒否されていないかも必ず確認してください。

4. 緊急時の全通信遮断(パニックモード)

万が一、外部からの不正アクセスやDDoS攻撃を検知し、一時的にサーバーのすべてのネットワーク通信を緊急遮断したい場合は「パニックモード」を使用します。

# パニックモード有効化(SSHを含むすべての通信が切断されます)
sudo firewall-cmd --panic-on

# パニックモード状態確認
sudo firewall-cmd --query-panic

# パニックモード解除
sudo firewall-cmd --panic-off

よくある質問(FAQ)

firewalldとufw、iptablesの違いは何ですか?

iptables は Linux カーネルのパケットフィルタリング(netfilter)を低レベルで直接操作する基礎コマンドです。ufw は Ubuntu / Debian 系で採用されているシンプルな管理フロントエンドです。一方、firewalld は RHEL / AlmaLinux / Rocky Linux / CentOS 系の標準管理ツールであり、「ゾーン管理」と「サービスの無停止動的更新」に対応している点が大きな特徴です。

デフォルトゾーンを変更するにはどうすればいいですか?

sudo firewall-cmd --set-default-zone=ゾーン名 で変更できます。例えば内部専用サーバーなどでデフォルトゾーンを internal に切り替えたい場合に利用します。

設定変更したのに通信が許可されません

--permanent を付与して設定した場合は sudo firewall-cmd --reload の実行漏れがないか確認してください。また、正しいゾーン(アクティブなゾーン)に対してポート追加を行っているかも sudo firewall-cmd --get-active-zones で確認しましょう。

誤ってSSH接続を遮断してリモート操作できなくなりました

SSH ポートが拒否された状態ではネットワーク経由でログインできません。VPS 事業者(さくらのVPS、ConoHa、AWSなど)が提供する「シリアルコンソール」「VNCコンソール」「WEBコンソール」からログインし、sudo firewall-cmd --add-service=ssh --permanent および sudo firewall-cmd --reload(または一時的に sudo systemctl stop firewalld)を実行して復旧してください。

関連コマンド・記事

備考

  • firewalld はバックエンドとして nftables(従来のシステムでは iptables)を利用してフィルタリングを行っています。
  • firewalld サービス動作品に直接 iptables コマンドでルールを追加すると、firewalld のリロード時に上書きされる可能性があります。設定操作は firewall-cmd に統一してください。
  • Docker サービスと併用する場合、Docker が独自の iptables ルールを挿入するため、firewalld のゾーン設定をバイパスしてコンテナポートが外部公開される挙動に注意が必要です。

参考

Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする

コメント