firewalld
『firewalld』は RHEL・AlmaLinux・Rocky Linux・Fedora 系ディストリビューションの標準ファイアウォール管理デーモンです。「ゾーン」と「サービス」という概念でルールを整理し、『firewall-cmd』コマンドで動的にポートの開放・閉鎖・永続化を行います。再起動なしにルールを即時反映できるため、本番サーバーのメンテナンス中でも安全に設定変更が可能です。
構文
# -----------------------------------------------
# ゾーン関連
# -----------------------------------------------
# firewall-cmd --get-default-zone
# → デフォルトゾーンを表示します
# 例: firewall-cmd --get-default-zone
# firewall-cmd --get-zones
# → 利用可能なゾーンの一覧を表示します
# firewall-cmd --get-active-zones
# → 現在アクティブなゾーンとそのインターフェースを表示します
# firewall-cmd --set-default-zone={ゾーン名}
# → デフォルトゾーンを変更します(即時・永続的に反映)
# 例: firewall-cmd --set-default-zone=public
# -----------------------------------------------
# サービスの追加・削除
# -----------------------------------------------
# firewall-cmd --zone={ゾーン名} --add-service={サービス名}
# → 指定ゾーンにサービスを追加します(一時的・再起動で消えます)
# 例: firewall-cmd --zone=public --add-service=http
# firewall-cmd --zone={ゾーン名} --remove-service={サービス名}
# → 指定ゾーンからサービスを削除します(一時的)
# 例: firewall-cmd --zone=public --remove-service=ftp
# firewall-cmd --zone={ゾーン名} --add-service={サービス名} --permanent
# → サービスを永続的に追加します(再起動後も有効)
# → --permanent は設定ファイルへの書き込みのみで、即時反映には --reload が必要です
# 例: firewall-cmd --zone=public --add-service=https --permanent
# -----------------------------------------------
# ポートの追加・削除
# -----------------------------------------------
# firewall-cmd --zone={ゾーン名} --add-port={ポート番号}/{プロトコル}
# → 指定ゾーンにポートを追加します(一時的)
# 例: firewall-cmd --zone=public --add-port=8080/tcp
# firewall-cmd --zone={ゾーン名} --remove-port={ポート番号}/{プロトコル}
# → 指定ゾーンからポートを削除します(一時的)
# 例: firewall-cmd --zone=public --remove-port=8080/tcp
# firewall-cmd --zone={ゾーン名} --add-port={ポート番号}/{プロトコル} --permanent
# → ポートを永続的に追加します
# 例: firewall-cmd --zone=public --add-port=3306/tcp --permanent
# -----------------------------------------------
# ソースIPの制限
# -----------------------------------------------
# firewall-cmd --zone={ゾーン名} --add-source={IPアドレス/CIDR}
# → 特定のIPアドレス・ネットワークをゾーンに割り当てます(一時的)
# → そのゾーンのルールが適用されます
# 例: firewall-cmd --zone=trusted --add-source=192.168.1.0/24
# firewall-cmd --zone={ゾーン名} --add-source={IPアドレス/CIDR} --permanent
# → ソースIPを永続的に割り当てます
# 例: firewall-cmd --zone=trusted --add-source=10.0.0.5/32 --permanent
# -----------------------------------------------
# 設定の確認・永続化
# -----------------------------------------------
# firewall-cmd --list-all
# → デフォルトゾーンの現在の設定をすべて表示します
# firewall-cmd --zone={ゾーン名} --list-all
# → 指定ゾーンの設定をすべて表示します
# firewall-cmd --reload
# → --permanent で書き込んだ設定をランタイムに反映します
# → 既存の接続は切断されません
# firewall-cmd --runtime-to-permanent
# → 現在のランタイム設定を永続化します(逆方向の保存)
構文一覧
| コマンド | 説明 |
|---|---|
--get-default-zone | デフォルトゾーンを表示します。何も指定しない場合はこのゾーンのルールが適用されます。 |
--get-zones | システムで定義されているすべてのゾーン名を一覧表示します。 |
--get-active-zones | 現在アクティブなゾーンとそれに紐づくネットワークインターフェースを表示します。 |
--set-default-zone={ゾーン} | デフォルトゾーンを変更します。--permanent なしでも永続的に反映されます。 |
--list-all | ゾーンのサービス・ポート・ソースなどすべての設定を表示します。 |
--add-service={サービス名} | 定義済みサービス(http・https・ssh など)をゾーンに追加します。一時的な変更です。 |
--remove-service={サービス名} | ゾーンからサービスを削除します。一時的な変更です。 |
--add-port={ポート}/{プロトコル} | ポート番号を直接指定してゾーンに追加します。サービス定義がないポートに使用します。 |
--remove-port={ポート}/{プロトコル} | ゾーンからポートを削除します。一時的な変更です。 |
--add-source={IP/CIDR} | 特定のIPアドレス・ネットワーク帯をゾーンに割り当てます。送信元IPによるルール振り分けに使用します。 |
--remove-source={IP/CIDR} | ゾーンからソースIPの割り当てを解除します。 |
--permanent | 設定を永続化(設定ファイルへ書き込み)します。単体では即時反映されず、--reload が必要です。 |
--reload | --permanent で書き込んだ設定をランタイムに反映します。既存の接続は維持されます。 |
--runtime-to-permanent | 現在のランタイム設定をまとめて永続化します。一時的な変更を後から保存したい場合に便利です。 |
--query-service={サービス名} | 指定したサービスがゾーンに追加されているかを確認します(yes / no で返ります)。 |
--query-port={ポート}/{プロトコル} | 指定したポートがゾーンに追加されているかを確認します。 |
使用例
HTTP・HTTPS を公開ゾーンに永続的に開放する
# ----------------------------------------------- # webmasterの Web サーバーを外部に公開する # ----------------------------------------------- # 現在の public ゾーンの設定を確認します firewall-cmd --zone=public --list-all # HTTP(80番)・HTTPS(443番)をそれぞれ永続的に追加します # --permanent は設定ファイルへの書き込みのみです sudo firewall-cmd --zone=public --add-service=http --permanent sudo firewall-cmd --zone=public --add-service=https --permanent # --permanent で書き込んだ設定をランタイムに反映します sudo firewall-cmd --reload # 設定が反映されたことを確認します firewall-cmd --zone=public --list-services
実行するコマンドは次の通りです。
$ firewall-cmd --zone=public --list-all public (active) target: default icmp-block-inversion: no interfaces: eth0 sources: services: cockpit dhcpv6-client ssh ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: $ sudo firewall-cmd --zone=public --add-service=http --permanent success $ sudo firewall-cmd --zone=public --add-service=https --permanent success $ sudo firewall-cmd --reload success $ firewall-cmd --zone=public --list-services cockpit dhcpv6-client http https ssh
MySQL(3306番)を特定IPアドレスのみ許可する
# ----------------------------------------------- # appserverのアプリサーバーからのみ MySQL に接続を許可する # ----------------------------------------------- # appserverのサーバー(192.168.10.20)を trusted ゾーンに割り当てます # trusted ゾーンはすべての通信を信頼します sudo firewall-cmd --zone=trusted --add-source=192.168.10.20/32 --permanent # public ゾーンには MySQL ポートを開けません # trusted ゾーンへの割り当てだけで、 # 192.168.10.20 からの接続はすべて許可されます # 設定を反映します sudo firewall-cmd --reload # trusted ゾーンの設定を確認します firewall-cmd --zone=trusted --list-all
実行するコマンドは次の通りです。
$ sudo firewall-cmd --zone=trusted --add-source=192.168.10.20/32 --permanent success $ sudo firewall-cmd --reload success $ firewall-cmd --zone=trusted --list-all trusted (active) target: ACCEPT icmp-block-inversion: no interfaces: sources: 192.168.10.20/32 services: ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:
カスタムポートを一時的に開放し、動作確認後に永続化する
# ----------------------------------------------- # devuserの開発用アプリ(8080番)を段階的に公開する # ----------------------------------------------- # まず一時的に 8080/tcp を追加します(再起動で消えます) # テスト中はいつでも戻せるので安全です sudo firewall-cmd --zone=public --add-port=8080/tcp # 開放されたことを確認します firewall-cmd --zone=public --list-ports # アプリが正常に動作することを確認後、永続化します sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent sudo firewall-cmd --reload # 永続化されたことを確認します firewall-cmd --zone=public --query-port=8080/tcp
実行するコマンドは次の通りです。
$ sudo firewall-cmd --zone=public --add-port=8080/tcp success $ firewall-cmd --zone=public --list-ports 8080/tcp $ sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent success $ sudo firewall-cmd --reload success $ firewall-cmd --zone=public --query-port=8080/tcp yes
サービスを削除してポートを閉じる
# ----------------------------------------------- # sysadminの FTP サービスを停止して閉鎖する # ----------------------------------------------- # FTP サービスが現在開放されているか確認します firewall-cmd --zone=public --query-service=ftp # FTP を永続的に削除します sudo firewall-cmd --zone=public --remove-service=ftp --permanent # ランタイムにも即時反映します sudo firewall-cmd --reload # 削除されたことを確認します(no が返れば成功です) firewall-cmd --zone=public --query-service=ftp
実行するコマンドは次の通りです。
$ firewall-cmd --zone=public --query-service=ftp yes $ sudo firewall-cmd --zone=public --remove-service=ftp --permanent success $ sudo firewall-cmd --reload success $ firewall-cmd --zone=public --query-service=ftp no
概要
『firewalld』は nftables(または iptables)をバックエンドとして動作する動的ファイアウォール管理デーモンです。「ゾーン」は信頼レベルをまとめたルールセットで、『public』(外部ネットワーク)、『trusted』(完全信頼)、『internal』(内部ネットワーク)など用途別に用意されています。「サービス」は /usr/lib/firewalld/services/ に XML で定義されたポートの集合体で、例えば『http』は 80/tcp、『mysql』は 3306/tcp に対応します。『--permanent』フラグを付けた変更は設定ファイルに書き込まれ、『--reload』でランタイムに反映されます。一方、--permanent なしの変更はランタイムのみに即時反映され、firewalld の再起動・OS の再起動で元に戻ります。低レベルのルール管理については iptables のページを参照してください。Debian・Ubuntu 系でよく使われる軽量ファイアウォールについては ufw のページも参考にしてください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。