【RHEL】RHEL9のfirewalldについて分かり易く説明

ITナレッジ

今回は、RHEL9環境におけるファイアウォール管理ツールfirewalldの完全設定ガイドをお伝えします。RHEL9では従来のiptablesに代わり、firewalldが標準的なファイアウォール管理ツールとなっています。firewalldは、ポート開放・ゾーン管理・サービス管理などを動的に設定でき、サービス再起動なしで反映できるという大きな利点があります。

多くのインフラエンジニアが直面する「ポート開放の試行錯誤」「複数ホストでのファイアウォール管理の煩雑さ」といった課題を、firewalldで効率的に解決できます。本記事では、基本的なポート開放からゾーン・サービス管理の実践的な運用方法まで、詳しく解説します。


firewalldの基本概念とアーキテクチャ

firewalldは、Linux kernel内のnetfilterを使用したステートフルファイアウォール管理ツールです。従来のiptablesと異なり、設定変更がリアルタイムに反映され、サービス再起動が不要というのが最大の特徴です。

firewalldの主要な概念は以下の通りです:

ゾーン(Zone)
ネットワークの信頼度に応じて分類したグループです。例えば、「public」(信頼できないネットワーク)、「internal」(社内ネットワーク)、「trusted」(完全信頼)などがあります。各ゾーンに異なるルールセットを適用できます。

サービス(Service)
ポート番号・プロトコル・説明などをまとめた定義ファイルです。例えば、SSHサービスは22/tcpに対応します。サービス定義を用いることで、複数ポートの管理が効率化されます。

ルール(Rule)
特定のポート・プロトコル・ソースIPに対する許可・拒否設定です。ルールはゾーン単位で管理されます。

firewalldの動作モデルは以下の通りです:
1. パケット到着時、送信元IPに基づいてゾーンを判定
2. ゾーンに設定されたルールをチェック
3. 許可・拒否を判定


firewalldの起動・停止・状態確認

firewalldの基本操作

bash
# firewalldサービスの起動
sudo systemctl start firewalld

# firewalldサービスの停止
sudo systemctl stop firewalld

# 自動起動の有効化
sudo systemctl enable firewalld

# 現在の状態確認
sudo systemctl status firewalld

# firewalld の動作状態確認(簡潔版)
sudo firewall-cmd --state

設定永続化の確認

firewalldの設定は、デフォルトではランタイム設定(一時的)として扱われます。永続設定にするには、--permanentオプションを付ける必要があります。

bash
# 設定ファイルの所在確認
ls -la /etc/firewalld/

# ゾーン設定の確認
ls -la /etc/firewalld/zones/

実務での注意点として、ランタイム設定とパーマネント設定が異なる場合、サービス再起動で意図しない設定に戻ります。このため、必ずパーマネント設定で更新することを推奨します。


ポート開放の基本方法

単一ポートの開放

最もシンプルなポート開放の例を示します。

bash
# SSH(22/tcp)をpublicゾーンで許可(永続)
sudo firewall-cmd --zone=public --add-port=22/tcp --permanent

# HTTP(80/tcp)とHTTPS(443/tcp)を開放
sudo firewall-cmd --zone=public --add-port=80/tcp --permanent
sudo firewall-cmd --zone=public --add-port=443/tcp --permanent

# ポート範囲の開放(例:8000-8999)
sudo firewall-cmd --zone=public --add-port=8000-8999/tcp --permanent

# 設定をリロード(永続設定をランタイムに反映)
sudo firewall-cmd --reload

複数ポート同時開放

複数ポートを一度に開放する場合は、以下のように記述できます。

bash
# 複数ポートをカンマ区切りで指定
sudo firewall-cmd --zone=public --add-ports=80/tcp,443/tcp,3306/tcp --permanent
sudo firewall-cmd --reload

開放したポートの確認

bash
# 現在開放されているポール一覧
sudo firewall-cmd --zone=public --list-ports

