Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】Firewalld: The Modern Firewall Manager

2025年09月19日に「Dev.to」が公開したITニュース「Firewalld: The Modern Firewall Manager」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

FirewalldはLinuxの動的ファイアウォール管理ツールだ。`firewall-cmd`コマンドで、サービス再起動不要でルールを設定できる。「ゾーン」や「サービス」でネットワークとアプリの通信を制御し、セキュリティを強化する。IPアドレスのブロックなど詳細設定も可能で、システムの安全を保つ。

出典: Firewalld: The Modern Firewall Manager | Dev.to公開日:

ITニュース解説

Firewalldは、Linuxシステムにおいてネットワークの安全を守るための「門番」のような役割を果たすソフトウェアだ。システムに入ってくる通信やシステムから出ていく通信を監視し、許可されたものだけを通し、不審なものや不要なものはブロックすることで、不正アクセスや悪意のある攻撃からサーバーやパソコンを守る。特にシステムエンジニアを目指す初心者にとって、このFirewalldを理解し、適切に設定することは、堅牢なシステムを構築する上で欠かせない基礎知識となる。

従来のファイアウォールシステム、例えばiptablesなどでは、設定を変更するたびにファイアウォールサービスを再起動する必要があった。これは、運用中のシステムに影響を与える可能性があり、特に重要なサービスを提供しているサーバーでは避けたいことだ。しかし、Firewalldは「動的ファイアウォール」と呼ばれる新しいアプローチを採用しており、サービスの再起動なしでルールを即座に適用できる点が大きな利点だ。これにより、システムへの影響を最小限に抑えつつ、柔軟かつ迅速にセキュリティポリシーを変更できる。

Firewalldを操作するための主要なツールは、コマンドラインで実行するfirewall-cmdコマンドだ。このコマンドを使って、ファイアウォールのさまざまな設定を行うことになる。

Firewalldの理解を深める上で、いくつかの重要な概念がある。まず「ゾーン」だ。これはネットワーク環境の種類に応じて、あらかじめ定義されたルールセットのことだ。例えば、インターネットのような「信頼できない」ネットワーク環境には厳格なルールを適用する「public」ゾーンを、自宅のネットワークなど「信頼できる」ネットワーク環境には比較的緩やかなルールを適用する「home」ゾーンをといった具合に使い分ける。他にも、すべての通信を許可する「trusted」、内部ネットワーク向けの「internal」など、複数のゾーンが用意されている。ネットワークインターフェース(例えば、有線LANや無線LANの接続口)を適切なゾーンに割り当てることで、そのインターフェースを通る通信に特定のルールセットを適用できる。

次に「サービス」という概念がある。これはHTTP(ウェブサイト閲覧)、SSH(リモート接続)、FTP(ファイル転送)といった特定のアプリケーションやプロトコルが使用する通信ルールを、名前でひとまとめにしたものだ。Firewalldでは、これらの一般的なサービスに対して、すでに必要なポート番号などのルールが定義されている。そのため、例えばSSH接続を許可したい場合に「ポート番号22番のTCP通信を許可する」と具体的に指定しなくても、「sshサービスを許可する」と指定するだけで済むため、設定が非常に簡単になる。ポート番号をいちいち覚える必要がないのは、初心者にとって大きな助けとなるだろう。

そして、Firewalldの設定には「実行時」と「永続的」という二つの状態がある。firewall-cmdコマンドで設定を変更した場合、デフォルトではその変更はすぐにシステムに適用されるが、これは「実行時」の設定であり、システムを再起動すると失われてしまう。永続的に設定を保存し、システム再起動後もそのルールを有効に保ちたい場合は、コマンドに--permanentというフラグ(オプション)を追加する必要がある。永続的な変更を加えた後、実際にその変更を現在の実行中のファイアウォールに反映させるためには、firewall-cmd --reloadコマンドを実行して、永続的な設定を再読み込みすることが不可欠だ。

firewall-cmdコマンドには多種多様なオプションがあるが、ここではいくつか主要なものを紹介しよう。

まず、ファイアウォールの状態を確認するにはfirewall-cmd --stateを使う。また、前述の通り、永続的な変更を適用するためにfirewall-cmd --reloadは非常に重要だ。

ゾーンを管理するためのコマンドとして、現在どのゾーンがどのネットワークインターフェースに割り当てられているかを確認するにはfirewall-cmd --get-active-zonesがある。現在のデフォルトゾーンを確認するならfirewall-cmd --get-default-zone、新しいデフォルトゾーンを設定するならfirewall-cmd --set-default-zone=<ゾーン名>を使用する。利用可能なすべてのゾーンの一覧を見るにはfirewall-cmd --get-zonesを、そして特定のゾーンに設定されているすべてのルールやサービス、ポートなどの詳細情報を確認するにはfirewall-cmd --zone=<ゾーン名> --list-allが便利だ。

