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 ファイアウォール構成
-
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
ゾーンにcockpit
、dhcpv6-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の形式を使用して指定する必要があります。ポート・タイプは、tcp
、udp
、sctp
または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
は、別のルールで許可したトラフィックを除くすべての受信トラフィックをブロックします。ソース・マシンには拒否が通知されます。 -
DROP
はREJECT
に似ていますが、拒否の通知はソース・マシンに送信されません。
ソースに基づいた受信トラフィックの管理
トラフィック・ソースに基づいて、ゾーンへの受信トラフィックを管理できます。次の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>