# サービス単位での確認(後述)
sudo firewall-cmd --zone=public --list-services

# すべてのルールを表示
sudo firewall-cmd --zone=public --list-all

実務でのハマりポイントとしては、ポート開放後のリロード忘れがあります。--permanentで設定しても、--reloadを実行しなければランタイムに反映されません。


ゾーン管理の詳細解説

デフォルトゾーンの確認と変更

bash
# デフォルトゾーンを確認
sudo firewall-cmd --get-default-zone

# デフォルトゾーンを変更
sudo firewall-cmd --set-default-zone=internal

利用可能なゾーン一覧

bash
# 利用可能なゾーンを表示
sudo firewall-cmd --get-zones

# 出力例:
# drop internal public work home dmz trusted block

各ゾーンの特性は以下の通りです:

ゾーン名 信頼度 用途 デフォルト動作
trusted 最高 完全に信頼できるネットワーク すべて許可
home 高 自宅・オフィスなど 設定によって異なる
internal 中 社内ネットワーク 設定によって異なる
work 中 職場ネットワーク 設定によって異なる
public 低 インターネット接続 明示的に許可したもののみ
dmz 低 DMS(非武装地帯) 限定的に許可
block 最低 拒否ゾーン すべて拒否
drop 最低 ドロップゾーン すべて無応答

ネットワークインターフェースのゾーン割り当て

bash
# インターフェースとゾーンのマッピング確認
sudo firewall-cmd --get-zone-of-interface=eth0

# インターフェースをゾーンに割り当て
sudo firewall-cmd --zone=internal --add-interface=eth0 --permanent

# インターフェースをゾーンから削除
sudo firewall-cmd --zone=internal --remove-interface=eth0 --permanent

# 設定をリロード
sudo firewall-cmd --reload

実務での応用として、複数のネットワークアダプターがある場合、ネットワークごとに異なるファイアウォール設定を適用できます。例えば、eth0(外部向け)はpublic ゾーン、eth1(内部向け)はinternal ゾーンと割り当てることで、柔軟なセキュリティ設定が実現できます。


サービス管理による定義

サービス定義ファイルの構造

firewalldには、主要なサービス定義が事前登録されています。

bash
# 登録されているサービル一覧を表示
sudo firewall-cmd --get-services

# 出力例(一部):
# RH-Satellite-6 amanda-client amanda-k5-client amqp ...

サービス定義ファイルの確認

bash
# サービス定義ファイルの所在
ls -la /usr/lib/firewalld/services/

# SSH サービスの定義内容を確認
cat /usr/lib/firewalld/services/ssh.xml

# 出力例:
# 
# 
#   SSH
#   SSH is a protocol for logging in and executing commands on remote machines.
#   
# 

サービス単位でのポート許可

bash
# ssh サービスを許可
sudo firewall-cmd --zone=public --add-service=ssh --permanent

# http・https サービスを許可
sudo firewall-cmd --zone=public --add-service=http --permanent
sudo firewall-cmd --zone=public --add-service=https --permanent

# 複数サービスの許可
sudo firewall-cmd --zone=public --add-services=http,https,ssh --permanent

# リロード
sudo firewall-cmd --reload

カスタムサービスの作成

既存のサービス定義に当てはまらない場合、カスタムサービスを作成できます。

<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>Custom App</short>
  <description>Custom application service</description>
  <port protocol="tcp" port="9000"/>
  <port protocol="tcp" port="9001"/>
</service>

その後、このサービスを適用します:

bash
# custom-app サービスを許可
sudo firewall-cmd --zone=public --add-service=custom-app --permanent
sudo firewall-cmd --reload

永続設定とランタイム設定の違い

firewalldには、2つの設定レベルが存在します。

ランタイム設定(一時的)

bash
# --permanent なしで設定
sudo firewall-cmd --zone=public --add-port=8080/tcp

