1 パケット・フィルタリング・ファイアウォールの構成

この章では、パケット・フィルタリングを使用してファイアウォールを構成するための概念、ツールおよび方法について説明します。また、システムでネットワークのセキュリティを適用するファイアウォール設定を表示する例も示します。

パケット・フィルタリング・ファイアウォールについて

ファイアウォールは、パケットのヘッダー情報に基づいて、受信および送信ネットワーク・パケットをフィルタ処理します。パケットを受け入れるか拒否するかを検出するパケット・フィルタ・ルールを作成します。ポートをブロックするルールを作成した場合、そのポートに対するリクエストはすべてファイアウォールでブロックされ、リクエストは無視されます。ブロックされたポートでリスニングしているサービスはすべて、事実上無効化されます。

Oracle LinuxカーネルはNetfilter機能を使用して、IPv4パケットとIPv6パケットにパケット・フィルタリング機能を提供します。

Netfilterは、次の2つのコンポーネントで構成されます。

  • netfilterカーネル・コンポーネント。カーネルがネットワーク・パケット・フィルタリングの制御に使用するルールのための、メモリー内の一連のテーブルで構成されます。

  • netfilterに格納される、ルールを作成、保守、および表示するためのユーティリティ。Oracle Linux 8では、デフォルトのファイアウォール・ユーティリティはfirewalldパッケージで提供されるfirewall-cmdです。

firewalldベースのファイアウォールには次の利点があります。

  • firewalld-cmdユーティリティは、ファイアウォールを再起動せず、確立されたTCP接続を中断しません。

  • firewalldはダイナミック・ゾーンをサポートしており、異なる信頼レベルでネットワークに接続できるラップトップなど、システムに対して異なるファイアウォール・ルール・セットを実装できます。ただし、この機能は通常、サーバー・システムでは使用されません。

  • firewalldは、ファイアウォール構成に応じて複数のサービスとの統合をより適切にできるD-Busをサポートしています。

ファイアウォールの構成ツール

次のいずれかのツールを使用して、ファイアウォールを構成できます。

  • firewall-cmdコマンドとその複数のオプションを使用。

  • ファイアウォール構成GUIを使用

    このツールを使用するには、firewall-configパッケージを最初にインストールしてから、パッケージ名と同じコマンドを使用して起動する必要があります。次に例を示します。

    sudo dnf install firewall-config
    sudo firewall-config &

    このコマンドにより、次の図に示されるように構成ツールが開きます。

    図1-1 ファイアウォール構成


    この図は、ファイアウォール構成GUIを示しています。
  • Cockpitは、ファイアウォール構成を実行するためにも使用できるブラウザベースの構成ツールです。 Oracle Linux: Cockpit Webコンソールの使用を参照してください。

ファイアウォール・サービスの制御

Oracle Linux 8では、ファイアウォール・サービスfirewalldはデフォルトで有効になっています。このサービスは、systemctlコマンドによって制御されます。

サービスを起動するには:

sudo systemctl unmask firewalld
sudo systemctl start firewalld

システムの起動時にサービスが自動的に起動されるようにするには、ファイアウォールの起動後に次のコマンドを実行します。

sudo systemctl enable firewalld

ファイアウォール・サービスを停止して、システムの起動時に自動的に起動しないようにするには、次のコマンドを実行します。

sudo systemctl stop firewalld
sudo systemctl disable firewalld

ファイアウォール・サービスが他のサービスまたはfirewalld D-Busインタフェースを介して起動されないようにするには、ファイアウォールを無効にしてから次のコマンドを実行します。

sudo systemctl mask firewalld

ファイアウォール・サービスの現在のステータスを表示するには:

sudo systemctl status firewalld
firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
   Active: active (running) since Wed 2022-04-20 18:33:59 BST; 2 weeks 5 days ago
     Docs: man:firewalld(1)
 Main PID: 4261 (firewalld)
    Tasks: 3 (limit: 99538)
   Memory: 4.7M
   CGroup: /system.slice/firewalld.service
           └─4261 /usr/libexec/platform-python -s /usr/sbin/firewalld --nofork --nopid

ゾーンおよびサービスについて

ファイアウォールのセキュリティは、ゾーンとサービスの概念によって実装されます。

