Rocky Linux / ファイアウォールの管理方法

Rocky Linuxの基本的なファイアウォール管理ツールはfirewalldであり、firewall-cmdでゾーン(zone)、サービスおよびポートを管理します。リモートサーバーでは、現在のSSH接続を維持したまま、まずランタイムルールで試行し、接続が正常であることを確認した後、永続設定として保存する順序が安全です。

firewalldの状態と有効なゾーンの確認

sudo firewall-cmd --state
sudo systemctl status firewalld
sudo firewall-cmd --get-active-zones
sudo firewall-cmd --get-default-zone

ゾーンは、ネットワーク接続や送信元アドレスに適用する信頼レベルとルールのセットです。コマンドで--zoneを省略すると、予期しないデフォルトゾーンを変更してしまうことがあるため、有効なインターフェースが属するゾーンを先に確認してください。

Rocky Linuxの基本概念とコマンドは、Rocky Linux firewalld公式ガイドで確認できます。

ファイアウォールサービスの起動と自動実行

未起動のfirewalldを有効にすると、現在の通信にもルールが適用されます。パッケージと既存設定、SSHの許可を確認し、リモート操作ではコンソール復旧手段を確保してから進めます。別のファイアウォール管理ツールが動作している場合は、競合も確認してください。以下のpublicは例なので、実際のゾーンへ置き換えます。

sudo systemctl enable --now firewalld

状態を確認します。

systemctl is-enabled firewalld
systemctl is-active firewalld

運用サーバーでファイアウォールを丸ごと停止する方法は推奨されません。必要なサービスと送信元のみを許可するようにルールを調整してください。クラウド環境では、セキュリティグループやネットワークACLも別途適用される場合があります。

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

設定 適用時点 特徴
ランタイム コマンド実行直後 再起動・リブート・reload時に消えることがあるため、一時的なテストに使えますが、実際の通信へ即時に影響します。
永続 --permanent 記録後にreload 再起動後も維持されますが、ランタイムにすぐ反映されないコマンドが多くあります。

まずランタイムにルールを追加してテストした後、全体のランタイム構成を永続設定として保存できます。--runtime-to-permanentは今回のHTTPルールだけを保存する命令ではなく、永続設定を現在の構成で上書きします。他の一時変更も含めて確認してください。

sudo firewall-cmd --zone=public --add-service=http
sudo firewall-cmd --zone=public --query-service=http
sudo firewall-cmd --runtime-to-permanent

逆に--permanentだけで変更した場合は、通常reloadなどの後に反映されます。reloadは永続設定を読み込み、未保存のランタイム変更を失わせるため、SSH許可を含めて両方を確認します。詳細はfirewall-cmdの公式マニュアルを参照してください。

sudo firewall-cmd --reload

サービスを許可して削除する

定義されたサービスを確認する

firewall-cmd --get-services
firewall-cmd --info-service=http

HTTP、HTTPS、SSHのように定義されたサービスは、実際の待ち受けポートが定義と合う場合、サービス名で許可すると意図が明確です。例えばsshの定義は通常22/tcpで、SSHの待ち受けポートを変更しても自動追従しません。Rocky LinuxのSSHポート変更ではSELinux側も含めて確認します。

サービスをランタイムで許可する

sudo firewall-cmd --zone=public --add-service=http
sudo firewall-cmd --zone=public --add-service=https

サービスが実際に該当ポートで受信しているかも確認します。

ss -lntup

許可したサービスを削除する

sudo firewall-cmd --zone=public --remove-service=http

リモート SSH 管理中の場合は、SSH サービスを削除する前にコンソール復旧手段や他の許可ルールがあるか確認してください。

カスタムポートの管理

TCP または UDP ポートを許可する

sudo firewall-cmd --zone=public --add-port=8443/tcp
sudo firewall-cmd --zone=public --add-port=5000/udp

TCP と UDP は別々のルールです。アプリケーションのドキュメントで実際のプロトコルとポートを確認し、必要なものだけ開けてください。

範囲を許可する

sudo firewall-cmd --zone=public --add-port=6000-6010/tcp

広い範囲を開く前に、アプリケーションが実際に必要とする範囲を確認し、可能であれば送信元アドレスも制限してください。