サービスをゾーンに追加・削除するには、それぞれfirewall-cmd --zone=<ゾーン名> --add-service=<サービス名>firewall-cmd --zone=<ゾーン名> --remove-service=<サービス名>を使う。利用可能なサービスの一覧はfirewall-cmd --get-servicesで確認できる。

特定のポート番号を許可またはブロックしたい場合は、firewall-cmd --zone=<ゾーン名> --add-port=<ポート番号>/<プロトコル>firewall-cmd --zone=<ゾーン名> --remove-port=<ポート番号>/<プロトコル>を使用する。例えば、ウェブサーバーで一般的なポート8080のTCP通信を許可するなら--add-port=8080/tcpと指定する。

Firewalldには、より高度で詳細な制御を可能にする「リッチルール」という強力な機能がある。これは、単にポートやサービスを許可するだけでなく、特定の送信元IPアドレスからのアクセスのみを許可・拒否したり、特定の条件を満たす通信をログに記録したり、より複雑な通信の転送設定を行ったりする場合に用いられる。--add-rich-ruleオプションを使って、複雑な条件を記述したルールを追加できる。

ネットワークアドレス変換(NAT)の一種である「マスカレード」もFirewalldで設定できる。これは、一つのコンピュータをゲートウェイとして機能させ、プライベートネットワーク内の複数のデバイスがそのコンピュータのインターネット接続を共有できるようにする技術だ。firewall-cmd --zone=<ゾーン名> --add-masqueradeで有効にできる。また、特定のポートへの通信を別のポートや異なるIPアドレスに転送する「ポートフォワーディング」も--add-forward-portオプションで設定可能だ。

Firewalldの設定は、大きく分けて二つの場所に保存される。一つは「実行時」の設定で、/run/firewalld/ディレクトリに一時的に保存されるが、これはシステムが起動している間だけ有効であり、再起動すると失われるため、ユーザーが直接編集するものではない。もう一つは「永続的な」設定で、システムが再起動しても維持される設定だ。この永続設定には、システムがデフォルトで提供する設定ファイルが/usr/lib/firewalld/に、そしてユーザーが--permanentフラグを使って変更・作成した設定ファイルが/etc/firewalld/にそれぞれ保存される。/etc/firewalld/に保存された設定は、/usr/lib/firewalld/のデフォルト設定よりも優先されるため、ユーザーはこのディレクトリ内のファイルを変更することでFirewalldの動作をカスタマイズすることになる。

主要な設定ファイルとしては、Firewalld全体のデフォルトゾーンやグローバル設定を記述する/etc/firewalld/firewalld.conf、各ゾーンのルールを定義するXMLファイルが置かれる/etc/firewalld/zones/ディレクトリ、そしてユーザーが独自に定義したサービスを記述するXMLファイルが置かれる/etc/firewalld/services/ディレクトリなどがある。これらのXMLファイルは、Firewalldの内部構造を理解する上で重要だ。

最後に、Firewalldを使って特定のIPアドレスからのアクセスをブロックする実践的な例を見てみよう。最も柔軟な方法は、リッチルールを使うことだ。例えば、特定のIPアドレス(例: 192.168.1.100)からのすべての通信をブロックしたい場合、次のようにコマンドを実行する。

firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" reject' firewall-cmd --reload

このコマンドでは、IPv4通信に対して、送信元IPアドレスが「192.168.1.100」である通信を「reject」(拒否し、相手に接続が拒否されたことを通知する)というルールを追加し、それを永続化している。そして、--reloadで即座に適用する。

もし、特定のIPアドレス(例: 192.168.1.100)からのSSH接続だけをブロックしたい場合は、サービス名を指定したリッチルールを使う。

firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" service name="ssh" reject' firewall-cmd --reload

さらに、特定のネットワーク全体(サブネット、例: 192.168.1.0/24)からの通信をブロックしたい場合も、CIDR表記を使って簡単に指定できる。

firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" reject' firewall-cmd --reload

これらのルールを追加した後、必ずfirewall-cmd --reloadを実行して、永続的な設定が現在のファイアウォールに反映されるようにすることが重要だ。Firewalldは、このような柔軟な設定を通じて、システムを不正なアクセスから守り、安全な運用を実現するための強力なツールであると言える。システムエンジニアとしての第一歩として、Firewalldの基本的な概念と操作をしっかりと身につけてほしい。