# ランタイム設定を確認
sudo firewall-cmd --zone=public --list-all

# firewalrdサービス再起動で消失
sudo systemctl restart firewalld

永続設定(恒久的)

bash
# --permanent で設定
sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent

# 設定ファイルで確認可能
cat /etc/firewalld/zones/public.xml

# サービス再起動後も維持
sudo systemctl restart firewalld

実務での推奨アプローチは以下の通りです:

  1. テスト環境での検証:まずランタイム設定でテスト
  2. 動作確認後:問題がなければ永続設定に変更
  3. 本番環境への展開:永続設定のみ使用

ルール確認・トラブルシューティング

ルール確認の基本コマンド

bash
# ゾーンのすべてのルールを表示
sudo firewall-cmd --zone=public --list-all

# 許可されているサービスのみ表示
sudo firewall-cmd --zone=public --list-services

# 許可されているポートのみ表示
sudo firewall-cmd --zone=public --list-ports

# ICMP(ping)の設定確認
sudo firewall-cmd --zone=public --list-icmp-blocks

ポート開放が反映されない場合

bash
# 1. 永続設定と現在のランタイム設定を比較
diff <(sudo firewall-cmd --zone=public --list-all) \
     <(sudo firewall-cmd --zone=public --list-all --permanent)

# 2. 設定ファイルを直接確認
sudo cat /etc/firewalld/zones/public.xml

# 3. firewalldをリロード
sudo firewall-cmd --reload

# 4. 確認用コマンド:対象ポートが公開されているか確認
sudo firewall-cmd --zone=public --list-ports

接続テスト

bash
# ローカルマシンからのテスト
nc -zv localhost 8080

# リモートマシンからのテスト
nc -zv remote-host 8080

# ファイアウォールのログ確認
sudo journalctl -u firewalld -n 50

よくあるトラブルと対処法

トラブル 原因 対処法
ポート開放後も接続できない リロード忘れ sudo firewall-cmd --reload を実行
再起動後に設定が消える ランタイム設定のみ --permanent オプションを使用
特定のIPからだけ接続できない ゾーンのIPアドレス制限 ソースIPベースのルール設定
ポート確認コマンドで見えない 設定ファイルのキャッシュ sudo firewall-cmd --reload で更新

まとめ

RHEL9のfirewalldは、iptablesよりも柔軟で直感的なファイアウォール管理が実現できる強力なツールです。ゾーン管理による複数ネットワークの対応、サービス定義による効率的なポート管理など、実務的な運用が可能です。

本記事で解説した基本操作とトラブルシューティングのポイントを活用すれば、firewalldの運用がスムーズになります。特に、永続設定とランタイム設定の区別とリロードの実施を忘れずに、安定的なファイアウォール運用を心がけてください。

【注意】

このブログは技術に関する知識や経験を共有することを目的としており、情報の正確性に努めていますが、その内容の正確性や完全性を保証するものではありません。ブログの情報を利用する場合は、自己の責任において行動してください。ブログの内容に基づいて行った行動や決定によって生じた損害や被害について、筆者は一切の責任を負いません。

 

記事の内容の一部は、生成AIで作成しています。

ITナレッジRHEL
この記事の作者
StarTeller

30歳で異業種からITエンジニアへ転身し、10年以上にわたりインフラエンジニアとして様々な現場でシステム構築・運用に携わってきました。
得意分野はLinux/Windowsのサーバー構築・運用で、ネットワークやAWSなども実務で活用しています。このブログでは、これまでの業務で培った経験を基に、日々の業務で遭遇した問題の解決方法や、システム構築の具体的な手順を解説。現場のエンジニアが実際に「困ったとき」に参照できる情報を意識して投稿していこうと思っています。
※サーバ運用費がかかっているので、広告を掲載させて頂いてます。

StarTellerをフォローする
シェアする
StarTellerをフォローする
タイトルとURLをコピーしました