ゾーンは、ネットワーク・アクセスの信頼レベルに対応するフィルタリング・ルールの事前定義済セットです。ゾーンの設定を再構成してゾーンのデフォルトのフィルタリング・ルールに追加し、ゾーンのトラフィック・フローの制御を調整できます。Oracle Linuxをインストールすると、publicというデフォルト・ゾーンがシステムに自動的に割り当てられます。

ファイアウォール・ルールは、ゾーンに割り当てられているサービスを介して適用されます。サービス・ポートはネットワーク・トラフィックのアクセス・ポイントです。ゾーンに割り当てられたサービスは、ネットワーク・パケットを受信して送信するためのポートを自動的に開いています。

ゾーンおよびファイアウォール関連サービスの詳細は、firewalld.zone(5)およびfirewalld.service(5)のマニュアル・ページを参照してください。

ゾーンに関する情報の表示

ゾーンのファイアウォールを構成する場合、構成ステップの一部として現在のゾーンとサービス設定およびその他の情報を表示することをお薦めします。このアプローチでは、ファイアウォールに導入している変更を監視し、変更が無効になる可能性のあるエラーを特定できます。

システムのデフォルト・ゾーンを表示するには、次のコマンドを実行します。

sudo firewall-cmd --get-default

インストールに含まれるすべての定義済ゾーンを次のように一覧表示します。

sudo firewall-cmd --get-zones
block dmz drop external home internal public trusted work

リスト内の任意のゾーンを構成できます。特定のゾーンの設定を変更すると、そのゾーンがアクティブ・ゾーンになります。アクティブなゾーンを指定するには、次のように入力します。

sudo firewall-cmd --get-active-zone

ノート:

デフォルトでは、すべての構成がデフォルト・ゾーンに実装されます。また、アクティブなゾーンが必ずしもデフォルトのゾーンではないことに注意してください。そのため、コマンド内でゾーン名を指定して、その特定のゾーンの設定を定義する必要があります。それ以外の場合、定義はデフォルト・ゾーンに適用されます。

ゾーン設定の表示

ゾーンの設定を取得するには:

sudo firewall-cmd --list-all [--zone=zonename]

ゾーンを指定しない場合、このコマンドはデフォルト・ゾーンの設定を表示します。したがって、workゾーンの設定をリストするには、次のコマンドを使用します。

sudo firewall-cmd --list-all --zone=work
work
  target: default
  icmp-block-inversion: no
  interfaces: 
  sources: 
  services: cockpit dhcpv6-client ssh
  ports: 
  protocols: 
  forward: yes
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

firewalldゾーンの構成

次のタスクでは、firewall-cmdコマンドを使用してゾーンのファイアウォール・ルールを構成する方法について説明します。ルールは、firewalld/etc/firewalld階層に記録されます。

ファイアウォールを構成することは、仕様に従ってファイアウォールがネットワーク・トラフィックを制御できるように、ゾーン設定のすべてまたは一部を特定の値に設定することを意味します。

サービスへのアクセスの制御

ゾーンのservicesの設定が、ファイアウォールを構成する最も簡単な方法です。各ゾーンには、事前定義されたサービスが割り当てられています。この設定をさらに構成するには、ゾーンにサービスを追加するか、ゾーンからサービスを削除します。

事前定義済サービスを一覧表示するには、firewall-cmd --list-servicesコマンドを使用します。

たとえば、次のコマンドは、workゾーンにcockpitdhcpv6-clientおよびsshサービスが割り当てられていることを示しています。

sudo firewall-cmd --list-services --zone=work
cockpit dhcpv6-client ssh

新しいサービスへのアクセスを開くには、--add-service serviceオプションを使用します。オプションで、--permanentオプションを含めるとリブート後もルールを永続化できます。

たとえば、HTTPおよびNFSサービスをworkゾーンに追加するには、次のコマンドを使用します。

sudo firewall-cmd --permanent --zone=work --add-service=http --add-service=nfs
sudo firewall-cmd --list-services --zone=work
cockpit dhcpv6-client ssh http nfs

サービスへのアクセスを削除するには、--remove-service serviceオプションを使用します。

sudo firewall-cmd --permanent --zone=work --remove-service=cockpit
sudo firewall-cmd --list-services --zone=work 
dhcpv6-client ssh http nfs

