はじめに
この実験では、実際のサーバーを使用したハンズオン形式で、Linux システム上の firewalld を設定して Web トラフィックを許可するための重要な手順を学びます。サーバーのセキュリティを担当するシステム管理者にとって基本となるスキルである、firewall-cmd コマンドラインユーティリティを使用したファイアウォールゾーンとサービスの管理方法を習得します。主な目標は、HTTP および HTTPS の標準ポートを開放し、デフォルトのセキュリティ状態を維持しながら、外部から Web サーバーにアクセスできるようにすることです。
まず、firewalld サービスの状態を確認し、インストール、実行、およびブート時の自動起動が有効になっていることを確認することから始めます。次に、デフォルトのファイアウォールゾーンを public に設定し、シンプルな Python Web サーバーを実行することで、ファイアウォールルールの実用的な影響を体験します。http および https サービスのルールを追加・削除するプロセスを通じて、これらの設定が実際のネットワーク接続にどのように影響するかを直接確認します。実験の最後には、設定の検証方法と、さらに学習を進めるための firewall-cmd の他のオプションの探索方法を紹介します。
firewalld のステータスとデフォルトゾーンの確認
このステップでは、Linux 用の強力で柔軟なファイアウォール管理ツールである firewalld の操作を開始します。設定を変更する前に、サービスがインストールされて実行されているかを確認し、現在のデフォルト設定を特定することが不可欠です。これにより、作業の基準となるベースラインを明確にできます。
まず、システムに firewalld がインストールされていることを確認しましょう。すでに存在している場合もありますが、インストールコマンドを実行して確認するのが確実です。ターミナルを開き、以下のコマンドを実行してパッケージリストを更新し、firewalld をインストールします。
sudo apt-get update && sudo apt-get install -y firewalld
インストールが完了すると、firewalld はデフォルトでアクティブになるはずです。これを確認するために、現代の Linux ディストリビューションでサービス管理に使用される systemctl コマンドを使用して、firewalld サービスのステータスをチェックします。
次のコマンドを実行して、firewalld がアクティブかどうかを確認してください。
sudo systemctl status firewalld
出力に active (running) と表示されていれば、ファイアウォールが動作していることを示しています。
サービスが実行されているので、次にその設定を調べます。firewalld は、ネットワーク接続の信頼レベルを管理するために「ゾーン(Zone)」を使用します。ゾーンとは、事前定義されたルールのセットです。現在どのゾーンがデフォルトとして設定されているかを確認しましょう。
firewalld の主要なコマンドラインインターフェースである firewall-cmd ユーティリティを使用して、デフォルトゾーンを取得します。
sudo firewall-cmd --get-default-zone
新規インストールの場合、通常は public が返されます。
public
これで、firewalld のステータス確認とデフォルトゾーンの特定が完了しました。次のステップでは、この設定を変更する方法を学びます。
デフォルトゾーンを public に設定する
このステップでは、firewalld のデフォルトゾーンを設定する方法を学びます。デフォルトゾーンは、他のゾーンに明示的に割り当てられていないネットワークインターフェースに適用されます。新規インストールではデフォルトゾーンが public になっていることが多いですが、その設定方法を知ることはファイアウォール管理の基本スキルです。public ゾーンは通常、パブリックな信頼できないネットワークに使用されます。これは、ネットワーク上の他のコンピュータが自分のコンピュータに害を及ぼさないとは限らない(信頼できない)という前提に基づいています。
デフォルトゾーンを変更するには、firewall-cmd コマンドに --set-default-zone オプションを付けて使用します。この変更は永続的であり、即座に適用されます。
ターミナルで以下のコマンドを実行し、デフォルトゾーンを public に設定します。
sudo firewall-cmd --set-default-zone=public
コマンドを実行すると、firewalld は変更が成功したことを通知します。
success
変更が正しく適用されたことを確認するのは常に良い習慣です。前のステップと同様に、--get-default-zone コマンドを実行して確認できます。
sudo firewall-cmd --get-default-zone
出力でデフォルトゾーンが public になっていることを確認してください。
public
これで、ファイアウォールのデフォルトゾーンの設定と検証が完了しました。これにより、あらゆるネットワーク接続に対してベースラインとなるセキュリティ状態が確保されます。続くステップでは、特定の種類のトラフィックを許可するためのルールをこのゾーンに追加していきます。
public ゾーンへの http サービスの追加と Web サーバーによるテスト
このステップでは、Web トラフィックを許可するルールをファイアウォールに追加し、シンプルな Web サーバーを実行してその実用的な影響を実証します。デフォルトでは、firewalld はシステムを保護するためにほとんどの着信トラフィックをブロックします。特定の接続を許可するには、公開したいサービスのルールを追加する必要があります。firewalld は、標準的なネットワークポートを覚えやすい名前で定義した「サービス」を使用します。例えば、http サービスは、暗号化されていない Web トラフィックの標準ポートである TCP ポート 80 に対応しています。
まず、変更を加える前に public ゾーンの現在のファイアウォールの状態を確認しましょう。
sudo firewall-cmd --zone=public --list-services
最初はリストに http が含まれていないことに気づくでしょう。これは、ポート 80 への外部接続がブロックされていることを意味します。
次に、http サービスを public ゾーンに追加します。firewall-cmd コマンドに --add-service オプションを使用し、変更したいゾーンを指定します。
sudo firewall-cmd --zone=public --add-service=http
このコマンドは、http サービスのルールを追加して public ゾーンを変更するよう firewalld に指示します。この変更はランタイム(実行時)設定に適用されるため、即座に有効になります。確認メッセージが表示されるはずです。
success
サービスが追加されたことを確認するために、再度サービスリストをチェックします。
sudo firewall-cmd --zone=public --list-services
許可されたサービスのリストに http が表示されるはずです。
実用的な影響を確認するために、シンプルな Web サーバーを起動してみましょう。Python に組み込まれている HTTP サーバーをポート 80 で使用します。
cd /tmp
echo "<h1>Welcome to LabEx Firewall Demo</h1><p>This server is running on port 80</p>" > index.html
sudo python3 -m http.server 80
ポート 80 は特権ポート(1024 未満)であるため、sudo が必要です。このサーバーは別のターミナルで実行したままにしてください。
別のターミナルから、接続をテストします。
curl http://localhost
http サービスがファイアウォールを通過できるようになったため、接続が成功します。なお、localhost 接続はファイアウォールルールをバイパスする場合がありますが、重要なのは、これでポート 80 への外部接続がファイアウォールによって許可されるようになったという点です。
ファイアウォールの管理機能をさらに理解するために、一時的に HTTP サービスを削除してみましょう。
sudo firewall-cmd --zone=public --remove-service=http
サービスリストを確認して、削除されたことを確かめます。
sudo firewall-cmd --zone=public --list-services
リストから http が消えているはずです。では、サービスを元に戻します。
sudo firewall-cmd --zone=public --add-service=http
再び追加されたことを確認します。
sudo firewall-cmd --zone=public --list-services
これで、ファイアウォールで HTTP サービスを管理する方法を習得し、設定変更の実演が完了しました。重要な概念は、Web サーバーが動作していても、http サービスのルールがなければ、ポート 80 への外部接続はファイアウォールによってブロックされるということです。デモンストレーションが終わったら、Ctrl+C で Web サーバーを停止できます。
public ゾーンへの https サービスの追加と HTTPS 設定のテスト
このステップでは、https サービスを追加してファイアウォールの設定を続けます。http は標準的な Web トラフィックを許可しますが、現代の Web 通信は暗号化とセキュリティのために https (HTTP Secure) に依存しています。https サービスは TCP ポート 443 に対応しており、機密情報を扱うサーバーには不可欠です。
HTTPS サービスを追加する前に、ファイアウォールルールがない状態で HTTPS 接続をテストしようとするとどうなるかを確認しましょう。次のコマンドを実行して、現在のファイアウォールサービスを確認します。
sudo firewall-cmd --zone=public --list-services
リストに http はあっても https はないはずです。
では、https サービスを public ゾーンに追加しましょう。firewall-cmd --add-service コマンドを使用して、public ゾーンを通過する https トラフィックを許可します。これにより、サーバーが外部ユーザーからの安全な接続を受け入れられるようになります。
ターミナルで以下のコマンドを実行して、https サービスを追加します。
sudo firewall-cmd --zone=public --add-service=https
このコマンドは、public ゾーンのランタイム設定を修正し、https サービスのルールを含めます。firewalld はルールの追加が成功したことを確認します。
success
再度サービスリストをチェックして、HTTPS サービスが追加されたことを確認しましょう。
sudo firewall-cmd --zone=public --list-services
出力に http と https の両方が表示され、ファイアウォールが両方のタイプの Web トラフィックを許可するように設定されたことが確認できます。
実用的な違いを確認するために、現在どのポートが開いているかを確認することもできます。
sudo firewall-cmd --zone=public --list-ports
sudo firewall-cmd --zone=public --list-services
--list-services コマンドはサービスを名前で表示しますが、http サービスがポート 80 に、https がポート 443 に対応していることがわかります。
これで、標準(http)とセキュア(https)の両方の Web トラフィックを許可するようにファイアウォールが設定されました。これは、機密情報を扱ったり安全な接続を必要としたりする Web サイトをホストする場合に一般的かつ必要なセットアップです。
public ゾーンに Web サービスが追加されたことの検証
このステップでは、http および https サービスが public ゾーンに正常に追加されたことを最終確認します。設定を変更した後は、期待通りに適用されているかを検証することが非常に重要なベストプラクティスです。これにより、ファイアウォールが目的の状態にあることが保証され、トラブルシューティングにも役立ちます。
特定のゾーンで現在許可されているすべてのサービスのリストを表示するには、firewall-cmd コマンドに --list-services オプションを付けて使用します。サービスを public ゾーンに追加したため、コマンドでそのゾーンを指定する必要があります。
ターミナルで以下のコマンドを実行し、public ゾーンのアクティブなサービスをリストアップします。
sudo firewall-cmd --list-services --zone=public
出力にはサービス名のリストが表示されます。このリストに http と https が含まれていること、および dhcpv6-client や ssh など、デフォルトで有効になっている可能性のある他のサービスが含まれていることを確認してください。
dhcpv6-client ssh http https
出力に http と https が表示されていれば、着信 Web トラフィックを許可するようにファイアウォールを正常に設定できたことになります。これで、システムは標準ポートとセキュアポートの両方で Web コンテンツを提供する準備が整いました。
firewall-cmd --help による利用可能なコマンドの探索
最後のステップでは、firewall-cmd の機能を自分で探索する方法を学びます。コマンドラインツールには多くのオプションや機能があることが多く、組み込みのドキュメントにアクセスする方法を知ることは、Linux ユーザーにとって非常に重要なスキルです。--help オプションは、コマンドの構文と利用可能なオプションの概要を素早く確認するための世界共通の方法です。
firewall-cmd で利用可能なすべてのコマンドとオプションを確認するには、ターミナルで以下を実行してください。このコマンドは情報を表示するだけなので、sudo は必要ありません。
firewall-cmd --help
このコマンドを実行すると、オプションの長いリストがターミナルに表示されます。上にスクロールして全体を確認できます。出力は次のように始まります。
Usage: firewall-cmd [OPTIONS...]
General Options
-h, --help Prints a short help text and exists
-V, --version Print the version string of firewalld
-q, --quiet Do not print status messages
Status Options
--state Get state of firewalld
--reload Reload firewall rules and keep state information
--complete-reload Reload firewall rules and lose state information
--runtime-to-permanent
Save runtime configuration to permanent
...
出力をじっくり見てみましょう。「Zone Options(ゾーンオプション)」、「Service Options(サービスオプション)」、「Port Options(ポートオプション)」などのセクションがあることがわかります。これは、新しい機能を発見したり、あまり使わないコマンドの構文を思い出したりするのに最適なリソースです。例えば、先ほど使用した --add-service コマンドの対になる --remove-service オプションなども確認できます。
おめでとうございます!これでこの実験は完了し、firewalld の基本操作を習得しました。ステータスの確認、ゾーンの管理、特定のトラフィックを許可するためのサービスの追加ができるようになりました。
まとめ
この実験では、Linux システム上で firewalld を管理および設定するための基本的な手順を、その影響を実証するハンズオンを通じて学びました。まず firewalld サービスがインストールされていることを確認し、systemctl コマンドを使用して起動、有効化、およびステータスの確認を行いました。また、アクティブなデフォルトゾーンを特定し、firewall-cmd を使用してそれを public に変更する方法を学び、ファイアウォールルールの明確なベースラインを確立しました。
この実験の大きなハイライトは、実際の Web サーバーを使用したファイアウォールの影響の実演でした。シンプルな Python HTTP サーバーをセットアップし、ファイアウォールルールがネットワークアクセスをどのように制御するかを直接体験しました。public ゾーンから http サービスを追加および削除することで、Web 接続への即時の影響を目の当たりにし、ファイアウォールルールという抽象的な概念を具体的かつ実用的なものとして理解しました。
この基礎の上に、http および https サービスを public ゾーンに追加することで、標準およびセキュアな Web トラフィックの両方を許可するようにファイアウォールを設定しました。さまざまな firewall-cmd オプションを使用して変更を検証する方法を学び、サービス名と対応するポート番号の関係を理解しました。最後に、firewall-cmd の包括的なヘルプドキュメントにアクセスする方法を発見し、高度な機能を自立して探索できる能力を身につけました。



