firewalld は、Red Hat Enterprise Linux(RHEL)、AlmaLinux、Rocky Linux、CentOS、Fedora などの RHEL 系 Linux ディストリビューションに標準搭載されている動的ファイアウォール管理サービスです。
従来の iptables のように設定変更時にすべてのルールを再読み込み・再構築する必要がなく、サービスを止めることなく安全に通信制御ルールを追加・削除できます。
本記事では firewalld の基本概念(ゾーンと永続化ルール)から、操作コマンドである firewall-cmd の使い方、ポート許可・サービス追加、設定の即時反映と永続化(--reload / --permanent)、SSH で締め出されないための注意点まで分かりやすく解説します。
結論: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
主なコマンド一覧
| コマンド | 説明 | 使用例 |
|---|---|---|
--state | firewalldが動いているか確認(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)を実行して復旧してください。
関連コマンド・記事
ufw: Ubuntu 標準のファイアウォール管理ツール。詳細は ufw – Ubuntuファイアウォールの設定コマンド一覧 を参照。iptables: 従来のパケットフィルタリング設定ツール。詳細は iptablesの基礎解説 を参照。SSH ポート変更: デフォルトの22番から変更する場合の手順。詳細は SSHポートの変更方法と接続確認 を参照。ポート確認・競合解消:ss/lsof/netstatでポートのLISTEN状態を調べる手順。詳細は Linuxのポート確認方法とポート競合の解消手順 を参照。systemd: firewalld サービスの起動・自動起動管理。詳細は systemdユニットの基本と設計 を参照。RHCSA / CompTIA Linux+: Linux 資格試験のネットワークセキュリティ学習ガイド。詳細は RHCSA学習計画まとめ を参照。
備考
firewalldはバックエンドとしてnftables(従来のシステムではiptables)を利用してフィルタリングを行っています。firewalldサービス動作品に直接iptablesコマンドでルールを追加すると、firewalldのリロード時に上書きされる可能性があります。設定操作はfirewall-cmdに統一してください。- Docker サービスと併用する場合、Docker が独自の
iptablesルールを挿入するため、firewalldのゾーン設定をバイパスしてコンテナポートが外部公開される挙動に注意が必要です。
参考
- firewalld 公式ドキュメント: https://firewalld.org/
- Red Hat Enterprise Linux 9 ドキュメント(Using firewalld): Red Hat Customer Portal
- man ページ:
man firewall-cmd/man firewalld

コメント