ポートへのアクセスの制御

ゾーンのサービス経由のネットワーク・トラフィックは、それらのサービスのポートを使用します。トラフィックを受け入れるには、ポートを開く必要があります。ポート番号および関連するプロトコルを指定することで、ネットワーク・アクセス用にさらに多くのポートを開くことができます。

--list-portsオプションは、明示的にアクセスを許可したポートおよび関連するプロトコルを一覧表示します。ただし、サービスとして開かれているポートは、このコマンドの出力には含まれません。したがって、ポートを一覧表示する場合は、--list-allオプションを使用してより詳細な情報を取得することをお薦めします。

特定のポートへのアクセスを許可するには、--add-portオプションを使用します。ポートは、port-number/port-typeの形式を使用して指定する必要があります。ポート・タイプは、tcpudpsctpまたはdccpです。タイプとネットワーク・トラフィックが一致していることを確認します。次に例を示します。

sudo firewall-cmd --permanent --zone=work --add-port=5353/udp --add-port=3689/tcp
sudo firewall-cmd --list-all --zone=work 
work
  target: default
  icmp-clock-inversion: no
  interfaces:
  sources:
  services: dhcpv6-client ssh http nfs 
  ports: 5353/udp 3689/tcp
...

同様に、--remove-portオプションでポートへのアクセスを削除できます。変更を永続化するには、忘れずに--permanentオプションを使用してください。

詳細は、firewall-cmd(1)マニュアル・ページを参照してください。

ゾーンへのネットワーク・インタフェースの割当て

システムのネットワーク・インタフェースは、デフォルト・ゾーンに自動的に割り当てられます。Oracle Linuxでは、複数のゾーンを特定のサービスやポートなどで構成できます。次に、そのゾーンにインタフェースを割り当てることで、特定のゾーンのルールをアクティブにして操作できるようにします。したがって、ネットワーク・インタフェースを再割当てにより、システム上でアクティブになっているファイアウォール・ルールを簡単に変更できます。

workゾーンのファイアウォール構成をアクティブ化するとします。次のように、ゾーンにインタフェースを割り当てます。

sudo firewall-cmd --zone=work --change-interface=enp0s1
sudo firewall-cmd --get-active-zone
work
  interfaces: enp0s1

ノート:

リブート後も設定を永続化させるために--permanentオプションを使用する必要はありません。デフォルト・ゾーンの変更の説明に従ってゾーンをデフォルト・ゾーンとして設定すると、インタフェースの再割当ては永続的になります。

デフォルト・ゾーンの変更

システムのデフォルト・ゾーンは次のように変更できます。

sudo firewall-cmd --set-default-zone=work

変更が適用されていることを確認することもできます。

sudo firewall-cmd --get-default-zone

構成全体および最終結果を表示するには:

sudo firewall-cmd --zone=work --list-all
work (active)
  target: default
  interfaces:  enp0s1
  sources:
  services: dhcpv6-client ssh http nfs
  ports: 5353/udp 3689/tcp
...

受信トラフィックを制御するためのデフォルト・ルールの設定

target設定は、受信トラフィックを管理するときにファイアウォールのデフォルトの動作を設定します。このゾーン設定は、すべての事前定義済ゾーンに対してdefaultに自動的に構成されます。ゾーンのデフォルトの動作を変更するには、次のコマンドを使用します。

sudo firewall-cmd --zone=zone-name --set-target=ACCEPT|REJECT|DROP

次のオプションを指定できます。

  • ACCEPTは、別のルールで拒否するように設定したトラフィックを除くすべての受信トラフィックを受け入れます。

  • REJECTは、別のルールで許可したトラフィックを除くすべての受信トラフィックをブロックします。ソース・マシンには拒否が通知されます。

  • DROPREJECTに似ていますが、拒否の通知はソース・マシンに送信されません。

ソースに基づいた受信トラフィックの管理

トラフィック・ソースに基づいて、ゾーンへの受信トラフィックを管理できます。次の2つのゾーン設定では、パケットの発信元を指定できます。

  • sourceは、送信ノードまたはネットワークを指定します。

  • source-portsは、トラフィックの発生元ポートを指定します。

送信ノードからの受信トラフィックを受け入れるには、次のコマンドを使用します。

sudo firewall-cmd --zone=zone-name --add-source=IP-address                  

