今回は、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
実務での推奨アプローチは以下の通りです:
- テスト環境での検証:まずランタイム設定でテスト
- 動作確認後:問題がなければ永続設定に変更
- 本番環境への展開:永続設定のみ使用
ルール確認・トラブルシューティング
ルール確認の基本コマンド
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の運用がスムーズになります。特に、永続設定とランタイム設定の区別とリロードの実施を忘れずに、安定的なファイアウォール運用を心がけてください。