ポートを削除して確認する

sudo firewall-cmd --zone=public --remove-port=8443/tcp
sudo firewall-cmd --zone=public --list-ports

現在のルールを確認する

sudo firewall-cmd --zone=public --list-all
sudo firewall-cmd --list-all-zones
sudo firewall-cmd --permanent --zone=public --list-all

ランタイム出力と --permanent 出力が異なる場合、次回の reload または再起動後に動作が変わる可能性があります。変更作業を完了する前に、両方の構成を比較してください。

特定の送信元アドレスのみ許可する

rich ruleでSSH送信元を制限する

sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.0.2.10/32" service name="ssh" accept'

192.0.2.10はドキュメント用の例示アドレスです。実際の管理者の固定されたグローバルIPや安全な内部ネットワーク範囲に置き換えてください。

一般SSH許可を削除する前にテストする

新しいルールを追加して事前接続を試し、コンソール復旧手段を確認します。ただし広いSSH許可が残る間の成功だけでは、送信元制限が機能した証明にはなりません。ルールを記録してから広い許可を取り除き、許可した送信元から新しい接続を再試験します。失敗時は残した管理セッションまたはコンソールから、今回取り除いたサービス許可を戻します。

sudo firewall-cmd --zone=public --list-rich-rules
sudo firewall-cmd --zone=public --remove-service=ssh

例のrich ruleはIPv4だけが対象です。他のゾーン・許可ポート・rich rule・ポリシーやIPv6からの経路で広い許可が残っていないかも確認します。意図した許可元と、それ以外の許可された検証元から新規接続を試し、確認後に永続保存します。管理者IPが動的に変わる環境では、固定IP、VPN(Virtual Private Network)または専用管理ネットワークを検討してください。

ネットワークインターフェースとゾーンを接続する

nmcli connection show --active
firewall-cmd --get-active-zones

NetworkManager接続プロファイルでゾーンを指定すると、ネットワーク接続とfirewalldゾーンを一貫して管理できます。

sudo nmcli connection modify 'System eth0' connection.zone public
sudo nmcli connection up 'System eth0'

接続名は環境によって異なります。リモートネットワークプロファイルを再度有効にすると接続が切断される可能性があるため、コンソールを確保し、メンテナンスタイムに適用してください。

問題が発生したときの確認手順

  1. systemctl is-active firewalldでサービスの状態を確認します。
  2. firewall-cmd --get-active-zonesでインターフェースが属するゾーンを確認します。
  3. ランタイム設定と永続設定の--list-allの結果を比較します。
  4. ss -lntupでアプリケーションが実際のアドレスとポートで受信しているか確認します。
  5. クラウドセキュリティグループ、ルーターACLおよびNATルールを確認します。
  6. SELinuxによるブロックの有無およびアプリケーションログを確認します。

ファイアウォールでポートを開いても、プログラムが実行中でない場合やループバックアドレスにしかバインドされていない場合、外部から接続することはできません。

よくある質問

--permanentを付けてもすぐには接続できません

永続設定は通常、reload後にランタイムに反映されます。現在接続を保護する必要がある場合は、まずランタイムルールで試し、保存する方法を使用してください。

ポートを開けたのに外部から接続できません

アクティブゾーン、サービスの受信アドレス、クラウドファイアウォール、NATおよびSELinuxを一緒に確認する必要があります。firewalldは通信経路の一層です。

サービスとポートのどちらの方法が良いですか?

定義された標準サービスがある場合はサービス名の方が読みやすいです。カスタムポートや別のアプリケーションは、プロトコルを明示したポートルールを使用します。

firewalldを停止してもよいですか?

問題を確認するために運用サーバーでファイアウォール全体を停止するのは危険です。ログと現在のルールを確認し、必要な範囲だけを一時的に調整してください。

まとめ

firewalld の設定は、アクティブなゾーンを確認し、ランタイムルールで試した後、--runtime-to-permanent に保存する流れが安全です。標準サービスはサービス名で、カスタムポートは TCP・UDP を区別して最小限の範囲だけ許可してください。

リモート SSH 環境では、既存のセッションとコンソール復旧手段を維持し、新しい接続が成功した後でルールを絞ることが最も重要です。