IPアドレスには、192.0.2.0/24などのCIDR表記のネットマスクを含めることができます。

次のコマンドを実行して、現在のランタイム・ルールセットを永続ルールセットに変換します:

sudo firewall-cmd --runtime-to-permanent

システムをリブートした場合に削除される一時構成を設定する場合は、このコマンドを省略します。

次のような構文は、source-port設定の設定に使用されます。ただし、送信ポート番号とプロトコル・タイプを指定して、ソース・ポートを識別します。次に例を示します。

sudo firewall-cmd --zone=zone-name --add-source-ports=port-number/tcp|udp|sctp|dccp

異なる設定を組み合せてファイアウォールを構成できます。次の例に示されているように、192.0.2.0ネットワーク・ソースからのHTTPトラフィックを受け入れるようにtrustedゾーンを構成できます。

sudo firewall-cmd --zone=trusted --add-source=192.0.2.0/24
sudo firewall-cmd --zone=trusted --add-service=http
sudo firewall-cmd --zone=trusted --list-all
trusted (active)
  target: ACCEPT
  sources: 192.0.2.0/24
  services: http

ファイアウォール実装用のカスタマイズされたゾーンの作成

ゾーンを作成し、カスタマイズされたファイアウォール保護のためにゾーンの設定を構成できます。

firewall-cmdコマンドの使用

次の例に示されているように、firewall-cmd CLIを使用して空のゾーンを作成できます。これは、デフォルトのサービスは割り当てられていないことを意味します。カスタマイズされたゾーンを構成するときは、常に--permanentオプションをコマンドに含める必要があります。それ以外の場合、エラーメッセージが生成されます。

sudo firewall-cmd --permanent --new-zone=testzone
sudo firewall-cmd --permanent --get-zones
block dmz drop external home internal testzone public trusted work
sudo firewall-cmd --permanent --info-zone=testzone
testzone
  target: default
  icmp-block-inversion: no
  interfaces:
  sources:
  services:
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

--permanentオプションを指定しない場合、--get-zonesオプションでは作成されたゾーンが表示されません。

--info-zone=zone-nameオプションでは、--list-allオプションと同じ出力が生成されます。

このゾーンの作成を永続的にするには、次のコマンドを追加します。

sudo firewall-cmd --runtime-to-permanent

ゾーンの作成後、前述の例で提供されているコマンド・オプションを使用して、サービス、ポートの追加、インタフェースの割当てなどを実行できます。

sudo firewall-cmd --zone=testzone --add-service=http
Error: INVALID ZONE: testzone
sudo firewall-cmd --permanent --zone=testzone --add-service=http

これらのコマンドを使用する場合は、必ず--permanentオプションを使用してください。

ゾーン構成ファイルの使用

すべてのゾーンには、対応する構成ファイルがあります。オペレーティング・システムとともにインストールされる事前定義済ゾーンの場合、構成ファイルは/usr/lib/firewalld/zonesディレクトリにあります。

事前定義済ゾーンを構成すると、構成ファイルが/etc/firewalld/zonesディレクトリにコピーされ、変更はその場所に格納されます。構成ファイルを使用して新しいゾーンを作成する場合は、作業ディレクトリとして/etc/firewalld/zonesも使用する必要があります。

事前定義済ゾーンの設定とわずかな違いしかないゾーンを作成する場合は、既存の構成ファイルを作業ディレクトリにコピーするのが最も簡単です。次のコマンドのいずれかを使用できます。

sudo cp /etc/firewalld/zones/existing-conf-file.xml new-zone.xml
sudo cp /usr/lib/firewalld/zones/existing-conf-file.xml /etc/firewalld/zones/new-zone.xml

次に、テキスト・エディタを使用して、新しい構成ファイルの設定を変更します。次の例は、testzoneの構成ファイルに何が含まれるかを示しています。testzoneは、1つのサービス(SSH)のトラフィックと、TCPおよびUDPプロトコル用の1つのポート範囲を受け入れます。

<?xml version="1.0" encoding="utf-8"?>
<zone>
  <short>testzone</short>
  <description>Put description here</description>
    <service name="ssh"/>
    <port port="1025-65535" protocol="tcp"/>
    <port port="1025-65535" protocol="udp"/>
</zone>