ファイアウォールおよびパケットフィルターの設定


Red Hat Enterprise Linux 10

firewalld サービス、nftables フレームワーク、および XDP パケットフィルタリング機能の管理

概要

ファイアウォールなどのパケットフィルターは、ルールを使用して、着信、発信、および転送されるネットワークトラフィックを制御します。Red Hat Enterprise Linux (RHEL) では、firewalld サービスと nftables フレームワークを使用して、ネットワークトラフィックをフィルタリングし、パフォーマンスが重要なファイアウォールを構築できます。カーネルの Express Data Path (XDP) 機能を使用して、ネットワークインターフェイスでネットワークパケットを非常に高速に処理またはドロップすることもできます。

Red Hat ドキュメントへのフィードバック (英語のみ)

Red Hat は質の高いドキュメントを提供することに尽力しており、皆様からのフィードバックを大切にしています。改善にご協力いただくため、Red Hat Jira トラッキングシステムを通じてご提案やエラー報告をお寄せください。

手順

  1. Jira の Web サイトにログインします。

    アカウントがない場合、アカウント作成オプションを選択します。

  2. 上部のナビゲーションバーで Create をクリックします。
  3. Summary フィールドにわかりやすいタイトルを入力します。
  4. Description フィールドに、ドキュメントの改善に関するご意見を記入してください。ドキュメントの該当部分へのリンクも追加してください。
  5. ウィンドウ下部の Create をクリックします。

第1章 firewalld の使用および設定

ファイアウォールは、外部からの不要なトラフィックからマシンを保護する方法です。管理者はファイアウォールを使用して、一連の ファイアウォールルールを 定義することにより、ホストマシンへの受信ネットワークトラフィックを制御します。このようなルールは、着信トラフィックを分類して、拒否または許可するために使用されます。

firewalld は、D-Bus インターフェイスを使用して、動的にカスタマイズできるファイアウォールを提供するファイアウォールサービスデーモンです。この動的なアーキテクチャーにより、管理者は変更のたびにサービスを再起動することなく、ルールを作成、変更、削除できます。

firewalld を使用して、一般的なケースの大部分で必要なパケットフィルタリングを設定できます。firewalld がシナリオをカバーしていない場合、またはルールを完全に制御したい場合は、nftables フレームワークを使用します。

firewalld は、ゾーン、ポリシー、サービスの概念を使用してトラフィック管理を単純化します。ゾーンはネットワークを論理的に分離します。ネットワークインターフェイスおよびソースをゾーンに割り当てることができます。ポリシーは、ゾーン間のトラフィックの流れを拒否または許可するために使用されます。ファイアウォールサービスは、特定のサービスに着信トラフィックを許可するのに必要なすべての設定を扱う事前定義のルールで、ゾーンに適用されます。

サービスは、ネットワーク接続に 1 つ以上のポートまたはアドレスを使用します。ファイアウォールは、ポートに基づいて接続のフィルターを設定します。サービスに対してネットワークトラフィックを許可するには、そのポートを解放する必要があります。firewalld は、明示的に解放されていないポートのトラフィックをすべてブロックします。trusted などのゾーンでは、デフォルトですべてのトラフィックを許可します。

firewalld は、ランタイム設定と永続設定を別々に維持します。そのため、ランタイムのみの変更が可能です。ランタイム設定は、firewalld の再読み込みまたは再起動後は保持されません。起動時に、永続的な設定から入力されます。

1.1. ファイアウォールゾーン

firewalld ユーティリティーを使用すると、ネットワーク内のインターフェイスおよびトラフィックに対する信頼レベルに応じて、ネットワークをさまざまなゾーンに分離できます。接続は 1 つのゾーンにしか指定できませんが、そのゾーンは多くのネットワーク接続に使用できます。

firewalld はゾーンに関して厳格な原則に従います。

  1. トラフィックは 1 つのゾーンのみに流入します。
  2. トラフィックは 1 つのゾーンのみから流出します。
  3. ゾーンは信頼のレベルを定義します。
  4. ゾーン内トラフィック (同じゾーン内) はデフォルトで許可されます。
  5. ゾーン間トラフィック (ゾーンからゾーン) はデフォルトで拒否されます。

原則 4 と 5 は原則 3 の結果です。

原則 4 は、ゾーンオプション --remove-forward を使用して設定できます。原則 5 は、新しいポリシーを追加することで設定できます。

NetworkManager は、firewalld にインターフェイスのゾーンを通知します。次のユーティリティーを使用して、ゾーンをインターフェイスに割り当てることができます。

  • NetworkManager
  • firewall-config ユーティリティー
  • firewall-cmd ユーティリティー
  • RHEL Web コンソール

RHEL Web コンソール、firewall-config、および firewall-cmd では、適切な NetworkManager 設定ファイルのみを編集できます。Web コンソール、firewall-cmd、または firewall-config を使用してインターフェイスのゾーンを変更した場合、その要求は NetworkManager に転送され、firewalld では処理されません。

/usr/lib/firewalld/zones/ ディレクトリーには事前定義されたゾーンが保存されており、利用可能なネットワークインターフェイスに即座に適用できます。このファイルは、修正しないと /etc/firewalld/zones/ ディレクトリーにコピーされません。事前定義されたゾーンのデフォルト設定は次のとおりです。

block
  • 適している対象: IPv4 の場合は icmp-host-prohibited メッセージ、IPv6 の場合は icmp6-adm-prohibited メッセージで、すべての着信ネットワーク接続を拒否する場合。
  • 受け入れる接続: システム内から開始したネットワーク接続のみ。
dmz
  • 適している対象: パブリックにアクセス可能で、内部ネットワークへのアクセスが制限されている DMZ 内のコンピューター。
  • 受け入れる接続: 選択した着信接続のみ。
drop

適している対象: 着信ネットワークパケットを通知なしで破棄する場合。

  • 受け入れる接続: 発信ネットワーク接続のみ。
external
  • 適している対象: マスカレードをルーター用に特別に有効にした外部ネットワーク。ネットワーク上の他のコンピューターを信頼できない状況。
  • 受け入れる接続: 選択した着信接続のみ。
home
  • 適している対象: ネットワーク上の他のコンピューターをほぼ信頼できる自宅の環境。
  • 受け入れる接続: 選択した着信接続のみ。
internal
  • 適している対象: ネットワーク上の他のコンピューターをほぼ信頼できる内部ネットワーク。
  • 受け入れる接続: 選択した着信接続のみ。
public
  • 適している対象: ネットワーク上の他のコンピューターを信頼できないパブリックエリア。
  • 受け入れる接続: 選択した着信接続のみ。
trusted
  • 受け入れる接続: すべてのネットワーク接続。
work

適している対象: ネットワーク上の他のコンピューターをほぼ信頼できる職場の環境。

  • 受け入れる接続: 選択した着信接続のみ。

このゾーンのいずれかを デフォルト ゾーンに設定できます。インターフェイス接続を NetworkManager に追加すると、デフォルトゾーンに割り当てられます。インストール時は、firewalld のデフォルトゾーンは public ゾーンです。デフォルトゾーンは変更できます。

注記

ユーザーがすぐに理解できるように、ネットワークゾーン名は分かりやすい名前にしてください。

セキュリティー問題を回避するために、ニーズおよびリスク評価に合わせて、デフォルトゾーンの設定の見直しを行ったり、不要なサービスを無効にしてください。

詳細は、システム上の firewalld.zone(5) man ページを参照してください。

1.2. ファイアウォールポリシー

ファイアウォールポリシーは、ネットワークに必要なセキュリティー状態を指定します。これらのポリシーは、さまざまなタイプのトラフィックに対して実行するルールとアクションの概要を示します。

通常、ポリシーには次のタイプのトラフィックに対するルールが含まれます。

  • 着信トラフィック
  • 送信トラフィック
  • 転送トラフィック
  • 特定のサービスとアプリケーション
  • ネットワークアドレス変換 (NAT)

ファイアウォールポリシーは、ファイアウォールゾーンの概念を使用します。各ゾーンは、許可するトラフィックを決定する特定のファイアウォールルールのセットに関連付けられます。ポリシーは、ステートフルかつ一方向にファイアウォールルールを適用します。つまり、トラフィックの一方向のみを考慮します。firewalld のステートフルフィルタリングにより、トラフィックのリターンパスは暗黙的に許可されます。

ポリシーは、イングレスゾーンとエグレスゾーンに関連付けられます。イングレスゾーンは、トラフィックが発生する (受信される) 場所です。エグレスゾーンは、トラフィックが出る (送信される) 場所です。

ポリシーで定義されたファイアウォールのルールは、ファイアウォールゾーンを参照して、複数のネットワークインターフェイス全体に一貫した設定を適用できます。

1.3. ファイアウォールのルール

ファイアウォールのルールを使用して、ネットワークトラフィックを許可またはブロックする特定の設定を実装できます。その結果、ネットワークトラフィックのフローを制御して、システムをセキュリティーの脅威から保護できます。

ファイアウォールのルールは通常、さまざまな属性に基づいて特定の基準を定義します。属性は次のとおりです。

  • ソース IP アドレス
  • 宛先 IP アドレス
  • 転送プロトコル (TCP、UDP、…)
  • ポート
  • ネットワークインターフェイス

firewalld ユーティリティーは、ファイアウォールのルールをゾーン (publicinternal など) とポリシーに整理します。各ゾーンには、特定のゾーンに関連付けられたネットワークインターフェイスのトラフィック自由度のレベルを決定する独自のルールセットがあります。

1.4. ファイアウォールの直接ルール

firewalld サービスは、通常のルールや直接ルールなど、複数のルール設定方法を提供します。

これらの違いの 1 つは、それぞれの方法において基盤となるバックエンド (iptables または nftables) とどのように対話するかです。

直接ルールは、iptables との直接的なやり取りを可能にする高度な低レベルのルールです。しかし、iptables コンポーネントはメンテナンスされておらず、将来の RHEL のメジャーバージョンから削除される予定です。したがって、firewalld の直接ルールを nftables に置き換えます。

1.5. 事前定義済みの firewalld サービス

事前定義済みの firewalld サービスは、低レベルのファイアウォールルールに対する抽象化レイヤーを提供します。これらのサービスは、SSH や HTTP などの一般的なネットワークサービスを、特定のポートとプロトコルにマッピングします。これにより、手動での設定ではなく名前付きのサービスを使用して、ファイアウォールの管理を簡素化し、ミスを削減できます。

  • 利用可能な定義済みサービスを表示するには、以下を実行します。

    # firewall-cmd --get-services
    RH-Satellite-6 RH-Satellite-6-capsule afp amanda-client amanda-k5-client amqp amqps apcupsd audit ausweisapp2 bacula bacula-client bareos-director bareos-filedaemon bareos-storage bb bgp bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc bittorrent-lsd ceph ceph-exporter ceph-mon cfengine checkmk-agent cockpit collectd condor-collector cratedb ctdb dds...
  • 特定の定義済みサービスをさらに調査するには、以下を実行します。

    # sudo firewall-cmd --info-service=RH-Satellite-6
    RH-Satellite-6
      ports: 5000/tcp 5646-5647/tcp 5671/tcp 8000/tcp 8080/tcp 9090/tcp
      protocols:
      source-ports:
      modules:
      destination:
      includes: foreman
      helpers:

    出力例では、RH-Satellite-6 定義済みサービスがポート 5000/tcp、5646-5647/tcp、5671/tcp、8000/tcp、8080/tcp、9090/tcp をリッスンしていることが示されています。さらに、RH-Satellite-6 は別の定義済みサービスからルールを継承します。この場合は foreman です。

定義済みの各サービスは、/usr/lib/firewalld/services/ ディレクトリーに同じ名前の XML ファイルとして保存されます。

1.6. ファイアウォールゾーンでの作業

ゾーンは、着信トラフィックをより透過的に管理する概念を表しています。ネットワークインターフェイスと送信元アドレスはゾーンに割り当てられます。各ゾーンごとにファイアウォールルールを個別に管理できるため、複雑なファイアウォール設定を定義し、それをトラフィックに適用することができます。

1.6.1. デフォルトゾーンの変更

特定のゾーンに割り当てられないインターフェイスは、デフォルトゾーンに割り当てられます。firewalld サービスを再起動するたびに、firewalld は、デフォルトゾーンの設定を読み込み、それをアクティブにします。他のすべてのゾーンに関する設定は保持されており、すぐに使用できる状態になっています。

通常、ゾーンは NetworkManager により、NetworkManager 接続プロファイルの connection.zone 設定に従って、インターフェイスに割り当てられます。また、再起動後、NetworkManager はこれらのゾーンを "アクティブ化" するための割り当てを管理します。

前提条件

  • firewalld サービスが実行中である。

手順

  1. 現在のデフォルトゾーンを表示します。

    # firewall-cmd --get-default-zone
  2. 新しいデフォルトゾーンを設定します。

    # firewall-cmd --set-default-zone <zone_name>
    注記

    この手順では、--permanent オプションを使用しなくても、設定は永続化します。

1.6.2. 新しいゾーンの作成

カスタムゾーンを使用するには、新しいゾーンを作成したり、事前定義したゾーンなどを使用したりします。新しいゾーンには --permanent オプションが必要となり、このオプションがなければコマンドは動作しません。

前提条件

  • firewalld サービスが実行中である。

手順

  1. 新しいゾーンを作成します。

    # firewall-cmd --permanent --new-zone=zone-name
  2. 新しいゾーンを使用可能にします。

    # firewall-cmd --reload

    このコマンドは、すでに実行中のネットワークサービスを中断することなく、最近の変更をファイアウォール設定に適用します。

検証

  • 作成したゾーンが永続設定に追加されたかどうかを確認します。

    # firewall-cmd --get-zones --permanent

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

複数のゾーンに複数のルールセットを定義して、使用されているインターフェイスのゾーンを変更することで、迅速に設定を変更できます。各インターフェイスに特定のゾーンを設定して、そのゾーンを通過するトラフィックを設定できます。

手順

  1. アクティブゾーン、およびそのゾーンに割り当てられているインターフェイスをリスト表示します。

    # firewall-cmd --get-active-zones
  2. 別のゾーンにインターフェイスを割り当てます。

    # firewall-cmd --zone=zone_name --change-interface=interface_name --permanent

1.6.4. ソースの追加

着信トラフィックを特定のゾーンに転送する場合は、そのゾーンにソースを追加します。ソースは、CIDR (Classless Inter-domain Routing) 表記法の IP アドレスまたは IP マスクになります。

注記

ネットワーク範囲が重複している複数のゾーンを追加する場合は、ゾーン名で順序付けされ、最初のゾーンのみが考慮されます。

  • 現在のゾーンにソースを設定するには、次のコマンドを実行します。

    # firewall-cmd --add-source=<source>
  • 特定ゾーンのソース IP アドレスを設定するには、次のコマンドを実行します。

    # firewall-cmd --zone=zone-name --add-source=<source>

次の手順では、trusted ゾーン内の 192.168.2.15 からの着信トラフィックをすべて許可します。

手順

  1. 利用可能なすべてのゾーンをリストします。

    # firewall-cmd --get-zones
  2. 永続化モードで、信頼ゾーンにソース IP を追加します。

    # firewall-cmd --zone=trusted --add-source=192.168.2.15
  3. 新しい設定を永続化します。

    # firewall-cmd --runtime-to-permanent

1.6.5. ソースの削除

firewalld ゾーンからソースを削除すると、そのソースからのトラフィックが、そのソース用のルールによって制御されなくなります。代わりに、そのトラフィックには、インターフェイスが属するゾーンまたはデフォルトゾーンのルールが適用されます。

手順

  1. 必要なゾーンに対して許可されているソースのリストを表示します。

    # firewall-cmd --zone=zone-name --list-sources
  2. ゾーンからソースを永続的に削除します。

    # firewall-cmd --zone=zone-name --remove-source=<source>
  3. 新しい設定を永続化します。

    # firewall-cmd --runtime-to-permanent

1.6.6. nmcli を使用した接続へのゾーンの割り当て

nmcli ユーティリティーを使用して、firewalld ゾーンを NetworkManager 接続に追加できます。

手順

  1. ゾーンを NetworkManager 接続プロファイルに割り当てます。

    # nmcli connection modify profile connection.zone zone_name
  2. 接続をアクティベートします。

    # nmcli connection up profile

1.6.7. 着信トラフィックにデフォルトの動作を設定するゾーンターゲットの使用

すべてのゾーンに対して、特に指定されていない着信トラフィックを処理するデフォルト動作を設定できます。そのような動作は、ゾーンのターゲットを設定することで定義されます。

4 つのオプションがあります。

  • ACCEPT: 指定したルールで許可されていないパケットを除いた、すべての着信パケットを許可します。
  • REJECT: 指定したルールで許可されているパケット以外の着信パケットをすべて拒否します。firewalld がパケットを拒否すると、送信元マシンに拒否が通知されます。
  • DROP: 指定したルールで許可されているパケット以外の着信パケットをすべて破棄します。firewalld がパケットを破棄すると、ソースマシンにパケット破棄の通知がされません。
  • default: REJECT と同じですが、Internet Control Message Protocol (ICMP) を暗黙的に許可します。

前提条件

  • firewalld サービスが実行中である。

手順

  1. 特定ゾーンに対する情報をリスト表示して、デフォルトゾーンを確認します。

    # firewall-cmd --zone=zone-name --list-all
  2. ゾーンに新しいターゲットを設定します。

    # firewall-cmd --permanent --zone=zone-name --set-target=<default|ACCEPT|REJECT|DROP>

ネットワークのセキュリティーを強化するには、firewalld 設定を変更し、特定のネットワークインターフェイスまたは接続を、特定のファイアウォールゾーンに関連付けます。ゾーンに対して詳細なルールを定義することで、セキュリティーのニーズに応じて、受信トラフィックと送信トラフィックを制御できます。

たとえば、次のような利点が得られます。

  • 機密データの保護
  • 不正アクセスの防止
  • 潜在的なネットワーク脅威の軽減

前提条件

  • firewalld サービスが実行中である。

手順

  1. 利用可能なファイアウォールゾーンをリスト表示します。

    # firewall-cmd --get-zones

    firewall-cmd --get-zones コマンドは、システムで利用可能なすべてのゾーンを表示し、特定のゾーンの詳細は表示しません。すべてのゾーンの詳細情報を表示するには、firewall-cmd --list-all-zones コマンドを使用します。

  2. この設定に使用するゾーンを選択します。
  3. 選択したゾーンのファイアウォール設定を変更します。たとえば、SSH サービスを許可し、ftp サービスを削除するには、次のようにします。

    # firewall-cmd --add-service=ssh --zone=<your_chosen_zone>
    # firewall-cmd --remove-service=ftp --zone=<same_chosen_zone>
  4. ネットワークインターフェイスをファイアウォールゾーンに割り当てます。

    1. 使用可能なネットワークインターフェイスをリスト表示します。

      # firewall-cmd --get-active-zones

      ゾーンがアクティブかどうかは、その設定と一致するネットワークインターフェイスまたはソースアドレス範囲の存在によって決定します。デフォルトゾーンは、未分類のトラフィックに対してアクティブですが、ルールに一致するトラフィックがない場合は常にアクティブになるわけではありません。

    2. 選択したゾーンにネットワークインターフェイスを割り当てます。

      # firewall-cmd --zone=<your_chosen_zone> --change-interface=<interface_name> --permanent

      ネットワークインターフェイスをゾーンに割り当てることは、特定のインターフェイス (物理または仮想) 上のすべてのトラフィックに一貫したファイアウォール設定を適用する場合に適しています。

      firewall-cmd コマンドを --permanent オプションとともに使用すると、多くの場合、NetworkManager 接続プロファイルが更新され、ファイアウォール設定に対する変更が永続化します。この firewalld と NetworkManager の統合により、ネットワークとファイアウォールの設定に一貫性が確保されます。

検証

  1. 選択したゾーンの更新後の設定を表示します。

    # firewall-cmd --zone=<your_chosen_zone> --list-all

    コマンド出力には、割り当てられたサービス、ネットワークインターフェイス、ネットワーク接続 (ソース) を含むすべてのゾーン設定が表示されます。

1.6.9. IP セットを使用した許可リストの動的更新の設定

ほぼリアルタイムで更新を行うことで、予測不可能な状況でも IP セット内の特定の IP アドレスまたは IP アドレス範囲を柔軟に許可できます。

これらの更新は、セキュリティー脅威の検出やネットワーク動作の変化など、さまざまなイベントによってトリガーされます。通常、このようなソリューションでは自動化を活用して手動処理を減らし、素早く状況に対応することでセキュリティーを向上させます。

前提条件

  • firewalld サービスが実行中である。

手順

  1. 分かりやすい名前で IP セットを作成します。

    # firewall-cmd --permanent --new-ipset=allowlist --type=hash:ip

    この allowlist という新しい IP セットには、ファイアウォールで許可する IP アドレスが含まれています。

  2. IP セットに動的更新を追加します。

    # firewall-cmd --permanent --ipset=allowlist --add-entry=198.51.100.10

    この設定により、新しく追加した、ネットワークトラフィックを渡すことがファイアウォールにより許可される IP アドレスで、allowlist の IP セットが更新されます。

  3. 先に作成した IP セットを参照するファイアウォールのルールを作成します。

    # firewall-cmd --permanent --zone=public --add-source=ipset:allowlist

    このルールがない場合、IP アドレスの設定はネットワークトラフィックに何の影響も与えず、デフォルトのファイアウォールポリシーが優先されます。

  4. ファイアウォール設定をリロードして、変更を適用します。

    # firewall-cmd --reload

検証

  1. すべての IP セットをリスト表示します。

    # firewall-cmd --get-ipsets
    allowlist
  2. アクティブなルールをリスト表示します。

    # firewall-cmd --list-all
    public (active)
      target: default
      icmp-block-inversion: no
      interfaces: enp0s1
      sources: ipset:allowlist
      services: cockpit dhcpv6-client ssh
      ports:
      protocols:
      ...

    コマンドライン出力の sources セクションでは、どのトラフィックの発信元 (ホスト名、インターフェイス、IP セット、サブネットなど) が、特定のファイアウォールゾーンへのアクセスを許可または拒否されているかについて洞察が得られます。上記の場合、allowlist IP セットに含まれる IP アドレスが、public ゾーンのファイアウォールを通してトラフィックを渡すことが許可されています。

  3. IP セットの内容を調べます。

    # cat /etc/firewalld/ipsets/allowlist.xml
    <?xml version="1.0" encoding="utf-8"?>
    <ipset type="hash:ip">
      <entry>198.51.100.10</entry>
    </ipset>

次のステップ

  • スクリプトまたはセキュリティーユーティリティーを使用して脅威インテリジェンスのフィードを取得し、それに応じて allowlist を自動的に更新します。

1.6.10. Web コンソールを使用したゾーンの有効化

RHEL 10 Web コンソールを使用して、事前定義された既存のファイアウォールゾーンを特定のインターフェイスまたは IP アドレスの範囲に適用できます。

前提条件

手順

  1. RHEL 10 Web コンソールにログインします。
  2. Networking をクリックします。
  3. Edit rules and zones ボタンをクリックします。
  4. Firewall セクションの Add new zone をクリックします。
  5. Add zone ダイアログボックスで、Trust level オプションからゾーンを選択します。

    Web コンソールには、firewalld サービスで事前定義されたすべてのゾーンが表示されます。

  6. Interfaces 部分で、選択したゾーンを適用するインターフェイスを 1 つまたは複数選択します。
  7. Allowed Addresses 部分で、ゾーンを適用するかどうかを選択できます。

    • サブネット全体
    • 次の形式の IP アドレスの範囲:

      • 192.168.1.0
      • 192.168.1.0/24
      • 192.168.1.0/24, 192.168.1.0
  8. Add zone ボタンをクリックします。

1.6.11. Web コンソールを使用したゾーンの無効化

Web コンソールを使用して、ファイアウォール設定からファイアウォールゾーンを削除できます。

前提条件

手順

  1. RHEL 10 Web コンソールにログインします。
  2. Networking をクリックします。
  3. Edit rules and zones ボタンをクリックします。
  4. 削除するゾーンの ボタン (縦の省略記号メニュー) をクリックします。

    The context menu button next to the Add services button

  5. Delete をクリックします。

1.7. firewalld を使用したネットワークトラフィックの制御

firewalld パッケージは、事前定義された多数のサービスファイルをインストールし、それらをさらに追加したり、カスタマイズしたりできます。さらに、これらのサービス定義を使用して、サービスが使用するプロトコルとポート番号を知らなくても、サービスのポートを開いたり閉じたりできます。

1.7.1. CLI を使用した事前定義サービスによるトラフィックの制御

トラフィックを制御する最も簡単な方法は、事前定義したサービスを firewalld に追加する方法です。これにより、必要なすべてのポートが開き、service definition file に従ってその他の設定が変更されます。

前提条件

  • firewalld サービスが実行中である。

手順

  1. firewalld のサービスがまだ許可されていないことを確認します。

    # firewall-cmd --list-services
    ssh dhcpv6-client

    このコマンドは、デフォルトゾーンで有効になっているサービスをリスト表示します。

  2. firewalld のすべての事前定義サービスをリスト表示します。

    # firewall-cmd --get-services
    RH-Satellite-6 amanda-client amanda-k5-client bacula bacula-client bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph ceph-mon cfengine condor-collector ctdb dhcp dhcpv6 dhcpv6-client dns docker-registry ...

    このコマンドは、デフォルトゾーンで利用可能なサービスのリストを表示します。

  3. firewalld が許可するサービスのリストにサービスを追加します。

    # firewall-cmd --add-service=<service_name>

    このコマンドは、指定したサービスをデフォルトゾーンに追加します。

  4. 新しい設定を永続化します。

    # firewall-cmd --runtime-to-permanent

    このコマンドは、これらのランタイムの変更をファイアウォールの永続的な設定に適用します。デフォルトでは、これらの変更はデフォルトゾーンの設定に適用されます。

検証

  • すべての永続的なファイアウォールのルールをリスト表示します。

    # firewall-cmd --list-all --permanent
    public
      target: default
      icmp-block-inversion: no
      interfaces:
      sources:
      services: cockpit dhcpv6-client ssh
      ports:
      protocols:
      forward: no
      masquerade: no
      forward-ports:
      source-ports:
      icmp-blocks:
      rich rules:

    このコマンドは、デフォルトのファイアウォールゾーン (public) の永続的なファイアウォールのルールを含む完全な設定を表示します。

1.7.2. Web コンソールを使用したファイアウォールのサービスの有効化

デフォルトでは、サービスはデフォルトのファイアウォールゾーンに追加されます。複数のネットワークインターフェイスで複数のファイアウォールゾーンを使用している場合は、ゾーンを選択してから、そのサービスを対応するポートとともに追加する必要があります。

RHEL 10 Web コンソールに、事前定義済みの firewalld サービスが表示されます。このサービスをアクティブなファイアウォールゾーンに追加できます。

重要

RHEL 10 Web コンソールは、firewalld サービスを設定します。

Web コンソールのリストに表示されない汎用の firewalld ルールは、Web コンソールでは設定できません。

前提条件

手順

  1. RHEL 10 Web コンソールにログインします。
  2. Networking をクリックします。
  3. Edit rules and zones ボタンをクリックします。
  4. Firewall セクションで、サービスを追加するゾーンを選択し、Add Services をクリックします。
  5. Add Services ダイアログボックスで、ファイアウォールで有効にするサービスを見つけます。
  6. シナリオに応じてサービスを有効にします。
  7. Add Services をクリックします。

1.7.3. Web コンソールを使用したカスタムポートの設定

RHEL Web コンソールを通じて、サービス用のカスタムポートを追加できます。

前提条件

手順

  1. RHEL 10 Web コンソールにログインします。
  2. Networking をクリックします。
  3. Edit rules and zones ボタンをクリックします。

    ルールとゾーンの編集 ボタンが表示されない場合は、Web コンソールに管理者権限でログインしてください。

  4. Firewall セクションで、カスタムポートを設定するゾーンを選択し、Add Services をクリックします。
  5. Add services ダイアログボックスで、Custom Ports ラジオボタンをクリックします。
  6. TCP フィールドおよび UDP フィールドに、例に従ってポートを追加します。以下の形式でポートを追加できます。

    • ポート番号 (22 など)
    • ポート番号の範囲 (5900-5910 など)
    • エイリアス (nfs、rsync など)
    注記

    各フィールドには、複数の値を追加できます。値はスペースを入れずにコンマで区切る必要があります (例: 8080,8081,http)。

  7. TCP フィールド、UDP フィールド、またはその両方にポート番号を追加した後、Name フィールドでサービス名を確認します。

    Name フィールドには、このポートを予約しているサービスの名前が表示されます。このポートが自由に使用可能であり、かつどのサーバーもこのポートで通信するにあたってそのサービスを必要としていないのであれば、その名前を書き換えても構いません。

  8. Name フィールドに、定義されたポートを含むサービスの名前を追加します。
  9. Add Ports ボタンをクリックします。

1.8. ゾーン間で転送されるトラフィックのフィルタリング

firewalld の 異なるゾーン間でのネットワークデータの流れを制御できます。ルールとポリシーを定義することで、これらのゾーン間を移動するトラフィックをどのように許可またはブロックするかを管理できます。

ポリシーオブジェクト機能は、firewalld においてフォワードおよびアウトプットフィルタリングを提供します。firewalld を使用して、異なるゾーン間のトラフィックをフィルタリングし、ローカルでホストされている仮想マシンへのアクセスを許可して、ホストを接続できます。

1.8.1. ポリシーオブジェクトとゾーンの関係

ポリシーオブジェクトを使用することで、サービス、ポート、詳細なルールなど、firewalld の基本要素をポリシーに関連付けることができます。ポリシーオブジェクトは、ステートフルおよび一方向の方法でゾーン間を通過するトラフィックに適用することができます。

# firewall-cmd --permanent --new-policy myOutputPolicy

# firewall-cmd --permanent --policy myOutputPolicy --add-ingress-zone HOST

# firewall-cmd --permanent --policy myOutputPolicy --add-egress-zone ANY

HOST および ANY は、イングレスゾーンおよびエグレスゾーンのリストで使用されるシンボリックゾーンです。

  • HOST シンボリックゾーンは、firewalld を実行しているホストから発信されるトラフィック、またはホストへの宛先を持つトラフィックのポリシーを許可します。
  • ANY シンボリックゾーンは、現行および将来のすべてのゾーンにポリシーを適用します。ANY シンボリックゾーンは、すべてのゾーンのワイルドカードとして機能します。

1.8.2. 優先度を使用したポリシーのソート

同じトラフィックに対して複数のポリシーを適用できます。したがって、優先順位を使用して、適用される可能性のある政策の優先順位を定める。

手順

  • ポリシーをソートする優先度を設定します。
# *firewall-cmd --permanent --policy _mypolicy_ --set-priority _-500_*

+ 優先度の数値が小さいほど優先度が高く、最初に適用されます。

ポリシーオブジェクト機能を使用すると、Podman と firewalld ゾーン間のトラフィックをフィルタリングできます。

注記

Red Hat は、デフォルトではすべてのトラフィックをブロックし、Podman ユーティリティーに必要なサービスを選択して開くことを推奨します。

手順

  1. 新しいファイアウォールポリシーを作成します。

    # firewall-cmd --permanent --new-policy podmanToAny
  2. Podman から他のゾーンへのすべてのトラフィックをブロックし、Podman で必要なサービスのみを許可します。

    # firewall-cmd --permanent --policy podmanToAny --set-target REJECT
    # firewall-cmd --permanent --policy podmanToAny --add-service dhcp
    # firewall-cmd --permanent --policy podmanToAny --add-service dns
    # firewall-cmd --permanent --policy podmanToAny --add-service https
  3. 新しい Podman ゾーンを作成します。

    # firewall-cmd --permanent --new-zone=podman
  4. ポリシーのイングレスゾーンを定義します。

    # firewall-cmd --permanent --policy podmanToHost --add-ingress-zone podman
  5. 他のすべてのゾーンのエグレスゾーンを定義します。

    # firewall-cmd --permanent --policy podmanToHost --add-egress-zone ANY

    エグレスゾーンを ANY に設定すると、Podman と他のゾーンの間でフィルタリングすることになります。ホストに対してフィルタリングする場合は、エグレスゾーンを HOST に設定します。

  6. firewalld サービスを再起動します。

    # systemctl restart firewalld

検証

  • 他のゾーンに対する Podman ファイアウォールポリシーを検証します。

    # firewall-cmd --info-policy podmanToAny
    podmanToAny (active)
      ...
      target: REJECT
      ingress-zones: podman
      egress-zones: ANY
      services: dhcp dns https
      ...

1.8.4. ポリシーオブジェクトのデフォルトターゲットの設定

ポリシーには --set-target オプションを指定できます。

以下のターゲットを使用できます。

  • ACCEPT - パケットを受け入れます
  • DROP - 不要なパケットを破棄します
  • REJECT - ICMP 応答で不要なパケットを拒否します
  • 続行 (デフォルト) - パケットは、以下のポリシーおよびゾーンのルールに従います。

手順

  • デフォルトのターゲットを設定します。

    # firewall-cmd --permanent --policy mypolicy --set-target CONTINUE

検証

  • ポリシーに関する情報の確認

    # firewall-cmd --info-policy mypolicy

1.9. firewalld を使用した NAT の設定

firewalld を使用すると、マスカレード、宛先 NAT (DNAT)、およびリダイレクトという NAT タイプを設定できます。NAT を使用すると、送信元または宛先の IP アドレスを変更できます。

1.9.1. ネットワークアドレス変換のタイプ

ネットワークでネットワークアドレス変換 (NAT) が必要な場合は、NAT のタイプを理解することが重要です。

さまざまな NAT タイプを以下に示します。

マスカレード

この NAT タイプは、パケットの送信元 IP アドレスを変更するために使用します。たとえば、インターネットサービスプロバイダー (ISP) は、プライベート IP 範囲 (10.0.0.0/8 など) をルーティングしません。ネットワークでプライベート IP アドレス範囲を使用しており、そのネットワーク内のホストがインターネットアクセスを必要とする場合は、これらの範囲からのパケットの送信元 IP アドレスをパブリック IP アドレスにマッピングしてください。

マスカレードは、出力インターフェイスの IP アドレスを自動的に使用します。したがって、出力インターフェイスが動的 IP アドレスを使用する場合は、マスカレードを使用します。

宛先 NAT (DNAT)
この NAT タイプを使用して、着信パケットの宛先アドレスとポートを書き換えます。たとえば、Web サーバーがプライベート IP 範囲の IP アドレスを使用しているため、インターネットから直接アクセスできない場合は、ルーターに DNAT ルールを設定し、着信トラフィックをこのサーバーにリダイレクトできます。
リダイレクト
このタイプは、パケットをローカルマシンの別のポートにリダイレクトする DNAT の特殊なケースです。たとえば、サービスが標準ポートとは異なるポートで実行する場合は、標準ポートからこの特定のポートに着信トラフィックをリダイレクトすることができます。

1.9.2. IP アドレスのマスカレードの設定

システムで IP マスカレードを有効にできます。IP マスカレードは、インターネットにアクセスする際にゲートウェイの向こう側にある個々のマシンを隠します。

手順

  1. IP マスカレードが有効かどうかを確認するには (たとえば、external ゾーンの場合)、root として次のコマンドを入力します。

    # firewall-cmd --zone=external --query-masquerade

    このコマンドでは、有効な場合は yes と出力され、終了ステータスは 0 になります。無効の場合は no と出力され、終了ステータスは 1 になります。ゾーン が省略された場合、firewalld はデフォルトのゾーンを使用します。

  2. IP マスカレードを有効にするには、root で次のコマンドを実行します。

    # firewall-cmd --zone=external --add-masquerade
  3. この設定を永続化するには、--permanent オプションをコマンドに渡します。
  4. IP マスカレードを無効にするには、root で次のコマンドを実行します。

    # firewall-cmd --zone=external --remove-masquerade

    この設定を永続化するには、--permanent をコマンドラインに渡します。

1.9.3. DNAT を使用した着信 HTTP トラフィックの転送

宛先ネットワークアドレス変換 (DNAT) を使用して、着信トラフィックを 1 つの宛先アドレスおよびポートから別の宛先アドレスおよびポートに転送できます。通常、外部ネットワークインターフェイスからの着信リクエストを特定の内部サーバーまたはサービスにリダイレクトする場合に役立ちます。

前提条件

  • firewalld サービスが実行中である。

手順

  1. 着信 HTTP トラフィックを転送します。

    # firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toaddr=198.51.100.10:toport=8080 --permanent

    上記のコマンドは、次の設定で DNAT ルールを定義します。

    • --zone=public - DNAT ルールを設定するファイアウォールゾーン。必要なゾーンに合わせて調整できます。
    • --add-forward-port - ポート転送ルールを追加することを示すオプション。
    • port=80 - 外部宛先ポート。
    • proto=tcp - TCP トラフィックを転送することを示すプロトコル。
    • toaddr=198.51.100.10 - 宛先 IP アドレス。
    • toport=8080 - 内部サーバーの宛先ポート。
    • --permanent - 再起動後も DNAT ルールを永続化するオプション。
  2. ファイアウォール設定をリロードして、変更を適用します。

    # firewall-cmd --reload

検証

  • 使用したファイアウォールゾーンの DNAT ルールを確認します。

    # firewall-cmd --list-forward-ports --zone=public
    port=80:proto=tcp:toport=8080:toaddr=198.51.100.10

    あるいは、対応する XML 設定ファイルを表示します。

    # cat /etc/firewalld/zones/public.xml
    <?xml version="1.0" encoding="utf-8"?>
    <zone>
      <short>Public</short>
      <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
      <service name="ssh"/>
      <service name="dhcpv6-client"/>
      <service name="cockpit"/>
      <forward-port port="80" protocol="tcp" to-port="8080" to-addr="198.51.100.10"/>
      <forward/>
    </zone>

リダイレクトメカニズムを使用すると、ユーザーが URL でポートを指定しなくても、非標準ポートで内部的に実行される Web サービスにアクセスできるようになります。

リダイレクトを使用すると、URL が簡素化され、より快適なブラウジング体験が得られますが、非標準ポートは内部的に、または特定の要件のために引き続き使用されます。

前提条件

  • firewalld サービスが実行中である。

手順

  1. NAT リダイレクトルールを作成します。

    # firewall-cmd --zone=public --add-forward-port=port=<standard_port>:proto=tcp:toport=<non_standard_port> --permanent

    上記のコマンドは、次の設定で NAT リダイレクトルールを定義します。

    • --zone=public - ルールを設定するファイアウォールゾーン。必要なゾーンに合わせて調整できます。
    • --add-forward-port=port=<non_standard_port> - 着信トラフィックを最初に受信するソースポートを使用したポート転送 (リダイレクト) ルールを追加することを示すオプション。
    • proto=tcp - TCP トラフィックをリダイレクトすることを示すプロトコル。
    • toport=<standard_port> - 着信トラフィックがソースポートで受信された後にリダイレクトされる宛先ポート。
    • --permanent - 再起動後もルールを永続化するオプション。
  2. ファイアウォール設定をリロードして、変更を適用します。

    # firewall-cmd --reload

検証

  • 使用したファイアウォールゾーンのリダイレクトルールを確認します。

    # firewall-cmd --list-forward-ports
    port=8080:proto=tcp:toport=80:toaddr=

    あるいは、対応する XML 設定ファイルを表示します。

    # cat /etc/firewalld/zones/public.xml
    <?xml version="1.0" encoding="utf-8"?>
    <zone>
      <short>Public</short>
      <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
      <service name="ssh"/>
      <service name="dhcpv6-client"/>
      <service name="cockpit"/>
      <forward-port port="8080" protocol="tcp" to-port="80"/>
      <forward/>
    </zone>

1.10. リッチルールの優先度設定

リッチルールを使用すると、ファイアウォールルールをより高度かつ柔軟な方法で定義できます。リッチルールは、サービスやポートなどでは複雑なファイアウォールルールを表現しきれない場合に特に役立ちます。

リッチルールの背後にある概念:

粒度と柔軟性
より具体的な基準に基づき、ネットワークトラフィックの詳細な条件を定義できます。
ルール構造

リッチルールは、ファミリー (IPv4 または IPv6) と、それに続く条件およびアクションで構成されます。

rule family="ipv4|ipv6" [conditions] [actions]
conditions
特定の基準が満たされた場合にのみ、リッチルールを適用できます。
actions
条件に一致するネットワークトラフィックに何が起きるかを定義できます。
combining multiple conditions
より具体的かつ複雑なフィルタリングを作成できます。
hierarchical control and reusability
リッチルールを、ゾーンやサービスなどの他のファイアウォールメカニズムと組み合わせることができます。

デフォルトでは、リッチルールはルールアクションに基づいて設定されます。たとえば、allow ルールよりも deny ルールが優先されます。リッチルールで priority パラメーターを使用すると、管理者はリッチルールとその実行順序をきめ細かく制御できます。priority パラメーターを使用すると、ルールはまず優先度の値によって昇順にソートされます。複数のルールが同じ 優先順位 を持つ場合、その順序はルールのアクションによって決定されます。アクションも同じ場合は、順序が不確定になる可能性があります。

1.10.1. priority パラメーターがルールを異なるチェーンに振り分ける仕組み

リッチルールの priority パラメーターは、-32768 から 32767 までの任意の数値に設定でき、数値が小さいほど優先度が高くなります。

firewalld サービスは、優先度の値に基づいてルールを異なるチェーンに振り分けます。

  • 優先度が 0 未満 - ルールは _pre 接尾辞が付いたチェーンにリダイレクトされます。
  • 優先度が 0 を超える - ルールは _post 接尾辞が付いたチェーンにリダイレクトされます。
  • 優先度が 0 - アクションに基づいて、ルールは、_log_deny、または _allow のアクションを使用してチェーンにリダイレクトされます。

このサブチェーンでは、firewalld は優先度の値に基づいてルールを分類します。

詳細は、システム上の firewalld.richlanguage(5) man ページを参照してください。

1.10.2. リッチルールの優先度の設定

priority パラメーターを使用すると、他のルールによって許可または拒否されないすべてのトラフィックをログに記録できます。この機能を使用すると、たとえば、予期しないトラフィックにフラグを付けることができます。

手順

  • 優先度が非常に低いルールを追加して、他のルールと一致していないすべてのトラフィックをログに記録します。

    # firewall-cmd --add-rich-rule='rule priority=32767 log prefix="UNEXPECTED: " limit value="5/m"'

    このコマンドでは、ログエントリーの数を、毎分 5 に制限します。詳細は、システム上の firewalld.richlanguage(5) man ページを参照してください。

検証

  • 前の手順のコマンドで作成した nftables ルールを表示します。

    # nft list chain inet firewalld filter_IN_public_post
    table inet firewalld {
      chain filter_IN_public_post {
        log prefix "UNEXPECTED: " limit rate 5/minute
      }
    }

ゾーン内転送は、firewalld ゾーン内のインターフェイスまたはソース間のトラフィック転送を可能にする firewalld 機能です。

1.11.1. ゾーン内転送と、デフォルトのターゲットが ACCEPT に設定されているゾーンの違い

ゾーン内転送を有効にすると、1 つの firewalld ゾーン内のトラフィックは、あるインターフェイスまたはソースから別のインターフェイスまたはソースに流れることができます。ゾーンは、インターフェイスおよびソースの信頼レベルを指定します。信頼レベルが同じ場合、トラフィックは同じゾーン内に留まります。

注記

firewalld のデフォルトゾーンでゾーン内転送を有効にすると、現在のデフォルトゾーンに追加されたインターフェイスおよびソースにのみ適用されます。

firewalld は、異なるゾーンを使用して着信トラフィックと送信トラフィックを管理します。各ゾーンには独自のルールと動作のセットがあります。たとえば、trusted ゾーンでは、転送されたすべてのトラフィックがデフォルトで許可されます。

他のゾーンでは、異なるデフォルト動作を設定できます。標準ゾーンでは、ゾーンのターゲットが default に設定されている場合、転送されたトラフィックは通常デフォルトで破棄されます。

ゾーン内の異なるインターフェイスまたはソース間でトラフィックを転送する方法を制御するには、ゾーンのターゲットを理解し、それに応じてゾーンのターゲットを設定する必要があります。

1.11.2. ゾーン内転送を使用したイーサネットと Wi-Fi ネットワーク間でのトラフィックの転送

ゾーン内転送を使用して、同じ firewalld ゾーン内のインターフェイスとソース間のトラフィックを転送することができます。

この機能には次の利点があります。

  • 有線デバイスと無線デバイスの間のシームレスな接続性 (enp1s0 に接続されたイーサネットネットワークと wlp0s20 に接続された Wi-Fi ネットワークの間でトラフィックを転送可能)
  • 柔軟な作業環境のサポート
  • ネットワーク内の複数のデバイスまたはユーザーがアクセスして使用できる共有リソース (プリンター、データベース、ネットワーク接続ストレージなど)
  • 効率的な内部ネットワーク (スムーズな通信、レイテンシーの短縮、リソースへのアクセス性など)

この機能は、個々の firewalld ゾーンに対して有効にすることができます。

詳細は、システム上の firewalld.zones(5) man ページを参照してください。

手順

  1. カーネルでパケット転送を有効にします。

    # echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf
    # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf
  2. ゾーン内転送を有効にするインターフェイスが internal ゾーンにのみ割り当てられていることを確認します。

    # firewall-cmd --get-active-zones
  3. 現在、インターフェイスが internal 以外のゾーンに割り当てられている場合は、以下のように再割り当てします。

    # firewall-cmd --zone=internal --change-interface=interface_name --permanent
  4. enp1s0 および wlp0s20 インターフェイスを internal ゾーンに追加します。

    # firewall-cmd --zone=internal --add-interface=enp1s0 --add-interface=wlp0s20
  5. ゾーン内転送を有効にします。

    # firewall-cmd --zone=internal --add-forward

検証

  1. ゾーン転送を有効にしたホストの enp1s0 インターフェイスと同じネットワーク上にあるホストにログインします。
  2. ncat で echo サービスを起動し、接続をテストします。

    # ncat -e /usr/bin/cat -l 12345
  3. wlp0s20 インターフェイスと同じネットワークにあるホストにログインします。
  4. enp1s0 と同じネットワークにあるホスト上で実行している echo サーバーに接続します。

    # ncat <other_host> 12345
  5. 何かを入力して Enter を押します。テキストが返送されることを確認します。

1.12. RHEL システムロールを使用した firewalld の設定

RHEL システムロールは、Ansible 自動化ユーティリティーのコンテンツセットです。このコンテンツを、Ansible Automation ユーティリティーと組み合わせることで、複数のシステムを同時にリモートで管理するための一貫した設定インターフェイスが実現します。

rhel-system-roles パッケージには、rhel-system-roles.firewall RHEL システムロールが含まれています。このロールは、firewalld サービスの自動設定のために導入されました。

firewall RHEL システムロールを使用すると、次のようなさまざまな firewalld パラメーターを設定できます。

  • ゾーン
  • パケットの受信が許可されている特定のサービス
  • ポートへのトラフィックアクセスの許可、拒否、またはドロップ
  • ゾーンのポートまたはポート範囲の転送

1.12.1. firewall RHEL システムロールを使用した firewalld 設定のリセット

firewall RHEL システムロールは、firewalld 設定をデフォルトに自動的にリセットする機能をサポートしています。これにより、セキュアでない、または意図しないファイアウォールルールが効率的に削除され、管理が簡素化されます。

前提条件

手順

  1. 次の内容を含む Playbook ファイル (例: ~/playbook.yml) を作成します。

    ---
    - name: Reset firewalld example
      hosts: managed-node-01.example.com
      tasks:
        - name: Reset firewalld
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.firewall
          vars:
            firewall:
              - previous: replaced

    サンプル Playbook で指定されている設定は次のとおりです。

    previous: replaced

    既存のユーザー定義設定をすべて削除し、firewalld 設定をデフォルトにリセットします。previous:replaced パラメーターを他の設定と組み合わせると、firewall ロールは新しい設定を適用する前に既存の設定をすべて削除します。

    Playbook で使用されるすべての変数の詳細は、コントロールノードの /usr/share/ansible/roles/rhel-system-roles.firewall/README.md ファイルを参照してください。

  2. Playbook の構文を検証します。

    $ ansible-playbook --syntax-check ~/playbook.yml

    このコマンドは構文を検証するだけであり、有効だが不適切な設定から保護するものではないことに注意してください。

  3. Playbook を実行します。

    $ ansible-playbook ~/playbook.yml

検証

  • コントロールノードでこのコマンドを実行して、管理対象ノードのすべてのファイアウォール設定がデフォルト値にリセットされたことをリモートで確認します。

    # ansible managed-node-01.example.com -m ansible.builtin.command -a 'firewall-cmd --list-all-zones'

firewall RHEL システムロールを使用して、あるローカルポートから別のローカルポートへの着信トラフィックの転送をリモートで設定できます。

たとえば、同じマシン上に複数のサービスが共存し、同じデフォルトポートが必要な環境の場合、ポートの競合が発生する可能性があります。この競合によりサービスが中断され、ダウンタイムが発生する可能性があります。firewall RHEL システムロールを使用すると、トラフィックを効率的に別のポートに転送して、サービスの設定を変更せずにサービスを同時に実行できます。

前提条件

手順

  1. 次の内容を含む Playbook ファイル (例: ~/playbook.yml) を作成します。

    ---
    - name: Configure firewalld
      hosts: managed-node-01.example.com
      tasks:
        - name: Forward incoming traffic on port 8080 to 443
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.firewall
          vars:
            firewall:
              - forward_port: 8080/tcp;443;
                state: enabled
                runtime: true
                permanent: true

    サンプル Playbook で指定されている設定は次のとおりです。

    forward_port: 8080/tcp;443
    TCP プロトコルを使用してローカルポート 8080 に送信されるトラフィックが、ポート 443 に転送されます。
    runtime: true

    ランタイム設定の変更を有効にします。デフォルトは true に設定されています。

    Playbook で使用されるすべての変数の詳細は、コントロールノードの /usr/share/ansible/roles/rhel-system-roles.firewall/README.md ファイルを参照してください。

  2. Playbook の構文を検証します。

    $ ansible-playbook --syntax-check ~/playbook.yml

    このコマンドは構文を検証するだけであり、有効だが不適切な設定から保護するものではないことに注意してください。

  3. Playbook を実行します。

    $ ansible-playbook ~/playbook.yml

検証

  • コントロールノードで次のコマンドを実行して、管理対象ノードの転送ポートをリモートで確認します。

    # ansible managed-node-01.example.com -m ansible.builtin.command -a 'firewall-cmd --list-forward-ports'
    managed-node-01.example.com | CHANGED | rc=0 >>
    port=8080:proto=tcp:toport=443:toaddr=

1.12.3. firewall RHEL システムロールを使用した firewalld DMZ ゾーンの設定

firewall RHEL システムロールを使用して、特定のトラフィックを許可するゾーンを設定できます。たとえば、外部ユーザーが Web サーバーにアクセスできるように、enp1s0 インターフェイスを持つ dmz ゾーンで HTTPS トラフィックを許可するように設定できます。

前提条件

手順

  1. 次の内容を含む Playbook ファイル (例: ~/playbook.yml) を作成します。

    ---
    - name: Configure firewalld
      hosts: managed-node-01.example.com
      tasks:
        - name: Creating a DMZ with access to HTTPS port and masquerading for hosts in DMZ
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.firewall
          vars:
            firewall:
              - zone: dmz
                interface: enp1s0
                service: https
                state: enabled
                runtime: true
                permanent: true

    Playbook で使用されるすべての変数の詳細は、コントロールノードの /usr/share/ansible/roles/rhel-system-roles.firewall/README.md ファイルを参照してください。

  2. Playbook の構文を検証します。

    $ ansible-playbook --syntax-check ~/playbook.yml

    このコマンドは構文を検証するだけであり、有効だが不適切な設定から保護するものではないことに注意してください。

  3. Playbook を実行します。

    $ ansible-playbook ~/playbook.yml

検証

  • コントロールノードで次のコマンドを実行して、管理対象ノードの dmz ゾーンに関する情報をリモートで確認します。

    # ansible managed-node-01.example.com -m ansible.builtin.command -a 'firewall-cmd --zone=dmz --list-all'
    managed-node-01.example.com | CHANGED | rc=0 >>
    dmz (active)
      target: default
      icmp-block-inversion: no
      interfaces: enp1s0
      sources:
      services: https ssh
      ports:
      protocols:
      forward: no
      masquerade: no
      forward-ports:
      source-ports:
      icmp-blocks:

1.12.4. firewall RHEL システムロールを使用したカスタム firewalld サービスの作成

firewalld において、サービスとは、特定のアプリケーションに対するトラフィックを許可するルールをまとめて名前を付けたものです。管理者は、個々のポートとプロトコルを手動で管理する代わりに、サービス名を使用してトラフィックを許可することができます。

firewall RHEL システムロールを使用すると、カスタムサービスファイルの作成を自動化できます。これにより、ファイアウォールの設定がよりシンプルになり、再利用しやすくなります。

前提条件

手順

  1. 次の内容を含む Playbook ファイル (例: ~/playbook.yml) を作成します。

    ---
    - name: Configure firewalld
      hosts: managed-node-01.example.com
      tasks:
        - name: Create a firewalld service
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.firewall
          vars:
            firewall:
              service: custom_service
              short: A custom firewalld service
              description: >-
                A custom firewalld service that opens port 2222/tcp and
                the ports opened by the http and https firewalld services.
              port: 2222/tcp
              includes:
                - http
                - https
              state: present
              permanent: true

    サンプル Playbook で指定されている設定は次のとおりです。

    service: <service_name>
    サービスの名前を設定します。
    short: <short_description>
    サービスの簡単な説明を設定します。
    description: <description>
    サービスの詳細な説明を設定します。
    port: <port>/<protocol>
    サービスファイルで許可されるポートとプロトコルを定義します。複数のエントリーを定義するには、YAML リストを使用します。
    includes: <services>
    オプション: 作成するサービスに含めるその他の firewalld サービスファイルを定義します。
    state: present
    サービスを追加します。そのサービスがすでに存在する場合、ロールは定義されたとおりにそのサービスを変更します。
    permanent: true

    firewalld の永続的な設定の変更を有効にします。

    Playbook で使用されるすべての変数の詳細は、コントロールノードの /usr/share/ansible/roles/rhel-system-roles.firewall/README.md ファイルを参照してください。

  2. Playbook の構文を検証します。

    $ ansible-playbook --syntax-check ~/playbook.yml

    このコマンドは構文を検証するだけであり、有効だが不適切な設定から保護するものではないことに注意してください。

  3. Playbook を実行します。

    $ ansible-playbook ~/playbook.yml

検証

  • 作成したサービス定義を表示します。

    # ansible managed-node-01.example.com -m ansible.builtin.command -a 'firewall-cmd --info-service=custom_service'

1.13. firewalld で転送されるトラフィックの高速化

firewalld サービスはフローテーブル機能をサポートしています。これにより、転送されるトラフィックのパフォーマンスを向上できます。このメカニズムはカーネル接続追跡を使用して、ネットワークスタックの大部分をバイパスします。その結果、確立された接続のデータパケットが高速化されます。

フローテーブルメカニズムには次の機能があります。

  • 接続追跡を使用して、従来のパケット転送パスをバイパスします。
  • 従来のパケット処理をバイパスすることで、ルーティングテーブルの再参照を回避します。
  • TCP および UDP プロトコルでのみ動作します。
  • ハードウェアに依存しないソフトウェア高速パスです。

手順

  1. フローテーブル機能を有効にします。

    # sed -i 's/^NftablesFlowtable=.*/NftablesFlowtable=enp1s0 enp2s0/' /etc/firewalld/firewalld.conf

    このコマンドは、/etc/firewalld/firewalld.conf ファイル内の NftablesFlowtable オプション (デフォルトは off) を、フローテーブルを有効にするネットワークインターフェイスのリストに設定します。この場合は NftablesFlowtable=enp1s0 enp2s0 です。

  2. 変更を有効にするために、ファイアウォールの設定をリロードします。

    # firewall-cmd --reload

1.14. firewalld を使用してトラフィック分類のゾーン優先度を設定する

ゾーン優先度を使用すると、ingressegress トラフィックの優先度を指定して、パケットの分類順序を制御できます。その利点は、ゾーン内のトラフィック分類順序を指定できることです。

送信元アドレスやインターフェイスに関係なく、ゾーン A はゾーン B よりも先に考慮される可能性がある。優先度の値が低いゾーンは、優先度の値が高いゾーンよりも優先されます。この分類には、ingress の優先度値と egress の優先度値のペアがあります。

1.14.1. ゾーン内の両方のトラフィックタイプに同じ優先度を設定する

--set-priority オプションを使用すると、明示的に指定しなくても、ingressegress の両方のトラフィック分類に共通の値を設定できます。

手順

  1. 新しいゾーンを作成します。

    # firewall-cmd --permanent --new-zone=example-zone
  2. --set-priority を使用して、example-zone ゾーンに共通ゾーン優先度値を設定します。

    # firewall-cmd --permanent --zone example-zone --set-priority -10

    より低い値を設定すると、優先度が高くなります。これにより、このゾーンにおける両方のトラフィックタイプに対して設定されたすべての操作が、他のゾーンの操作よりも優先されることが保証されます。

  3. 永続的な設定をランタイムに適用します。

    # firewall-cmd --reload

検証

  • 両方のトラフィックタイプの優先度値を表示します。

    # firewall-cmd --permanent --info-zone example-zone
    
    example-zone
      target: default
      ingress-priority: -10
      egress-priority: -10
      ...
      icmp-block-inversion: no
      ...
      services: dhcpv6-client mdns samba-client ssh
      ...
      forward: yes
      masquerade: no
      ...

    この設定により、トラフィックは他のゾーンよりも先に 例のゾーン に分類されることが保証されます。

1.14.2. ゾーン内のトラフィックタイプごとに異なる優先度を設定する

ingress トラフィックと egress トラフィックに異なる値を設定することで、ゾーン内のトラフィック分類の優先度を設定できます。

手順

  1. 新しいゾーンを作成します。

    # firewall-cmd --permanent --new-zone=example-zone
  2. --set-Ingress-priority を使用して、example-zone ゾーン内の ingress トラフィックのゾーン優先度値を設定します。

    # firewall-cmd --permanent --zone example-zone --set-ingress-priority -10
  3. --set-egress-priority を使用して、example-zone ゾーン内の egress トラフィックのゾーン優先度値を設定します。

    # firewall-cmd --permanent --zone example-zone --set-egress-priority 100
  4. 永続的な設定をランタイムに適用します。

    # firewall-cmd --reload

検証

  • 両方のトラフィックタイプの優先度値を表示します。

    # firewall-cmd --permanent --info-zone example-zone
    
    example-zone (active)
      target: default
      ingress-priority: -10
      egress-priority: 100
      icmp-block-inversion: no
      interfaces: eth0
      ...
      services: dhcpv6-client mdns samba-client ssh
      ...
      forward: yes
      masquerade: no
      ...

    これらの値は、example-zone ゾーン内の ingress トラフィックが egress トラフィックより優先され、他のゾーンよりも優先されることを示します。

第2章 nftables の使用

firewalld で対処できる一般的なパケットフィルタリングのケースに当てはまらない場合、またはルールを完全に制御する必要がある場合は、nftables フレームワークを使用できます。

2.1. nftables とは

nftables フレームワークは、パケットを分類機能を提供し、iptablesip6tablesarptablesebtables、および ipset ユーティリティーの後継となります。利便性、機能、パフォーマンスにおいて、以前のパケットフィルタリングツールに多くの改良が追加されました。以下に例を示します。

  • 線形処理の代わりに組み込みルックアップテーブルを使用
  • IPv4 プロトコルおよび IPv6 プロトコルに対する 1 つのフレームワーク
  • ルールセット全体を取得、更新、保存するのではなく、トランザクションを通じてカーネルルールセットをその場で更新する
  • ルールセットにおけるデバッグおよびトレースへの対応 (nftrace) およびトレースイベントの監視 (nft ツール)
  • より統一されたコンパクトな構文、プロトコル固有の拡張なし
  • サードパーティーのアプリケーション用 Netlink API

nftables フレームワークは、テーブルを使用してチェーンを保存します。このチェーンには、アクションを実行する個々のルールが含まれます。nft ユーティリティーは、以前のパケットフィルタリングフレームワークのツールをすべて置き換えます。libnftnl ライブラリーを介して、nftables Netlink API との低レベルの対話に libnftables ライブラリーを使用できます。

ルールセット変更が適用されていることを表示するには、nft list ruleset コマンドを使用します。カーネルルールセットをクリアするには、nft flush ruleset コマンドを使用します。同じカーネルインフラストラクチャーを使用するため、iptables-nft コマンドによってインストールされるルールセットにも影響が出る可能性があることに注意してください。

2.2. firewalld または nftables を使用するタイミング

RHEL は、ファイアウォールを設定するための nftables フレームワークと firewalld サービスを提供します。

Red Hat Enterprise Linux では、状況に応じて次のパケットフィルタリングユーティリティーを使用できます。

  • firewalld: firewalld ユーティリティーは、一般的なユースケースのファイアウォール設定を簡素化します。
  • nftables: nftables ユーティリティーを使用して、ネットワーク全体など、複雑なパフォーマンスに関する重要なファイアウォールを設定します。
重要

各ファイアウォール関連サービス (firewalld または nftables) が相互に影響を及ぼさないように、RHEL ホスト上でどちらかのサービスだけを実行し、もう一方のサービスを無効にしてください。

2.3. nftables フレームワークの概念

nftables フレームワークは、iptables に代わる、最新かつ効率的で柔軟な代替手段です。ルール管理を簡素化され、パフォーマンスを向上させるため、複雑で高い性能が求められるネットワーク環境に最適な選択肢となります。

テーブルと名前空間
nftables では、テーブルは関連するファイアウォールチェーン、セット、フローテーブル、およびその他のオブジェクトをグループ化する組織単位または名前空間を表します。nftables では、テーブルにより、ファイアウォールルールと関連コンポーネントをより柔軟に構造化できます。一方、iptables では、テーブルは特定の目的に合わせてより厳密に定義されていました。
テーブルファミリー
nftables 内の各テーブルは、特定のファミリー (ipip6inetarpbridge、または netdev) に関連付けられています。この関連付けによって、テーブルが処理できるパケットが決まります。たとえば、ip ファミリーのテーブルは IPv4 パケットのみを処理します。一方、inet はテーブルファミリーの特殊なケースです。これは IPv4 パケットと IPv6 パケットの両方を処理できるため、複数のプロトコルに対応した統一的なアプローチを実現します。特殊なテーブルファミリーのもう 1 つの例は netdev です。これは、ネットワークデバイスに直接適用されるルールに使用され、デバイスレベルでのフィルタリングを可能にするためです。
ベースチェーン

nftables のベースチェーンは、パケット処理パイプライン内の高度に設定可能な項目です。これを使用すると、以下を指定できます。

  • チェーンのタイプ (例: "filter")
  • パケット処理パスのフックポイント (例: "input"、"output"、"forward")
  • チェーンの優先順位

この柔軟性により、パケットがネットワークスタックを通過するときにルールが適用されるタイミングと方法を正確に制御できます。チェーンの特殊なケースは route チェーンです。これは、パケットヘッダーに基づいてカーネルによって行われるルーティングの決定に影響を与えるために使用されます。

ルール処理用の仮想マシン

nftables フレームワークは、ルールを処理するために内部仮想マシンを使用します。この仮想マシンは、アセンブリ言語の操作 (レジスターへのデータのロード、比較の実行など) に似た命令を実行します。このようなメカニズムにより、非常に柔軟かつ効率的なルール処理が可能になります。

nftables の機能拡張を、この仮想マシンの新しい命令として導入できます。これを行うには、通常、新しいカーネルモジュールと、libnftnl ライブラリーおよび nft コマンドラインユーティリティーの更新が必要です。

または、カーネルを変更することなく、既存の命令を新しい方法で組み合わせることで、新しい機能を導入することもできます。nftables ルールの構文は、基盤となる仮想マシンの柔軟性を反映しています。たとえば、meta mark set tcp dport map { 22: 1, 80: 2 } というルールは、TCP 宛先ポートが 22 の場合にパケットのファイアウォールマークを 1 に設定し、ポートが 80 の場合に 2 に設定します。このように複雑なロジックを簡潔に表現できます。

複雑なフィルタリングと決定マップ

nftables フレームワークは、ipset ユーティリティーの機能を統合および拡張します。このユーティリティーは、iptables において IP アドレス、ポート、その他のデータタイプ、そして何よりもその組み合わせの一括マッチングに使用されるものです。この統合により、大規模で動的なデータセットを nftables 内で直接管理することが容易になります。また、nftables は、任意のデータ型の複数の値または範囲に基づいてパケットをマッチングすることをネイティブにサポートしています。これにより、複雑なフィルタリング要件を処理する機能が強化されています。nftables を使用すると、パケット内の任意のフィールドを操作できます。

nftables では、セットは名前付きまたは匿名のいずれかです。名前付きセットは複数のルールによって参照され、動的に変更できます。匿名セットはルール内でインラインで定義され、不変です。セットには、IP アドレスとポート番号のペアなど、異なるタイプの組み合わせである要素を含めることができます。この機能により、複雑な条件のマッチングにおける柔軟性が向上します。カーネルは、セットを管理するために、特定の要件 (パフォーマンス、メモリー効率など) に基づいて最も適切なバックエンドを選択できます。セットは、キーと値のペアを持つマップとしても機能できます。値の部分は、データポイント (パケットヘッダーに書き込む値) として、またはジャンプ先の決定やチェーンとして使用できます。これにより、"決定マップ" と呼ばれる複雑で動的なルール動作が可能になります。

柔軟なルール形式

nftables ルールの構造はシンプルです。条件とアクションが左から右に順に適用されます。この直感的な形式により、ルールの作成とトラブルシューティングが簡素化されます。

ルール内の条件は、論理的に (AND 演算子を使用して) 結合されます。そのため、ルールがマッチするには、すべての条件が "true" と評価される必要があります。いずれかの条件が失敗した場合、評価が次のルールに進みます。

nftables 内のアクションは、dropaccept など、パケットのそれ以上のルール処理を停止する最終的なアクションにすることができます。counter log meta mark set 0x3 などの非終端アクションは、特定のタスク (パケットのカウント、ロギング、マークの設定など) を実行しますが、後続のルールの評価を許可します。

2.4. nftables テーブル、チェーン、およびルールの作成および管理

nftables ルールセットを表示して管理できます。

2.4.1. nftables テーブルの基本

nftables のテーブルは、チェーン、ルール、セットなどのオブジェクトを含む名前空間です。

各テーブルにはアドレスファミリーが割り当てられている必要があります。アドレスファミリーは、このテーブルが処理するパケットタイプを定義します。テーブルを作成する際に、以下のいずれかのアドレスファミリーを設定できます。

  • ip - IPv4 パケットのみと一致します。アドレスファミリーを指定しないと、これがデフォルトになります。
  • ip6 - IPv6 パケットのみと一致します。
  • inet - IPv4 パケットと IPv6 パケットの両方と一致します。
  • arp: IPv4 アドレス解決プロトコル (ARP) パケットと一致します。
  • bridge: ブリッジデバイスを通過するパケットに一致します。
  • netdev: ingress からのパケットに一致します。

テーブルを追加する場合、使用する形式はファイアウォールスクリプトにより異なります。

  • ネイティブ構文のスクリプトでは、以下を使用します。

    table <table_address_family> <table_name> {
    }
  • シェルスクリプトで、以下を使用します。

    nft add table <table_address_family> <table_name>

2.4.2. nftables チェーンの基本

テーブルには、ルールのコンテナーとなるチェーンが含まれます。次の 2 つのチェーンタイプが存在します。

  • ベースチェーン: ベースチェーンは、ネットワークスタックからのパケットのエントリーポイントとして機能します。
  • 通常のチェーン: jump ターゲットとして通常のチェーンを使用し、ルールをより適切に整理できます。

ベースチェーンをテーブルに追加する場合に使用する形式は、ファイアウォールスクリプトにより異なります。

  • ネイティブ構文のスクリプトでは、以下を使用します。

    table <table_address_family> <table_name> {
      chain <chain_name> {
        type <type> hook <hook> priority <priority>
        policy <policy> ;
      }
    }
  • シェルスクリプトで、以下を使用します。

    nft add chain <table_address_family> <table_name> <chain_name> { type <type> hook <hook> priority <priority> \; policy <policy> \; }

    シェルがセミコロンをコマンドの最後として解釈しないようにするには、セミコロンの前にエスケープ文字 \ を配置します。

どちらの例でも、ベースチェーン を作成します。通常のチェーン を作成する場合、中括弧内にパラメーターを設定しないでください。

チェーンタイプ:

チェーンタイプとそれらを使用できるアドレスファミリーとフックの概要を以下に示します。

Expand
Typeアドレスファミリーフック説明

filter

all

all

標準のチェーンタイプ

nat

ipip6inet

preroutinginputoutputpostrouting

このタイプのチェーンは、接続追跡エントリーに基づいてネイティブアドレス変換を実行します。接続の最初のパケットのみが通過します。

route

ipip6

output

このチェーンタイプを通過する許可済みパケットは、IP ヘッダーの関連部分が変更された場合に、新しいルートルックアップを引き起こします。

チェーンの優先度:

priority パラメーターは、パケットが同じフック値を持つチェーンを通過する順序を指定します。このパラメーターは、整数値に設定することも、標準の priority 名を使用することもできます。

以下のマトリックスは、標準的な priority 名とその数値の概要、それらを使用できるファミリーおよびフックの概要です。

Expand
テキストの値数値アドレスファミリーフック

raw

-300

ipip6inet

all

mangle

-150

ipip6inet

all

dstnat

-100

ipip6inet

prerouting

-300

bridge

prerouting

filter

0

ipip6inetarpnetdev

all

-200

bridge

all

security

50

ipip6inet

all

srcnat

100

ipip6inet

postrouting

300

bridge

postrouting

out

100

bridge

output

チェーンポリシー:

チェーンポリシーは、このチェーン内のルールでアクションが指定されていない場合に、nftables が パケットを受け入れるか破棄するかを定義します。チェーンには、以下のいずれかのポリシーを設定できます。

  • accept (デフォルト)
  • drop

2.4.3. nftables ルールの基本

ルールは、このルールを含むチェーンを渡すパケットに対して実行するアクションを定義します。ルールに一致する式も含まれる場合、nftables は、以前の式がすべて適用されている場合にのみアクションを実行します。

チェーンにルールを追加する場合、使用する形式はファイアウォールスクリプトにより異なります。

  • ネイティブ構文のスクリプトでは、以下を使用します。

    table <table_address_family> <table_name> {
      chain <chain_name> {
        type <type> hook <hook> priority <priority> ; policy <policy> ;
          <rule>
      }
    }
  • シェルスクリプトで、以下を使用します。

    nft add rule <table_address_family> <table_name> <chain_name> <rule>

    このシェルコマンドは、チェーンの最後に新しいルールを追加します。チェーンの先頭にルールを追加する場合は、nft add の代わりに nft insert コマンドを使用します。

2.4.4. nft コマンドを使用したテーブル、チェーン、ルールの管理

コマンドラインまたはシェルスクリプトで nftables ファイアウォールを管理するには、nft ユーティリティーを使用します。

重要

この手順のコマンドは通常のワークフローを表しておらず、最適化されていません。この手順では、nft コマンドを使用して、一般的なテーブル、チェーン、およびルールを管理する方法を説明します。

手順

  1. テーブルが IPv4 パケットと IPv6 パケットの両方を処理できるように、inet アドレスファミリーを使用して nftables_svc という名前のテーブルを作成します。

    # nft add table inet nftables_svc
  2. 受信ネットワークトラフィックを処理する INPUT という名前のベースチェーンを inet nftables_svc テーブルに追加します。

    # nft add chain inet nftables_svc INPUT { type filter hook input priority filter \; policy accept \; }

    シェルがセミコロンをコマンドの最後として解釈しないようにするには、\ 文字を使用してセミコロンをエスケープします。

  3. INPUT チェーンにルールを追加します。たとえば、INPUT チェーンの最後のルールとして、ポート 22 および 443 で着信 TCP トラフィックを許可し、他の着信トラフィックを、Internet Control Message Protocol (ICMP) ポートに到達できないというメッセージで拒否します。

    # nft add rule inet nftables_svc INPUT tcp dport 22 accept
    # nft add rule inet nftables_svc INPUT tcp dport 443 accept
    # nft add rule inet nftables_svc INPUT reject with icmpx type port-unreachable

    ここで示されたように nft add rule コマンドを実行すると、nft はコマンド実行と同じ順序でルールをチェーンに追加します。

  4. ハンドルを含む現在のルールセットを表示します。

    # nft -a list table inet nftables_svc
    table inet nftables_svc { # handle 13
      chain INPUT { # handle 1
        type filter hook input priority filter; policy accept;
        tcp dport 22 accept # handle 2
        tcp dport 443 accept # handle 3
        reject # handle 4
      }
    }
  5. ハンドル 3 で既存ルールの前にルールを挿入します。たとえば、ポート 636 で TCP トラフィックを許可するルールを挿入するには、以下を入力します。

    # nft insert rule inet nftables_svc INPUT handle 3 tcp dport 636 accept
  6. ハンドル 3 で、既存ルールの後ろにルールを追加します。たとえば、ポート 80 で TCP トラフィックを許可するルールを追加するには、以下を入力します。

    # nft add rule inet nftables_svc INPUT handle 3 tcp dport 80 accept
  7. ハンドルでルールセットを再表示します。後で追加したルールが指定の位置に追加されていることを確認します。

    # nft -a list table inet nftables_svc
    table inet nftables_svc { # handle 13
      chain INPUT { # handle 1
        type filter hook input priority filter; policy accept;
        tcp dport 22 accept # handle 2
        tcp dport 636 accept # handle 5
        tcp dport 443 accept # handle 3
        tcp dport 80 accept # handle 6
        reject # handle 4
      }
    }
  8. ハンドル 6 でルールを削除します。

    # nft delete rule inet nftables_svc INPUT handle 6

    ルールを削除するには、ハンドルを指定する必要があります。

  9. ルールセットを表示し、削除されたルールがもう存在しないことを確認します。

    # nft -a list table inet nftables_svc
    table inet nftables_svc { # handle 13
      chain INPUT { # handle 1
        type filter hook input priority filter; policy accept;
        tcp dport 22 accept # handle 2
        tcp dport 636 accept # handle 5
        tcp dport 443 accept # handle 3
        reject # handle 4
      }
    }
  10. INPUT チェーンから残りのルールをすべて削除します。

    # nft flush chain inet nftables_svc INPUT
  11. ルールセットを表示し、INPUT チェーンが空であることを確認します。

    # nft list table inet nftables_svc
    table inet nftables_svc {
      chain INPUT {
        type filter hook input priority filter; policy accept
      }
    }
  12. INPUT チェーンを削除します。

    # nft delete chain inet nftables_svc INPUT

    このコマンドを使用して、まだルールが含まれているチェーンを削除することもできます。

  13. ルールセットを表示し、INPUT チェーンが削除されたことを確認します。

    # nft list table inet nftables_svc
    table inet nftables_svc {
    }
  14. nftables_svc テーブルを削除します。

    # nft delete table inet nftables_svc

    このコマンドを使用して、まだルールが含まれているテーブルを削除することもできます。

    注記

    ルールセット全体を削除するには、個別のコマンドですべてのルール、チェーン、およびテーブルを手動で削除するのではなく、nft flush ruleset コマンドを使用します。

2.5. nftables を使用した NAT の設定

nftables を使用すると、マスカレード、ソース (SNAT)、宛先 NAT (DNAT)、およびリダイレクトというタイプを設定できます。NAT を使用すると、送信元または宛先の IP アドレスを変更できます。

2.5.1. NAT タイプ

nftables フレームワークは、さまざまなネットワークアドレス変換 (NAT) タイプをサポートしています。

マスカレードおよびソースの NAT (SNAT)

この NAT タイプのいずれかを使用して、パケットのソース IP アドレスを変更します。たとえば、インターネットサービスプロバイダー (ISP) は、プライベート IP 範囲 (10.0.0.0/8 など) をルーティングしません。ネットワークでプライベート IP 範囲を使用し、ユーザーがインターネット上のサーバーにアクセスできるようにする必要がある場合は、この範囲のパケットのソース IP アドレスをパブリック IP アドレスにマップします。

マスカレードと SNAT は互いに非常に似ています。相違点は次のとおりです。

  • マスカレードは、出力インターフェイスの IP アドレスを自動的に使用します。したがって、出力インターフェイスが動的 IP アドレスを使用する場合は、マスカレードを使用します。
  • SNAT は、パケットのソース IP アドレスを指定された IP に設定し、出力インターフェイスの IP アドレスを動的に検索しません。そのため、SNAT の方がマスカレードよりも高速です。出力インターフェイスが固定 IP アドレスを使用する場合は、SNAT を使用します。
宛先 NAT (DNAT)
この NAT タイプを使用して、着信パケットの宛先アドレスとポートを書き換えます。たとえば、Web サーバーがプライベート IP 範囲の IP アドレスを使用しているため、インターネットから直接アクセスできない場合は、ルーターに DNAT ルールを設定し、着信トラフィックをこのサーバーにリダイレクトできます。
リダイレクト
このタイプは、チェーンフックに応じてパケットをローカルマシンにリダイレクトする DNAT の特殊なケースです。たとえば、サービスが標準ポートとは異なるポートで実行する場合は、標準ポートからこの特定のポートに着信トラフィックをリダイレクトすることができます。

2.5.2. nftables を使用したマスカレードの設定

マスカレードを使用すると、ルーターは、インターフェイスを介して送信されるパケットのソース IP を、インターフェイスの IP アドレスに動的に変更できます。これは、インターフェイスに新しい IP が割り当てられている場合に、nftables はソース IP の置き換え時に新しい IP を自動的に使用することを意味します。

ens3 インターフェイスを介してホストから出るパケットの送信元 IP を、ens3 で設定された IP に置き換えます。

手順

  1. テーブルを作成します。

    # nft add table nat
  2. テーブルに postrouting チェーンを追加します。

    # nft add chain nat postrouting { type nat hook postrouting priority 100 \; }
  3. postrouting チェーンに、ens3 インターフェイスの出力パケットに一致するルールを追加します。

    # nft add rule nat postrouting oifname "ens3" masquerade
    重要

    iifname パラメーターおよび oifname パラメーターでは実インターフェイス名のみを使用でき、代替名 (altname) には対応していません。

2.5.3. nftables を使用したソース NAT の設定

ルーターでは、ソース NAT(SNAT) を使用して、インターフェイスを介して送信されるパケットの IP アドレスを特定の IP アドレスに変更できます。次に、ルーターは送信パケットのソース IP を置き換えます。

手順

  1. テーブルを作成します。

    # nft add table nat
  2. テーブルに postrouting チェーンを追加します。

    # nft add chain nat postrouting { type nat hook postrouting priority 100 \; }
  3. ens3 を介した発信パケットのソース IP を 192.0.2.1 に置き換えるルールを postrouting チェーンに追加します。

    # nft add rule nat postrouting oifname "ens3" snat to 192.0.2.1

2.5.4. nftables を使用した宛先 NAT の設定

宛先 NAT(DNAT) を使用すると、ルーター上のトラフィックを、インターネットから直接アクセスできないホストにリダイレクトできます。

たとえば、DNAT を使用すると、ルーターはポート 80 および 443 に送信された受信トラフィックを、IP アドレス 192.0.2.1 の Web サーバーにリダイレクトします。

手順

  1. テーブルを作成します。

    # nft add table nat
  2. テーブルに、prerouting チェーンおよび postrouting チェーンを追加します。

    # nft -- add chain nat prerouting { type nat hook prerouting priority -100 \; }
    # nft add chain nat postrouting { type nat hook postrouting priority 100 \; }

    -- オプションを nft コマンドに渡して、シェルが負の priority 値を nft コマンドのオプションとして解釈しないようにする必要があることに注意してください。

  3. prerouting チェーンに、ルーターの ens3 インターフェイスのポート 80 および 443 への受信トラフィックを、IP アドレス 192.0.2.1 の Web サーバーにリダイレクトするルールを追加します。

    # nft add rule nat prerouting iifname ens3 tcp dport { 80, 443 } dnat to 192.0.2.1
  4. 環境に応じて、SNAT ルールまたはマスカレードルールを追加して、Web サーバーから返されるパケットのソースアドレスを送信者に変更します。

    1. ens3 インターフェイスが動的 IP アドレスを使用している場合は、マスカレードルールを追加します。

      # nft add rule nat postrouting oifname "ens3" masquerade
    2. ens3 インターフェイスが静的 IP アドレスを使用する場合は、SNAT ルールを追加します。たとえば、ens3 が IP アドレス 198.51.100.1 を使用している場合は、以下のようになります。

      # nft add rule nat postrouting oifname "ens3" snat to 198.51.100.1
  5. パケット転送を有効にします。

    # echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf
    # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf

2.5.5. nftables を使用したリダイレクトの設定

redirect 機能は、チェーンフックに応じてパケットをローカルマシンにリダイレクトする宛先ネットワークアドレス変換 (DNAT) の特殊なケースです。

たとえば、ローカルホストのポート 22 に送信された着信および転送されたトラフィックを 2222 ポートにリダイレクトすることができます。

手順

  1. テーブルを作成します。

    # nft add table nat
  2. テーブルに prerouting チェーンを追加します。

    # nft -- add chain nat prerouting { type nat hook prerouting priority -100 \; }

    -- オプションを nft コマンドに渡して、シェルが負の priority 値を nft コマンドのオプションとして解釈しないようにする必要があることに注意してください。

  3. 22 ポートの着信トラフィックを 2222 ポートにリダイレクトするルールを prerouting チェーンに追加します。

    # nft add rule nat prerouting tcp dport 22 redirect to 2222

2.6. nftables スクリプトの作成と実行

nftables フレームワークを使用する主な利点は、スクリプトの実行がアトミックであることです。つまり、システムがスクリプト全体を適用するか、エラーが発生した場合には実行を阻止することを意味します。これにより、ファイアウォールは常に一貫した状態になります。

さらに、nftables スクリプト環境を使用すると、次のことができます。

  • コメントの追加
  • 変数の定義
  • 他のルールセットファイルの組み込み

nftables パッケージをインストールすると、RHEL は /etc/nftables/ ディレクトリーに *.nft スクリプトを自動的に作成します。このスクリプトは、さまざまな目的でテーブルと空のチェーンを作成するコマンドが含まれます。

2.6.1. 対応している nftables スクリプトの形式

nftables フレームワークは、さまざまな形式のスクリプトをサポートしています。

使用できる形式は次のとおりです。

  • nft list ruleset コマンドと同じ形式でルールセットが表示されます。

    #!/usr/sbin/nft -f
    
    # Flush the rule set
    flush ruleset
    
    table inet example_table {
      chain example_chain {
        # Chain for incoming packets that drops all packets that
        # are not explicitly allowed by any rule in this chain
        type filter hook input priority 0; policy drop;
    
        # Accept connections to port 22 (ssh)
        tcp dport ssh accept
      }
    }
  • nft コマンドと同じ構文:

    #!/usr/sbin/nft -f
    
    # Flush the rule set
    flush ruleset
    
    # Create a table
    add table inet example_table
    
    # Create a chain for incoming packets that drops all packets
    # that are not explicitly allowed by any rule in this chain
    add chain inet example_table example_chain { type filter hook input priority 0 ; policy drop ; }
    
    # Add a rule that accepts connections to port 22 (ssh)
    add rule inet example_table example_chain tcp dport ssh accept

2.6.2. nftables スクリプトの実行

nftables スクリプトは、nft ユーティリティーに渡すか、スクリプトを直接実行することで実行できます。

手順

  • nftables スクリプトを nft ユーティリティーに渡して実行するには、次のコマンドを実行します。

    # nft -f /etc/nftables/<example_firewall_script>.nft
  • nftables スクリプトを直接実行するには、次のコマンドを実行します。

    1. 1 回だけ実行する場合:

      1. スクリプトが以下のシバンシーケンスで始まることを確認します。

        #!/usr/sbin/nft -f
        重要

        -f パラメーターを指定しないと、nft ユーティリティーはスクリプトを読み取らず、Error: syntax error, unexpected newline, expecting string を表示します。

      2. 必要に応じて、スクリプトの所有者を root に設定します。

        # chown root /etc/nftables/<example_firewall_script>.nft
      3. 所有者のスクリプトを実行ファイルに変更します。

        # chmod u+x /etc/nftables/<example_firewall_script>.nft
    2. スクリプトを実行します。

      # /etc/nftables/<example_firewall_script>.nft

      何も出力が表示されない場合、システムはスクリプトを正常に実行しました。

      重要

      nft が スクリプトを正常に実行したとしても、ルールが正しく配置されていなかったり、パラメーターが不足していたり、スクリプトにその他の問題があったりすると、ファイアウォールが期待どおりに動作しない可能性があります。

2.6.3. nftables スクリプトでコメントの使用

nftables スクリプト環境は、# 文字の右側から行末までのすべてをコメントとして解釈します。

コメントは、行の先頭またはコマンドの横から開始できます。

...
# Flush the rule set
flush ruleset

add table inet example_table  # Create a table
...

2.6.4. nftables スクリプトでの変数の使用

nftables スクリプトで変数を定義するには、define キーワードを使用します。シングル値および匿名セットを変数に保存できます。より複雑なシナリオの場合は、セットまたは決定マップを使用します。

値を 1 つ持つ変数

以下の例は、値が enp1s0INET_DEV という名前の変数を定義します。

define INET_DEV = enp1s0

スクリプトで変数を使用するには、$ 記号と、それに続く変数名を指定します。

...
add rule inet example_table example_chain iifname $INET_DEV tcp dport ssh accept
...
匿名セットを含む変数

以下の例では、匿名セットを含む変数を定義します。

define DNS_SERVERS = { 192.0.2.1, 192.0.2.2 }

スクリプトで変数を使用するには、$ 記号と、それに続く変数名を指定します。

add rule inet example_table example_chain ip daddr $DNS_SERVERS accept
注記

中括弧は、変数がセットを表していることを示すため、ルールで使用する場合は、特別なセマンティクスを持ちます。

2.6.5. nftables スクリプトへのファイルの追加

nftables スクリプト環境では、include ステートメントを使用して他のスクリプトを含めることができます。

絶対パスまたは相対パスのないファイル名のみを指定すると、nftables には、デフォルトの検索パスのファイルが含まれます。これは、RHEL では /etc に設定されています。

例2.1 デフォルト検索ディレクトリーからのファイルを含む

デフォルトの検索ディレクトリーからファイルを指定するには、次のコマンドを実行します。

include "example.nft"

例2.2 ディレクトリーの *.nft ファイルをすべて含む

*.nft で終わるすべてのファイルを /etc/nftables/rulesets/ ディレクトリーに保存するには、次のコマンドを実行します。

include "/etc/nftables/rulesets/*.nft"

include ステートメントは、ドットで始まるファイルに一致しないことに注意してください。

詳細は、システム上の nft(8) man ページの Include files セクションを参照してください。

2.6.6. システムの起動時に nftables ルールの自動読み込み

systemd サービス nftables は、/etc/sysconfig/nftables.conf ファイルに含まれるファイアウォールスクリプトを読み込みます。

前提条件

  • nftables スクリプトは、/etc/nftables/ ディレクトリーに保存されます。

手順

  1. /etc/sysconfig/nftables.conf ファイルを編集します。

    • nftables パッケージのインストールで /etc/nftables/ に作成された *.nft スクリプトを変更した場合は、これらのスクリプトの include ステートメントのコメントを解除します。
    • 新しいスクリプトを作成した場合は、include ステートメントを追加してこれらのスクリプトを含めます。たとえば、nftables サービスの起動時に /etc/nftables/example.nft スクリプトを読み込むには、以下を追加します。

      include "/etc/nftables/example.nft"
  2. オプション: nftables サービスを開始して、システムを再起動せずにファイアウォールルールを読み込みます。

    # systemctl start nftables
  3. nftables サービスを有効にします。

    # systemctl enable nftables

2.7. nftables コマンドでのセットの使用

nftables フレームワークは、セットをネイティブに対応します。たとえば、セットを使用して、複数の IP アドレス、ポート番号、インターフェイス、またはその他のマッチング条件を照合することができます。

2.7.1. nftables での匿名セットの使用

匿名セットには、ルールで直接使用する { 22, 80, 443 } などの中括弧で囲まれたコンマ区切りの値が含まれます。IP アドレスやその他の一致基準にも匿名セットを使用できます。

匿名セットの欠点は、セットを変更する場合はルールを置き換える必要があることです。動的なソリューションの場合は、nftables で名前付きセットの使用 で説明されているように名前付きセットを使用します。

前提条件

  • inet ファミリーに example_chain チェーンおよび example_table テーブルがある。

手順

  1. たとえば、ポート 2280、および 443 に着信トラフィックを許可するルールを、example_tableexample_chain に追加するには、次のコマンドを実行します。

    # nft add rule inet example_table example_chain tcp dport { 22, 80, 443 } accept
  2. オプション: example_table ですべてのチェーンとそのルールを表示します。

    # nft list table inet example_table
    table inet example_table {
      chain example_chain {
        type filter hook input priority filter; policy accept;
        tcp dport { ssh, http, https } accept
      }
    }

2.7.2. nftables で名前付きセットの使用

nftables フレームワークは、変更可能な名前付きセットに対応します。名前付きセットは、テーブル内の複数のルールで使用できる範囲のリストです。匿名セットに対する別の利点として、セットを使用するルールを置き換えることなく、名前付きセットを更新できます。

名前付きセットを作成する場合は、セットに含まれる要素のタイプを指定する必要があります。以下のタイプを設定できます。

  • 192.0.2.1192.0.2.0/24 など、IPv4 アドレスまたは範囲を含むセットの場合は ipv4_addr
  • 2001:db8:1::12001:db8:1::/64 など、IPv6 アドレスまたは範囲を含むセットの場合は ipv6_addr
  • 52:54:00:6b:66:42 など、メディアアクセス制御 (MAC) アドレスの一覧を含むセットの場合は ether_addr
  • tcp など、インターネットプロトコルタイプの一覧が含まれるセットの場合は inet_proto
  • ssh など、インターネットサービスの一覧を含むセットの場合は inet_service
  • パケットマークの一覧を含むセットの場合は mark。パケットマークは、任意の 32 ビットの正の整数値 (0 から 2147483647) にすることができます。

前提条件

  • example_chain チェーンと example_table テーブルが存在する。

手順

  1. 空のファイルを作成します。以下の例では、IPv4 アドレスのセットを作成します。

    • 複数の IPv4 アドレスを格納することができるセットを作成するには、次のコマンドを実行します。

      # nft add set inet example_table example_set { type ipv4_addr \; }
    • IPv4 アドレス範囲を保存できるセットを作成するには、次のコマンドを実行します。

      # nft add set inet example_table example_set { type ipv4_addr \; flags interval \; }
    重要

    シェルがセミコロンをコマンドの終わりとして解釈しないようにするには、バックスラッシュでセミコロンをエスケープする必要があります。

  2. オプション: セットを使用するルールを作成します。たとえば、次のコマンドは、example_tableexample_chain に、example_set の IPv4 アドレスからのすべてのパケットを破棄するルールを追加します。

    # nft add rule inet example_table example_chain ip saddr @example_set drop

    example_set が空のままなので、ルールには現在影響がありません。

  3. IPv4 アドレスを example_set に追加します。

    • 個々の IPv4 アドレスを保存するセットを作成する場合は、次のコマンドを実行します。

      # nft add element inet example_table example_set { 192.0.2.1, 192.0.2.2 }
    • IPv4 範囲を保存するセットを作成する場合は、次のコマンドを実行します。

      # nft add element inet example_table example_set { 192.0.2.0-192.0.2.255 }

      IP アドレス範囲を指定する場合、代わりに Classless Inter-Domain Routing (CIDR) 表記を使用することもできます。例にある 192.0.2.0/24 などがその例です。

2.7.3. 動的セットを使用してパケットパスからエントリーを追加する

nftables の動的セットは、パケットデータから IP アドレス、ポート、MAC アドレスなどの要素を自動的に追加します。これにより、リアルタイムのデータ収集が可能になり、動的な拒否リストまたは禁止リストが作成され、セキュリティーの脅威に即座に対応できるようになります。

前提条件

  • inet ファミリーに example_chain チェーンおよび example_table テーブルがある。

手順

  1. 空のファイルを作成します。以下の例では、IPv4 アドレスのセットを作成します。

    • 複数の IPv4 アドレスを格納することができるセットを作成するには、次のコマンドを実行します。

      # nft add set inet example_table example_set { type ipv4_addr \; }
    • IPv4 アドレス範囲を保存できるセットを作成するには、次のコマンドを実行します。

      # nft add set inet example_table example_set { type ipv4_addr \; flags interval \; }
      重要

      シェルがセミコロンをコマンドの終わりとして解釈しないようにするには、バックスラッシュでセミコロンをエスケープする必要があります。

  2. 着信パケットの送信元 IPv4 アドレスを example_set セットに動的に追加するためのルールを作成します。

    # nft add rule inet example_table example_chain set add ip saddr @example_set

    このコマンドは、example_chain ルールチェーンと example_table 内に新しいルールを作成し、パケットの送信元 IPv4 アドレスを example_set に動的に追加します。

検証

  • ルールが追加されたことを確認します。

    # nft list ruleset
    ...
    table ip example_table {
    	set example_set {
    		type ipv4_addr
    		elements = { 192.0.2.250, 192.0.2.251 }
    	}
    
    	chain example_chain {
        type filter hook input priority 0
    		add @example_set { ip saddr }
    	}
    }

    このコマンドは、現在 nftables にロードされているルールセット全体を表示します。これは、IP がルールをアクティブにトリガーしており、example_set が適切なアドレスで更新されていることを示しています。

次のステップ

  • 動的 IP アドレスのセットを取得したら、それをさまざまなセキュリティー、フィルタリング、トラフィック制御の目的で使用できます。以下に例を示します。

    • ネットワークトラフィックをブロック、制限、またはログに記録する
    • 信頼済みユーザーを禁止しないように、許可リストと組み合わせて使用する
    • 過剰なブロックを防ぐために自動タイムアウトを使用する

2.8. nftables コマンドにおける決定マップの使用

ディクショナリーとしても知られている決定マップにより、nft は一致基準をアクションにマッピングすることで、パケット情報に基づいてアクションを実行できます。

2.8.1. nftables での匿名マップの使用

匿名マップは、ルールで直接使用する { match_criteria : action } ステートメントです。ステートメントには、複数のコンマ区切りマッピングを含めることができます。

匿名マップの欠点は、マップを変更する場合には、ルールを置き換える必要があることです。動的なソリューションの場合は、nftables での名前付きマップの使用 で説明されているように名前付きマップを使用します。

たとえば、匿名マップを使用して、IPv4 プロトコルおよび IPv6 プロトコルの TCP パケットと UDP パケットの両方を異なるチェーンにルーティングし、着信 TCP パケットと UDP パケットを個別にカウントできます。

手順

  1. 新しいテーブルを作成します。

    # nft add table inet example_table
  2. example_tabletcp_packets チェーンを作成します。

    # nft add chain inet example_table tcp_packets
  3. このチェーンのトラフィックをカウントする tcp_packets にルールを追加します。

    # nft add rule inet example_table tcp_packets counter
  4. example_tableudp_packets チェーンを作成します。

    # nft add chain inet example_table udp_packets
  5. このチェーンのトラフィックをカウントする udp_packets にルールを追加します。

    # nft add rule inet example_table udp_packets counter
  6. 着信トラフィックのチェーンを作成します。たとえば、example_table に、着信トラフィックをフィルタリングする incoming_traffic という名前のチェーンを作成するには、次のコマンドを実行します。

    # nft add chain inet example_table incoming_traffic { type filter hook input priority 0 \; }
  7. 匿名マップを持つルールを incoming_traffic に追加します。

    # nft add rule inet example_table incoming_traffic ip protocol vmap { tcp : jump tcp_packets, udp : jump udp_packets }

    匿名マップはパケットを区別し、プロトコルに基づいて別のカウンターチェーンに送信します。

  8. トラフィックカウンターの一覧を表示する場合は、example_table を表示します。

    # nft list table inet example_table
    table inet example_table {
      chain tcp_packets {
        counter packets 36379 bytes 2103816
      }
    
      chain udp_packets {
        counter packets 10 bytes 1559
      }
    
      chain incoming_traffic {
        type filter hook input priority filter; policy accept;
        ip protocol vmap { tcp : jump tcp_packets, udp : jump udp_packets }
      }
    }

    tcp_packets チェーンおよび udp_packets チェーンのカウンターは、受信パケットとバイトの両方を表示します。

2.8.2. nftables での名前付きマップの使用

nftables フレームワークは、名前付きマップに対応します。テーブルの複数のルールでこのマップを使用できます。匿名マップに対する別の利点は、名前付きマップを使用するルールを置き換えることなく、名前付きマップを更新できることです。

名前付きマップを作成する場合は、要素のタイプを指定する必要があります。

  • 一致する部分に 192.0.2.1 などの IPv4 アドレスが含まれるマップの場合は ipv4_addr
  • 一致する部分に 2001:db8:1::1 などの IPv6 アドレスが含まれるマップの場合は ipv6_addr
  • 52:54:00:6b:66:42 などのメディアアクセス制御 (MAC) アドレスを含むマップの場合は ether_addr
  • 一致する部分に tcp などのインターネットプロトコルタイプが含まれるマップの場合は inet_proto
  • 一致する部分に ssh22 などのインターネットサービス名のポート番号が含まれるマップの場合は inet_service
  • 一致する部分にパケットマークが含まれるマップの場合は mark。パケットマークは、任意の正の 32 ビットの整数値 (0 ~ 2147483647) にできます。

たとえば、送信元 IP アドレスに基づいて着信パケットを許可または拒否できます。名前付きマップを使用すると、このシナリオを設定するのに必要なルールは 1 つだけで、IP アドレスとアクションがマップに動的に保存されます。

手順

  1. テーブルを作成します。たとえば、IPv4 パケットを処理する example_table という名前のテーブルを作成するには、次のコマンドを実行します。

    # nft add table ip example_table
  2. チェーンを作成します。たとえば、example_table に、example_chain という名前のチェーンを作成するには、次のコマンドを実行します。

    # nft add chain ip example_table example_chain { type filter hook input priority 0 \; }
    重要

    シェルがセミコロンをコマンドの終わりとして解釈しないようにするには、バックスラッシュでセミコロンをエスケープする必要があります。

  3. 空のマップを作成します。たとえば、IPv4 アドレスのマッピングを作成するには、次のコマンドを実行します。

    # nft add map ip example_table example_map { type ipv4_addr : verdict \; }
  4. マップを使用するルールを作成します。たとえば、次のコマンドは、両方とも example_map で定義されている IPv4 アドレスにアクションを適用するルールを、example_tableexample_chain に追加します。

    # nft add rule example_table example_chain ip saddr vmap @example_map
  5. IPv4 アドレスと対応するアクションを example_map に追加します。

    # nft add element ip example_table example_map { 192.0.2.1 : accept, 192.0.2.2 : drop }

    以下の例では、IPv4 アドレスのアクションへのマッピングを定義します。上記で作成したルールと組み合わせることで、このファイアウォールは 192.0.2.1 からのパケットを許可し、192.0.2.2 からのパケットを破棄します。

  6. オプション: 別の IP アドレスおよび action ステートメントを追加してマップを拡張します。

    # nft add element ip example_table example_map { 192.0.2.3 : accept }
  7. オプション: マップからエントリーを削除します。

    # nft delete element ip example_table example_map { 192.0.2.1 }
  8. オプション: ルールセットを表示します。

    # nft list ruleset
    table ip example_table {
      map example_map {
        type ipv4_addr : verdict
        elements = { 192.0.2.2 : drop, 192.0.2.3 : accept }
      }
    
      chain example_chain {
        type filter hook input priority filter; policy accept;
        ip saddr vmap @example_map
      }
    }

2.9. 例: nftables スクリプトを使用した LAN および DMZ の保護

RHEL ルーターで nftables フレームワークを使用して、内部 LAN 内のネットワーククライアントと DMZ の Web サーバーを、インターネットやその他のネットワークからの不正アクセスから保護するファイアウォールスクリプトを作成およびインストールします。

重要

この例はデモ目的専用で、特定の要件があるシナリオを説明しています。

ファイアウォールスクリプトは、ネットワークインフラストラクチャーとセキュリティー要件に大きく依存します。この例を使用して、独自の環境用のスクリプトを作成する際に nftables ファイアウォールの概念を理解してください。

2.9.1. ネットワークの状態

この例のネットワークには、以下の条件があります。

  • ルーターは以下のネットワークに接続されています。

    • インターフェイス enp1s0 を介したインターネット
    • インターフェイス enp7s0 を介した内部 LAN
    • enp8s0 までの DMZ
  • ルーターのインターネットインターフェイスには、静的 IPv4 アドレス (203.0.113.1) と IPv6 アドレス (2001:db8:a::1) の両方が割り当てられています。
  • 内部 LAN のクライアントは 10.0.0.0/24 の範囲のプライベート IPv4 アドレスのみを使用します。その結果、LAN からインターネットへのトラフィックには、送信元ネットワークアドレス変換 (SNAT) が必要です。
  • 内部 LAN の管理者用 PC は、IP アドレス 10.0.0.100 および 10.0.0.200 を使用します。
  • DMZ は、198.51.100.0/24 および 2001:db8:b::/56 の範囲のパブリック IP アドレスを使用します。
  • DMZ の Web サーバーは、IP アドレス 198.51.100.5 および 2001:db8:b::5 を使用します。
  • ルーターは、LAN および DMZ 内のホストのキャッシング DNS サーバーとして機能します。

2.9.2. ファイアウォールスクリプトのセキュリティー要件

以下は、この例のネットワークにおける nftables ファイアウォールの要件です。

  • ルーターは以下を実行できる必要があります。

    • DNS クエリーを再帰的に解決します。
    • ループバックインターフェイスですべての接続を実行します。
  • 内部 LAN のクライアントは以下を実行できる必要があります。

    • ルーターで実行しているキャッシング DNS サーバーをクエリーします。
    • DMZ の HTTPS サーバーにアクセスします。
    • インターネット上の任意の HTTPS サーバーにアクセスします。
  • 管理者用の PC は、SSH を使用してルーターと DMZ 内のすべてのサーバーにアクセスできる必要があります。
  • DMZ の Web サーバーは以下を実行できる必要があります。

    • ルーターで実行しているキャッシング DNS サーバーをクエリーします。
    • インターネット上の HTTPS サーバーにアクセスして更新をダウンロードします。
  • インターネット上のホストは以下を実行できる必要があります。

    • DMZ の HTTPS サーバーにアクセスします。
  • さらに、以下のセキュリティー要件が存在します。

    • 明示的に許可されていない接続試行は破棄する。
    • パケット損失のログを記録します。

2.9.3. ドロップされたパケットをファイルにロギングするための設定

デフォルトでは、systemd は、ドロップされたパケットなどのカーネルメッセージをジャーナルに記録します。さらに、このようなエントリーを別のファイルに記録するように rsyslog サービスを設定することもできます。ログファイルが無限に大きくならないようにするために、ローテーションポリシーを設定します。

前提条件

  • rsyslog パッケージがインストールされている。
  • rsyslog サービスが実行されている。

手順

  1. 以下の内容で /etc/rsyslog.d/nftables.conf ファイルを作成します。

    :msg, startswith, "nft drop" -/var/log/nftables.log
    & stop

    この設定を使用すると、rsyslog サービスはドロップされたパケットを /var/log/messages ではなく /var/log/nftables.log ファイルに記録します。

  2. rsyslog サービスを再起動します。

    # systemctl restart rsyslog
  3. サイズが 10 MB を超える場合は、以下の内容で /etc/logrotate.d/nftables ファイルを作成し、/var/log/nftables.log をローテーションします。

    /var/log/nftables.log {
      size +10M
      maxage 30
      sharedscripts
      postrotate
        /usr/bin/systemctl kill -s HUP rsyslog.service >/dev/null 2>&1 || true
      endscript
    }

    maxage 30 設定は、次のローテーション操作中に logrotate が 30 日経過したローテーション済みログを削除することを定義します。

2.9.4. nftables スクリプトの作成とアクティブ化

この例は、RHEL ルーターで実行され、DMZ の内部 LAN および Web サーバーのクライアントを保護する nftables ファイアウォールスクリプトです。

この例で使用されているネットワークとファイアウォールの要件の詳細は、ファイアウォールスクリプトの ネットワークの状態 および ファイアウォールスクリプトのセキュリティー要件 を参照してください。

警告

この nftables ファイアウォールスクリプトは、デモ専用です。お使いの環境やセキュリティー要件に適応させて使用してください。

前提条件

手順

  1. 以下の内容で /etc/nftables/firewall.nft スクリプトを作成します。

    # Remove all rules
    flush ruleset
    
    
    # Table for both IPv4 and IPv6 rules
    table inet nftables_svc {
    
      # Define variables for the interface name
      define INET_DEV = enp1s0
      define LAN_DEV  = enp7s0
      define DMZ_DEV  = enp8s0
    
    
      # Set with the IPv4 addresses of admin PCs
      set admin_pc_ipv4 {
        type ipv4_addr
        elements = { 10.0.0.100, 10.0.0.200 }
      }
    
    
      # Chain for incoming traffic. Default policy: drop
      chain INPUT {
        type filter hook input priority filter
        policy drop
    
        # Accept packets in established and related state, drop invalid packets
        ct state vmap { established:accept, related:accept, invalid:drop }
    
        # Accept incoming traffic on loopback interface
        iifname lo accept
    
        # Allow request from LAN and DMZ to local DNS server
        iifname { $LAN_DEV, $DMZ_DEV } meta l4proto { tcp, udp } th dport 53 accept
    
        # Allow admins PCs to access the router using SSH
        iifname $LAN_DEV ip saddr @admin_pc_ipv4 tcp dport 22 accept
    
        # Last action: Log blocked packets
        # (packets that were not accepted in previous rules in this chain)
        log prefix "nft drop IN : "
      }
    
    
      # Chain for outgoing traffic. Default policy: drop
      chain OUTPUT {
        type filter hook output priority filter
        policy drop
    
        # Accept packets in established and related state, drop invalid packets
        ct state vmap { established:accept, related:accept, invalid:drop }
    
        # Accept outgoing traffic on loopback interface
        oifname lo accept
    
        # Allow local DNS server to recursively resolve queries
        oifname $INET_DEV meta l4proto { tcp, udp } th dport 53 accept
    
        # Last action: Log blocked packets
        log prefix "nft drop OUT: "
      }
    
    
      # Chain for forwarding traffic. Default policy: drop
      chain FORWARD {
        type filter hook forward priority filter
        policy drop
    
        # Accept packets in established and related state, drop invalid packets
        ct state vmap { established:accept, related:accept, invalid:drop }
    
        # IPv4 access from LAN and internet to the HTTPS server in the DMZ
        iifname { $LAN_DEV, $INET_DEV } oifname $DMZ_DEV ip daddr 198.51.100.5 tcp dport 443 accept
    
        # IPv6 access from internet to the HTTPS server in the DMZ
        iifname $INET_DEV oifname $DMZ_DEV ip6 daddr 2001:db8:b::5 tcp dport 443 accept
    
        # Access from LAN and DMZ to HTTPS servers on the internet
        iifname { $LAN_DEV, $DMZ_DEV } oifname $INET_DEV tcp dport 443 accept
    
        # Last action: Log blocked packets
        log prefix "nft drop FWD: "
      }
    
    
      # Postrouting chain to handle SNAT
      chain postrouting {
        type nat hook postrouting priority srcnat; policy accept;
    
        # SNAT for IPv4 traffic from LAN to internet
        iifname $LAN_DEV oifname $INET_DEV snat ip to 203.0.113.1
      }
    }
  2. /etc/nftables/firewall.nft スクリプトを /etc/sysconfig/nftables.conf ファイルに追加します。

    include "/etc/nftables/firewall.nft"
  3. IPv4 転送を有効にします。

    # echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf
    # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf
  4. nftables サービスを有効にして起動します。

    # systemctl enable --now nftables

検証

  1. オプション: nftables ルールセットを確認します。

    # nft list ruleset
    ...
  2. ファイアウォールが阻止するアクセスの実行を試みます。たとえば、DMZ から SSH を使用してルーターにアクセスします。

    # ssh router.example.com
    ssh: connect to host router.example.com port 22: Network is unreachable
  3. ロギング設定に応じて、以下を検索します。

    • ブロックされたパケットの systemd ジャーナル:

      # journalctl -k -g "nft drop"
      Oct 14 17:27:18 router kernel: nft drop IN : IN=enp8s0 OUT= MAC=... SRC=198.51.100.5 DST=198.51.100.1 ... PROTO=TCP SPT=40464 DPT=22 ... SYN ...
    • ブロックされたパケットの /var/log/nftables.log ファイル:

      Oct 14 17:27:18 router kernel: nft drop IN : IN=enp8s0 OUT= MAC=... SRC=198.51.100.5 DST=198.51.100.1 ... PROTO=TCP SPT=40464 DPT=22 ... SYN ...

2.10. nftables を使用した接続の量の制限

nftables を使用して、接続の数を制限したり、一定の数の接続の確立を試みる IP アドレスをブロックして、システムリソースを過剰に使用されないようにします。

2.10.1. nftables を使用した接続数の制限

nft ユーティリティーの ct count パラメーターを使用すると、IP アドレスごとの同時接続数を制限できます。たとえば、この機能を使用すると、各送信元 IP アドレスがホストへの並列 SSH 接続を 2 つだけ確立できるように設定できます。

手順

  1. inet アドレスファミリーを使用して filter テーブルを作成します。

    # nft add table inet filter
  2. input チェーンを inet filter テーブルに追加します。

    # nft add chain inet filter input { type filter hook input priority 0 \; }
  3. IPv4 アドレスの動的セットを作成します。

    # nft add set inet filter limit-ssh { type ipv4_addr\; flags dynamic \;}
  4. IPv4 アドレスからの SSH ポート (22) への同時着信接続を 2 つだけ許可し、同じ IP からのそれ以降の接続をすべて拒否するルールを、input チェーンに追加します。

    # nft add rule inet filter input tcp dport ssh ct state new add @limit-ssh { ip saddr ct count over 2 } counter reject

検証

  1. 同じ IP アドレスからホストへの新しい同時 SSH 接続を 2 つ以上確立します。すでに 2 つの接続が確立されている場合、Nftables が SSH ポートへの接続を拒否します。
  2. limit-ssh 動的セットを表示します。

    # nft list set inet filter limit-ssh
    table inet filter {
      set limit-ssh {
        type ipv4_addr
        size 65535
        flags dynamic
        elements = { 192.0.2.1 ct count over 2 , 192.0.2.2 ct count over 2 }
      }
    }

    elements エントリーは、現時点でルールに一致するアドレスを表示します。この例では、elements は、SSH ポートへのアクティブな接続がある IP アドレスを一覧表示します。出力には、アクティブな接続の数を表示しないため、接続が拒否された場合は表示されないことに注意してください。

2.10.2. 1 分以内に新しい着信 TCP 接続を 11 個以上試行する IP アドレスのブロック

1 分以内に 11 個以上の IPv4 TCP 接続を確立しているホストを一時的にブロックできます。

手順

  1. ip アドレスファミリーを使用して filter テーブルを作成します。

    # nft add table ip filter
  2. input チェーンを filter テーブルに追加します。

    # nft add chain ip filter input { type filter hook input priority 0 \; }
  3. filter テーブルに denylist という名前のセットを追加します。

    # nft add set ip filter denylist { type ipv4_addr \; flags dynamic, timeout \; timeout 5m \; }

    このコマンドは、IPv4 アドレスの動的セットを作成します。timeout 5m パラメーターを定義すると、セットが古いエントリーでいっぱいになるのを防ぐために、nftables によって 5 分後にエントリーが自動的に削除されます。

  4. 1 分以内に 11 個以上の新しい TCP 接続を確立しようとするホストのソース IP アドレスを denylist セットに自動的に追加するルールを追加します。

    # nft add rule ip filter input ip protocol tcp ct state new, untracked add @denylist { ip saddr limit rate over 10/minute } drop

2.11. nftables ルールのデバッグ

nftables フレームワークは、管理者がルールをデバッグし、パケットがそれに一致するかどうかを確認するためのさまざまなオプションを提供します。

2.11.1. カウンターによるルールの作成

ルールが一致しているかどうかを確認するには、カウンターを使用できます。

前提条件

  • ルールを追加するチェーンが存在する。

手順

  1. counter パラメーターで新しいルールをチェーンに追加します。以下の例では、ポート 22 で TCP トラフィックを許可し、このルールに一致するパケットとトラフィックをカウントするカウンターを使用するルールを追加します。

    # nft add rule inet example_table example_chain tcp dport 22 counter accept
  2. カウンター値を表示するには、次のコマンドを実行します。

    # nft list ruleset
    table inet example_table {
      chain example_chain {
        type filter hook input priority filter; policy accept;
        tcp dport ssh counter packets 6872 bytes 105448565 accept
      }
    }

2.11.2. 既存のルールへのカウンターの追加

ルールが一致しているかどうかを確認するには、カウンターを使用できます。

前提条件

  • カウンターを追加するルールがある。

手順

  1. チェーンのルール (ハンドルを含む) を表示します。

    # nft --handle list chain inet example_table example_chain
    table inet example_table {
      chain example_chain { # handle 1
        type filter hook input priority filter; policy accept;
        tcp dport ssh accept # handle 4
      }
    }
  2. ルールの代わりに、counter パラメーターを使用してカウンターを追加します。以下の例は、前の手順で表示したルールの代わりに、カウンターを追加します。

    # nft replace rule inet example_table example_chain handle 4 tcp dport 22 counter accept
  3. カウンター値を表示するには、次のコマンドを実行します。

    # nft list ruleset
    table inet example_table {
      chain example_chain {
        type filter hook input priority filter; policy accept;
        tcp dport ssh counter packets 6872 bytes 105448565 accept
      }
    }

2.11.3. 既存のルールに一致するパケットの監視

ルールに一致するパケットを表示するには、nftables のトレース機能と nft monitor コマンドを組み合わせて使用できます。ルールのトレースを有効にして、トレースを使用してこのルールに一致するパケットを監視できます。

前提条件

  • カウンターを追加するルールがある。

手順

  1. チェーンのルール (ハンドルを含む) を表示します。

    # nft --handle list chain inet example_table example_chain
    table inet example_table {
      chain example_chain { # handle 1
        type filter hook input priority filter; policy accept;
        tcp dport ssh accept # handle 4
      }
    }
  2. ルールを置き換えてトレース機能を追加しますが、meta nftrace set 1 パラメーターを使用します。以下の例は、前の手順で表示したルールの代わりに、トレースを有効にします。

    # nft replace rule inet example_table example_chain handle 4 tcp dport 22 meta nftrace set 1 accept
  3. nft monitor コマンドを使用して、トレースを表示します。以下の例は、コマンドの出力をフィルタリングして、inet example_table example_chain が含まれるエントリーのみを表示します。

    # nft monitor | grep "inet example_table example_chain"
    trace id 3c5eb15e inet example_table example_chain packet: iif "enp1s0" ether saddr 52:54:00:17:ff:e4 ether daddr 52:54:00:72:2f:6e ip saddr 192.0.2.1 ip daddr 192.0.2.2 ip dscp cs0 ip ecn not-ect ip ttl 64 ip id 49710 ip protocol tcp ip length 60 tcp sport 56728 tcp dport ssh tcp flags == syn tcp window 64240
    trace id 3c5eb15e inet example_table example_chain rule tcp dport ssh nftrace set 1 accept (verdict accept)
    ...
    警告

    nft monitor コマンドは、トレースが有効になっているルールの数と、一致するトラフィックの量に応じて、大量の出力を表示できます。grep などのユーティリティーを使用して出力をフィルタリングします。

2.12. nftables ルールセットのバックアップと復元

nftables ルールをファイルにバックアップし、後で復元できます。また、管理者はルールが含まれるファイルを使用して、たとえばルールを別のサーバーに転送できます。

2.12.1. ファイルへの nftables ルールセットのバックアップ

nft ユーティリティーを使用して、nftables ルールセットをファイルにバックアップできます。

手順

  • nftables ルールのバックアップを作成するには、次のコマンドを実行します。

    • nft list ruleset 形式で生成された形式の場合:

      # nft list ruleset > file.nft
    • JSON 形式の場合は、以下のようになります。

      # nft -j list ruleset > file.json

2.12.2. ファイルからの nftables ルールセットの復元

ファイルから nftables ルールセットを復元できます。

手順

  • nftables ルールを復元するには、以下を行います。

    • 復元するファイルが、nft list ruleset が生成した形式であるか、nft コマンドを直接含んでいる場合は、以下のコマンドを実行します。

      # nft -f file.nft
    • 復元するファイルが JSON 形式の場合は、次のコマンドを実行します。

      # nft -j -f file.json

2.13. フローテーブルを使用した nftables パケット転送の高速化

nftables ユーティリティーは、確立された接続のデータパケットを高速化するための fastpath 機能ベースの flowtable メカニズムを提供する Netfilter フレームワークを使用します。

フローテーブルメカニズムには次の機能があります。

  • 接続追跡を使用して、従来のパケット転送パスをバイパスします。
  • 従来のパケット処理をバイパスすることで、ルーティングテーブルの再参照を回避します。
  • TCP および UDP プロトコルでのみ動作します。
  • ハードウェアに依存しないソフトウェア高速パスです。

手順

  1. inet ファミリーの example-table テーブルを追加します。

    # nft add table inet <example-table>
  2. 優先度タイプとして ingress フックと filter を含む example-flowtable フローテーブルを追加します。

    # nft add flowtable inet <example-table> <example-flowtable> { hook ingress priority filter \; devices = { example_device_one, example_device_two } \; }
  3. example-forwardchain フローをパケット処理テーブルからフローテーブルに追加します。

    # nft add chain inet <example-table> <example-forwardchain> { type filter hook forward priority filter \; }

    このコマンドは、forward フックと filter 優先度を備えた filter タイプのフローテーブルを追加します。

  4. established 接続追跡状態を含むルールを追加して、example-flowtable フローをオフロードします。

    # nft add rule inet <example-table> <example-forwardchain> ct state { established, related } flow add @<example-flowtable>

検証

  • example-table のプロパティーを確認します。

    # nft list table inet <example-table>
    table inet example-table {
          flowtable example-flowtable {
            hook ingress priority filter
               devices = { example_device_one, example_device_two }
          }
    
          chain example-forwardchain {
    type filter hook forward priority filter; policy accept;
    ct state established flow add @example-flowtable
        }
    }

2.14. iptables から nftables への移行

ファイアウォール設定が依然として iptables ルールを使用している場合は、iptables ルールを nftables に移行できます。

重要

ipset パッケージおよび iptables-nft パッケージは、Red Hat Enterprise Linux 9 で非推奨になりました。これには、iptablesip6tablesarptables、および ebtables ユーティリティーなどの nft-variants の非推奨化が含まれます。たとえば、以前の RHEL バージョンからアップグレードしたために、これらのツールをまだ使用している場合は、nftables パッケージによって提供される nft コマンドラインツールに移行してください。

2.14.1. 非推奨となった iptables フレームワークの概念

現在も活発にメンテナンスされている nftables フレームワークと同様に、非推奨となった iptables フレームワークでも、さまざまなパケットフィルタリング、ログ記録と監査、NAT 関連の設定タスクを実行できます。

iptables フレームワークは複数のテーブルに構造化されています。各テーブルは特定の目的のために設計されています。

filter
デフォルトのテーブル。一般的なパケットフィルタリングを提供します。
nat
ネットワークアドレス変換 (NAT) 用。パケットの送信元アドレスと宛先アドレスの変更が含まれます。
mangle
特定のパケット変更に関しては、高度なルーティング決定のためにパケットヘッダーを変更することをサポートします。
raw
接続追跡の前に必要な設定。

これらのテーブルは、個別のカーネルモジュールとして実装されています。各テーブルは、INPUTOUTPUTFORWARD など、一定の組み込みチェーンのセットを提供します。チェーンは、パケットの評価基準となる一連のルールです。このチェーンは、カーネル内のパケット処理フローの特定のポイントにフックします。チェーンの名前は異なるテーブル間で同じですが、チェーンの実行順序はそれぞれのフックの優先順位によって決まります。ルールが正しい順序で適用されるように、優先順位はカーネルによって内部的に管理されます。

元々は IPv4 トラフィック向けに設計された iptables フレームワークは、後に ip6tables ユーティリティーによって補完され、IPv6 パケットのファイアウォールルール管理をサポートするようになった。同様に、arptables は Address Resolution Protocol (ARP) トラフィック用に開発され、ebtables は イーサネットブリッジングフレーム用に作成されました。これらのユーティリティーは、iptables のパケットフィルタリング機能を複数のプロトコルに拡張し、包括的なネットワークカバレッジを保証します。

iptables の機能を強化するために、機能拡張の開発が開始されました。通常、機能拡張は、ユーザー空間の動的共有オブジェクト (DSO) とペアになったカーネルモジュールとして実装されます。この拡張により、"マッチ" と "ターゲット" が導入されます。これらをファイアウォールルールで使用すると、より高度な操作を実行できます。拡張機能は、複雑なマッチングやターゲットを実装できます。たとえば、特定のレイヤー 4 プロトコルヘッダー値をマッチさせたり操作したり、レート制限を実行したり、クォータを適用したりすることができます。一部の拡張は、デフォルトの iptables 構文の制限に対処するように設計されています ("マルチポート" マッチ拡張など)。この拡張により、単一のルールを複数の非連続ポートにマッチさせることができるため、ルール定義が簡素化され、必要な個別のルールの数を減らすことができます。

ipset は、iptables に対する特別な種類の機能拡張です。これはカーネルレベルのデータ構造であり、パケットとマッチできる IP アドレス、ポート番号、その他のネットワーク関連要素のコレクションを作成するために、iptables と一緒に使用されます。これらのセットにより、ファイアウォールルールの作成と管理のプロセスが大幅に効率化、最適化、高速化されます。

詳細は、システム上の iptables(8) man ページを参照してください。

2.14.2. iptables および ip6tables ルールセットの nftables への変換

iptables-restore-translate ユーティリティーおよび ip6tables-restore-translate ユーティリティーを使用して、iptables および ip6tables ルールセットを nftables に変換します。

前提条件

  • nftables パッケージおよび iptables パッケージがインストールされている。
  • システムに iptables ルールおよび ip6tables ルールが設定されている。

手順

  1. iptables ルールおよび ip6tables ルールをファイルに書き込みます。

    # iptables-save >/root/iptables.dump
    # ip6tables-save >/root/ip6tables.dump
  2. ダンプファイルを nftables 命令に変換します。

    # iptables-restore-translate -f /root/iptables.dump > /etc/nftables/ruleset-migrated-from-iptables.nft
    # ip6tables-restore-translate -f /root/ip6tables.dump > /etc/nftables/ruleset-migrated-from-ip6tables.nft
  3. 必要に応じて、生成された nftables ルールを手動で更新して、確認します。
  4. nftables サービスが生成されたファイルをロードできるようにするには、以下を /etc/sysconfig/nftables.conf ファイルに追加します。

    include "/etc/nftables/ruleset-migrated-from-iptables.nft"
    include "/etc/nftables/ruleset-migrated-from-ip6tables.nft"
  5. iptables サービスを停止し、無効にします。

    # systemctl disable --now iptables

    カスタムスクリプトを使用して iptables ルールを読み込んだ場合は、スクリプトが自動的に開始されなくなったことを確認し、再起動してすべてのテーブルをフラッシュします。

  6. nftables サービスを有効にして起動します。

    # systemctl enable --now nftables

検証

  • nftables ルールセットを表示します。

    # nft list ruleset

2.14.3. 単一の iptables および ip6tables ルールセットの nftables への変換

RHEL は、iptables ルールまたは ip6tables ルールを、nftables で同等のルールに変換する iptables-translate ユーティリティーおよび ip6tables-translate ユーティリティーを提供します。

前提条件

  • nftables パッケージがインストールされている。

手順

  • 以下のように、iptables または ip6tables の代わりに iptables-translate ユーティリティーまたは ip6tables-translate ユーティリティーを使用して、対応する nftables ルールを表示します。

    # iptables-translate -A INPUT -s 192.0.2.0/24 -j ACCEPT
    nft add rule ip filter INPUT ip saddr 192.0.2.0/24 counter accept

    拡張機能によっては変換機能がない場合もあります。このような場合には、ユーティリティーは、以下のように、前に # 記号が付いた未変換ルールを出力します。

    # iptables-translate -A INPUT -j CHECKSUM --checksum-fill
    nft # -A INPUT -j CHECKSUM --checksum-fill

2.14.4. 一般的な iptables コマンドと nftables コマンドの比較

以下は、よく使用される iptables コマンドと nftables コマンドの比較です。

  • すべてのルールをリスト表示します。

    Expand
    iptablesnftables

    iptables-save

    nft list ruleset

  • 特定のテーブルおよびチェーンをリスト表示します。

    Expand
    iptablesnftables

    iptables -L

    nft list table ip filter

    iptables -L INPUT

    nft list chain ip filter INPUT

    iptables -t nat -L PREROUTING

    nft list chain ip nat PREROUTING

    nft コマンドは、テーブルおよびチェーンを事前に作成しません。これらは、ユーザーが手動で作成した場合にのみ存在します。

    firewalld によって生成されたルールの一覧表示:

    # nft list table inet firewalld
    # nft list table ip firewalld
    # nft list table ip6 firewalld

第3章 XDP と eBPF のスタートガイド

eXpress Data Path (XDP) と extended Berkeley Packet Filter (eBPF) の機能は、高速ネットワークにおいて強力な組み合わせとなります。XDP はパケット処理の初期段階において高性能なフレームワークを提供します。一方、eBPF はカーネル内での安全で動的なプログラム実行を可能にします。

XDP と eBPF の相乗効果により、ネットワークパフォーマンスが向上し、堅牢なトラフィックの追跡、フィルタリング、監視が可能になります。

3.1. RHEL 10 の eBPF ネットワーク機能について

eBPF (extended Berkeley Packet Filter) は、カーネル領域でのコード実行を可能にするカーネル内の仮想マシンです。このコードは、限られた一連の関数にのみアクセスできる制限付きサンドボックス環境で実行されます。

ネットワークでは、eBPF を使用してカーネルパケット処理を補完したり、置き換えることができます。使用するフックに応じて、eBPF プログラムには以下のような記述があります。

  • パケットデータおよびメタデータへの読み取りおよび書き込みアクセス
  • ソケットとルートを検索できる
  • ソケットオプションを設定できる
  • パケットをリダイレクト可能

3.1.1. RHEL 10 におけるネットワーク eBPF 機能の概要

開発者は、Extended Berkeley Packet Filter (eBPF) を使用することで、Linux カーネル内でサンドボックス化されたプログラムを実行できます。ネットワークトラフィックを管理するには、特定のフックで eBPF プログラムを設定し、データの検査、変更、フィルタリングを行います。

eBPF (extended Berkeley Packet Filter) ネットワークプログラムは、RHEL の以下のフックに割り当てることができます。

  • eXpress Data Path (XDP): カーネルネットワークスタックが受信したパケットを処理する前に、このパケットへの早期アクセスを提供します。
  • tc eBPF 分類子 (direct-action フラグ): ingress および egress で強力なパケット処理を提供します。プログラムは、qdisc 階層内の direct-action フラグを使用して eBPF 分類子として割り当てることも、リンクベースの tcx API を使用して割り当てることもできます。
  • Control Groups version 2 (cgroup v2): コントロールグループ内のプログラムが実行するソケットベースの操作のフィルタリングおよび上書きを有効にします。
  • ソケットフィルタリング: ソケットから受信したパケットのフィルタリングを有効にします。この機能は、従来の Berkeley Packet Filter (cBPF) でも利用できますが、eBPF プログラムに対応するために拡張されました。
  • ストリームパーサー : 個別のメッセージへのストリームの分散、フィルタリング、ソケットへのリダイレクトを有効にします。
  • SO_REUSEPORT ソケットの選択: reuseport ソケットグループから受信したソケットをプログラム可能な選択を提供します。
  • flow dissector: 特定の状況でカーネルがパケットヘッダーを解析する方法をオーバーライドします。
  • TCP 輻輳制御コールバック: カスタム TCP 輻輳制御アルゴリズムの実装を有効にします。
  • カプセル化によるルート: カスタムのトンネルカプセル化の作成を有効にします。
  • Netfilter: カスタム Netfilter フックの実装を有効にします。

    XDP

    BPF_PROG_TYPE_XDP タイプのプログラムはネットワークインターフェイスに割り当てることができます。カーネルは、受信したパケットに対してプログラムを実行し、その後カーネルのネットワークスタックがパケットの処理を開始します。これにより、高速パケットドロップなど、特定の状況で高速なパケット転送が可能になり、負荷分散シナリオにおいて DDoS (Distributed Denial of Service) 攻撃や高速パケットリダイレクトを防ぐことができます。

    さまざまな形式のパケット監視やサンプリングに XDP を使用することもできます。カーネルは、XDP プログラムはパケットを変更し、カーネルネットワークスタックへのさらなる処理を可能にします。

    以下の XDP モードを使用できます。

    • ネイティブ (ドライバー)XDP: カーネルはパケット受信中の可能な限り早い時点からプログラムを実行します。この時点で、カーネルはパケットを解析しなかったため、カーネルが提供するメタデータは利用できません。このモードでは、ネットワークインターフェイスドライバーが XDP をサポートしている必要がありますが、すべてのドライバーがこのネイティブモードをサポートするわけではありません。
    • 汎用 XDP: カーネルネットワークスタックは、処理の早い段階で XDP プログラムを実行します。この時点で、カーネルデータ構造が割り当てられ、パケットを事前に処理しています。パケットをドロップまたはリダイレクトする必要がある場合は、ネイティブモードと比較して大きなオーバーヘッドが必要になります。ただし、汎用モードはネットワークインターフェイスドライバーのサポートを必要とせず、すべてのネットワークインターフェイスで機能します。
    • オフロードされた XDP: カーネルは、ホスト CPU ではなくネットワークインターフェイス上で XDP プログラムを実行します。これには特定のハードウェアが必要で、特定の eBPF 機能のみがこのモードで使用できることに注意してください。

    RHEL で、libxdp ライブラリーを使用してすべての XDP プログラムを読み込みます。このライブラリーは、XDP のシステム制御を可能にします。

    注記

    現在、XDP プログラムにはシステム設定に制限があります。たとえば、受信側インターフェイスで特定のハードウェアオフロード機能を無効にする必要があります。また、ネイティブモードをサポートするすべてのドライバーで利用可能なわけではありません。

    RHEL 10 では、libxdp ライブラリーを使用してプログラムをカーネルにロードする場合にのみ、Red Hat は XDP 機能をサポートします。

    AF_XDP
    指定した AF_XDP ソケットにパケットをフィルターしてリダイレクトする XDP プログラムを使用すると、AF_XDP プロトコルファミリーから 1 つ以上のソケットを使用して、カーネルからユーザー空間にパケットを速やかにコピーできます。
    トラフィック制御

    Traffic Control (tc) サブシステムは、以下のタイプの eBPF プログラムを提供します。

    • BPF_PROG_TYPE_SCHED_CLS
    • BPF_PROG_TYPE_SCHED_ACT

    これらのタイプを使用すると、カスタム tc 分類子と tc アクションを eBPF に記述できます。これは、tc エコシステムの一部とともに、強力なパケット処理機能を提供します。また、複数のコンテナーネットワークオーケストレーションソリューションの中核となります。

    ほとんどの場合、分類器のみが使用されます。直接アクションフラグの場合と同様に、eBPF 分類器は同じ eBPF プログラムから直接アクションを実行できます。clsact Queueing Discipline (qdisc) は、Ingress 側でこれを有効にするように設計されています。

    flow dissector の eBPF プログラムは、flower などのその他の qdiscstc 分類子の操作に影響を与える可能性があることに注意してください。

    リンクベースの tcx API は、qdisc API とともに提供されます。これにより、アプリケーションが BPF プログラムの所有権を維持し、BPF プログラムが誤って削除されるのを防ぐことができます。また、tcx API にはマルチプログラムサポートがあり、複数のアプリケーションが tc レイヤーに BPF プログラムを並行して接続できます。

    ソケットフィルター

    複数のユーティリティーは、ソケットで受信されるパケットのフィルタリングに、従来の Berkeley Packet Filter (cBPF) を使用または使用しています。たとえば、tcpdump ユーティリティーでは、式を指定することができ、tcpdump は それを cBPF コードに変換します。

    cBPF の代替として、カーネルは、同じ目的で BPF_PROG_TYPE_SOCKET_FILTER タイプの eBPF プログラムを許可します。

    コントロールグループ

    RHEL では、cgroup に割り当てられる eBPF プログラムを複数使用できます。カーネルは、指定された cgroup 内のプログラムが操作を実行する際に、これらのプログラムを実行します。cgroups バージョン 2 のみを使用できます。

    RHEL では、以下のネットワーク関連の cgroup eBPF プログラムが利用できます。

    • BPF_PROG_TYPE_SOCK_OPS: カーネルはさまざまな TCP イベントでこのプログラムを呼び出します。プログラムは、カスタム TCP ヘッダーオプションなどを含め、カーネル TCP スタックの動作を調整できます。
    • BPF_PROG_TYPE_CGROUP_SOCK_ADDR: カーネルは、connectbindsendtorecvmsggetpeername、および getsockname の操作中にこのプログラムを呼び出します。このプログラムは、IP アドレスとポートを変更できます。これは、ソケットベースのネットワークアドレス変換 (NAT) を eBPF に実装する場合に便利です。
    • BPF_PROG_TYPE_CGROUP_SOCKOPT: カーネルは、setsockopt および getsockopt 操作時にこのプログラムを呼び出して、オプションの変更を可能にします。
    • BPF_PROG_TYPE_CGROUP_SOCK: カーネルは、ソケットの作成時、ソケットの開放時、アドレスのバインド時にこのプログラムを呼び出します。これらのプログラムを使用して操作を許可または拒否するか、統計のソケット作成の検査のみを行います。
    • BPF_PROG_TYPE_CGROUP_SKB: このプログラムは ingress および egress の個別のパケットをフィルターし、パケットを受信または拒否できます。
    ストリームパーサー

    ストリームパーサーは、特別な eBPF マップに追加されるソケットのグループで動作します。次に、eBPF プログラムは、カーネルがこれらのソケットで受信または送信するパケットを処理します。

    RHEL では、以下のストリームパーサー eBPF プログラムを利用できます。

    • BPF_PROG_TYPE_SK_SKB: eBPF プログラムは、ソケットで受信したパケットを個別のメッセージに解析し、それらのメッセージを破棄するか、受け入れるか、別のソケットに送信するかをカーネルに指示します。
    • BPF_PROG_TYPE_SK_MSG: このプログラムは egress メッセージをフィルタリングします。eBPF プログラムはパケットを解析し、承認または拒否します。
    SO_REUSEPORT ソケットの選択
    このソケットオプションを使用することで、複数のソケットを同じ IP アドレスとポートにバインドできます。eBPF がない場合、カーネルは接続ハッシュに基づいて受信ソケットを選択します。BPF_PROG_TYPE_SK_REUSEPORT プログラムを使用すると、受信ソケットの選択が完全にプログラム可能になります。
    Flow dissector
    カーネルが完全なプロトコルデコードを実行せずにパケットヘッダーを処理する必要がある場合、そのパケットは詳細に解析 (dissected) されます。たとえば、これは、tc サブシステム、ボンディングのルーティング、またはパケットのハッシュを計算する際に発生します。この場合、カーネルはパケットヘッダーを解析し、パケットヘッダーからの情報を使用して内部構造を埋めます。この内部解析は、BPF_PROG_TYPE_FLOW_DISSECTOR プログラムを使用して置き換えることができます。RHEL の eBPF では、TCP および UDP を IPv4 および IPv6 上でのみ破棄できます。
    TCP 輻輳制御
    struct tcp_congestion_oops コールバックを実装する BPF_PROG_TYPE_STRUCT_OPS プログラムのグループを使用して、カスタム TCP 輻輳制御アルゴリズムを作成できます。この方法を実装するアルゴリズムは、ビルトインのカーネルアルゴリズムとともにシステムで利用できます。
    カプセル化によるルート

    以下のいずれかの eBPF プログラムタイプは、トンネルのカプセル化属性として、ルーティングテーブルのルートに割り当てることができます。

    • BPF_PROG_TYPE_LWT_IN
    • BPF_PROG_TYPE_LWT_OUT
    • BPF_PROG_TYPE_LWT_XMIT
    • BPF_PROG_TYPE_LWT_SEG6LOCAL (テクノロジープレビュー)

    このような eBPF プログラムの機能は、特定のトンネル設定に制限されており、汎用的なカプセル化またはカプセル化解除ソリューションを作成することはできません。

    ソケットルックアップ
    bind システムコールの制限を回避するには、BPF_PROG_TYPE_SK_LOOKUP タイプの eBPF プログラムを使用します。このようなプログラムは、新しい受信 TCP 接続のリスニングソケットまたは UDP パケットの非接続ソケットを選択できます。
    Netfilter
    BPF_PROG_TYPE_NETFILTER タイプを使用して、カスタムの Netfilter フックを実装できます。このようなフックは Netfilter インフラストラクチャーに統合され、パケットの読み取り専用アクセス権を持ち、パケットをドロップまたは受信できます。必要に応じて、eBPF プログラムは IP フラグメントの再設定後に、再構成されたパケットで実行できます。

3.1.2. RHEL 10 におけるネットワークカードごとの XDP 機能の概要

RHEL で使用できる XDP 機能は、ネットワークカードとそのドライバーによって異なります。

以下は、XDP 対応ネットワークカードと、それらで使用できる XDP 機能の概要です。

Expand
ネットワークカードドライバーRed Hat のサポート状況ベーシックリダイレクトターゲットZero-copyLarge MTU

Amazon Elastic Network Adapter

ena

enabled

はい

はい

はい [a]

いいえ

いいえ

aQuantia AQtion イーサネットカード

atlantic

enabled

はい

はい

はい

いいえ

はい

Broadcom NetXtreme-C/E 10/25/40/50 gigabit Ethernet

bnxt_en

supported

はい

はい

はい [a]

いいえ

はい

Cavium Thunder Virtual function

nicvf

enabled

はい

いいえ

いいえ

いいえ

いいえ

Freescale DPAA2 Ethernet

fsl-dpaa2-eth

enabled

はい

はい

はい

はい [b]

いいえ

Google Virtual NIC (gVNIC) のサポート

gve

enabled

はい

はい

はい

はい

いいえ

Intel® 10GbE PCI Express Virtual Function Ethernet

ixgbevf

enabled

はい

いいえ

いいえ

いいえ

いいえ

Intel® 10GbE PCI Express adapters

ixgbe

enabled

はい

はい

はい [a]

はい

はい [c]

Intel® Ethernet Connection E800 Series

ice

supported

はい

はい

はい [a]

はい

はい

Intel® Ethernet Controller I225-LM/I225-V family

igc

supported

はい

はい

はい [a]

はい

はい [c]

Intel® PCI Express Gigabit adapters

igb

enabled

はい

はい

はい [a]

いいえ

はい [c]

Intel® Ethernet Controller XL710 Family

i40e

supported

はい

はい

はい [a] [d]

はい

いいえ

Marvell OcteonTX2

rvu_nicpf

enabled

はい

はい

はい [a] [d]

いいえ

いいえ

Mellanox 5th generation network adapters (ConnectX series)

mlx5_core

supported

はい

はい

はい [d]

はい

はい

Mellanox Technologies 1/10/40Gbit Ethernet

mlx4_en

enabled

はい

はい

いいえ

いいえ

いいえ

Microsoft Azure Network Adapter

mana

enabled

はい

はい

はい

いいえ

いいえ

Microsoft Hyper-V virtual network

hv_netvsc

enabled

はい

はい

はい

いいえ

いいえ

Netronome® NFP4000/NFP6000 NIC [e]

nfp

enabled

はい

いいえ

いいえ

はい

いいえ

NXP ENETC Gigabit Ethernet

fsl-enetc

enabled

はい

はい

はい

いいえ

はい

NXP Fast Ethernet Controller

fec

enabled

はい

はい

いいえ

いいえ

いいえ

Pensando Ethernet Adapter

ionic

enabled

はい

はい

はい

いいえ

はい

QEMU Virtio network

virtio_net

supported

はい

はい

はい [a]

いいえ

はい

QLogic QED 25/40/100Gb Ethernet NIC

qede

enabled

はい

はい

はい

いいえ

いいえ

QorIQ DPAA Ethernet

fsl_dpa

enabled

はい

はい

はい

いいえ

いいえ

STMicroelectronics Multi-Gigabit Ethernet

stmmac

enabled

はい

はい

はい

はい

いいえ

Solarflare SFC9000/SFC9100/EF100-family

sfc

enabled

はい

はい

はい [d]

いいえ

いいえ

Universal TUN/TAP device

tun

enabled

はい

はい

はい

いいえ

いいえ

Virtual ethernet pair device

veth

supported

はい

はい

はい

いいえ

はい

VMware VMXNET3 イーサネットドライバー

vmxnet3

enabled

はい

はい

はい [a] [d]

いいえ

いいえ

Xen 準仮想ネットワークデバイス

xen-netfront

enabled

はい

はい

はい

いいえ

いいえ

[a] インターフェイスに XDP プログラムが読み込まれている場合のみ。
[b] すべてのハードウェアリビジョンで使用できるわけではありません。
[c] 送信側のみ。XDP 経由で大きなパケットを受信することはできません。
[d] CPU ごとに少なくとも 1 つの XDP TX キューが必要です。たとえば、キューの数は最大の CPU インデックスよりも大きくなければなりません。
[e] リストされている機能の一部は、Netronome® NFP3800 NIC では使用できません。

説明:

  • Red Hat のサポート状況:

    • supported: Red Hat はこのドライバーが提供する XDP 機能を完全にサポートしています。
    • enabled: XDP 機能はアップストリームドライバーによって提供されます。Red Hat は、特定された問題に対してベストエフォート形式で対応しますが、このハードウェアは社内で実施する品質保証テストにおいて対象外の項目もあります。
  • Basic: 基本的な戻りコード (DROPPASSABORTED、および TX) をサポートします。
  • リダイレクト: XDP_REDIRECT 戻りコードをサポートします。
  • ターゲット: XDP_REDIRECT 戻りコードのターゲットになることができます。
  • zero-copy: AF_XDP プロトコルファミリーの zero-copy モードをサポートします。
  • 大きな MTU: ページサイズより大きいパケットをサポートします。

3.2. BPF コンパイラーコレクションを使用したネットワークトレース

BPF コンパイラーコレクション (BCC) は、eBPF (extended Berkeley Packet Filter) プログラムの作成を容易にするライブラリーです。eBPF プログラムの主なユーティリティーは、オーバーヘッドやセキュリティー上の問題が発生することなく、オペレーティングシステムのパフォーマンスおよびネットワークパフォーマンスを分析することです。

BCC により、ユーザーは eBPF の技術詳細を把握する必要がなくなり、事前に作成した eBPF プログラムを含む bcc-tools パッケージなど、多くの標準スタートポイントを利用できます。

注記

eBPF プログラムは、ディスク I/O、TCP 接続、プロセス作成などのイベントでトリガーされます。これらのプログラムはカーネル内の安全な仮想マシン上で実行されるため、カーネルのクラッシュ、ループ、応答不能を引き起こす可能性は低い。

3.2.1. bcc-tools パッケージのインストール

bcc-tools パッケージをインストールします。これにより、依存関係として BPF Compiler Collection (BCC) ライブラリーもインストールされます。

手順

  • bcc-tools をインストールします。

    # dnf install bcc-tools

    BCC ツールは、/usr/share/bcc/tools/ ディレクトリーにインストールされます。

検証

  • インストールされたツールを検査します。

    # ls -l /usr/share/bcc/tools/
    ...
    -rwxr-xr-x. 1 root root  4198 Dec 14 17:53 dcsnoop
    -rwxr-xr-x. 1 root root  3931 Dec 14 17:53 dcstat
    -rwxr-xr-x. 1 root root 20040 Dec 14 17:53 deadlock_detector
    -rw-r--r--. 1 root root  7105 Dec 14 17:53 deadlock_detector.c
    drwxr-xr-x. 3 root root  8192 Mar 11 10:28 doc
    -rwxr-xr-x. 1 root root  7588 Dec 14 17:53 execsnoop
    -rwxr-xr-x. 1 root root  6373 Dec 14 17:53 ext4dist
    -rwxr-xr-x. 1 root root 10401 Dec 14 17:53 ext4slower
    ...

    リスト内の doc ディレクトリーには、各ツールのドキュメントが含まれています。

3.2.2. カーネルの受け入れキューに追加された TCP 接続の表示

tcpaccept ユーティリティーを使用すると、カーネルの accept() 関数をトレースして、新しく許可された接続を監視できます。

カーネルは、TCP 3 方向ハンドシェイクで ACK パケットを受け取ると、カーネルは接続の状態が ESTABLISHED に変更された後に SYN キューから accept キューに移動します。そのため、正常な TCP 接続だけがこのキューに表示されます。

tcpaccept ユーティリティーは、eBPF 機能を使用して、カーネルが accept キューに追加するすべての接続を表示します。このユーティリティーは、パケットをキャプチャーしてフィルタリングする代わりにカーネルの accept() 関数を追跡するため、軽量です。たとえば、一般的なトラブルシューティングには tcpaccept を使用して、サーバーが許可した新しい接続を表示します。

手順

  1. 次のコマンドを実行して、カーネルの accept キューのトレースを開始します。

    # /usr/share/bcc/tools/tcpaccept
    PID   COMM      IP RADDR         RPORT  LADDR    LPORT
    843   sshd      4  192.0.2.17    50598  192.0.2.1  22
    1107  ns-slapd  4  198.51.100.6  38772  192.0.2.1  389
    1107  ns-slapd  4  203.0.113.85  38774  192.0.2.1  389
    ...

    カーネルが接続を受け入れるたびに、tcpaccept は接続の詳細を表示します。

    詳細は、システム上の tcpaccept(8) man ページと /usr/share/bcc/tools/doc/tcpaccept_example.txt ファイルを参照してください。

  2. Ctrl+C を押して、追跡プロセスを停止します。

3.2.3. 発信 TCP 接続試行の追跡

tcpconnect ユーティリティーは、eBPF 機能を使用して発信 TCP 接続の試行を追跡します。ユーティリティーの出力には、失敗した接続も含まれます。

tcpconnect ユーティリティーは、パケットを取得してフィルタリングするのではなく、カーネルの connect() 関数などを追跡するため、軽量です。

手順

  1. 以下のコマンドを入力し、すべての発信接続を表示する追跡プロセスを開始します。

    # /usr/share/bcc/tools/tcpconnect
    PID    COMM         IP SADDR      DADDR          DPORT
    31346  curl         4  192.0.2.1  198.51.100.16  80
    31348  telnet       4  192.0.2.1  203.0.113.231  23
    31361  isc-worker00 4  192.0.2.1  192.0.2.254    53
    ...

    カーネルが発信接続を処理するたびに、tcpconnect は、接続の詳細を表示します。

    詳細は、システム上の tcpconnect(8) man ページと /usr/share/bcc/tools/doc/tcpconnect_example.txt ファイルを参照してください。

  2. Ctrl+C を押して、追跡プロセスを停止します。

3.2.4. 発信 TCP 接続のレイテンシーの測定

tcpconnlat ユーティリティーは、eBPF 機能を使用して、送信した SYN パケットと受信した応答パケットの時間を測定します。

TCP 接続のレイテンシーは、接続を確立するのにかかった時間です。通常、これには、アプリケーションのランタイムではなく、カーネル TCP/IP 処理およびネットワークのラウンドトリップタイムが含まれます。

手順

  1. 発信接続のレイテンシーの測定を開始します。

    # /usr/share/bcc/tools/tcpconnlat
    PID    COMM         IP SADDR      DADDR          DPORT LAT(ms)
    32151  isc-worker00 4  192.0.2.1  192.0.2.254    53    0.60
    32155  ssh          4  192.0.2.1  203.0.113.190  22    26.34
    32319  curl         4  192.0.2.1  198.51.100.59  443   188.96
    ...

    カーネルが発信接続を処理するたびに、tcpconnlat は、カーネルが応答パケットを受信すると接続の詳細を表示します。

    詳細は、システム上の tcpconnlat(8) man ページと /usr/share/bcc/tools/doc/tcpconnlat_example.txt ファイルを参照してください。

  2. Ctrl+C を押して、追跡プロセスを停止します。

3.2.5. カーネルによって破棄された TCP パケットおよびセグメントの詳細の表示

tcpdrop ユーティリティーを使用すると、カーネルによって破棄された TCP パケットとセグメントの詳細を表示できます。このユーティリティーを使用して、リモートシステムがタイマーベースの再送信を送信する可能性がある破棄されたパケットの高レートをデバッグします。

ドロップされたパケットおよびセグメントの高レートは、サーバーのパフォーマンスに影響を与える可能性があります。リソース集約型のパケットを取得およびフィルタリングする代わりに、tcpdrop ユーティリティーは eBPF 機能を使用してカーネルから直接情報を取得します。

手順

  1. 以下のコマンドを入力して、破棄された TCP パケットおよびセグメントの詳細表示を開始します。

    # /usr/share/bcc/tools/tcpdrop
    TIME     PID    IP SADDR:SPORT       > DADDR:DPORT   STATE (FLAGS)
    13:28:39 32253  4  192.0.2.85:51616  > 192.0.2.1:22  CLOSE_WAIT (FIN|ACK)
    	b'tcp_drop+0x1'
    	b'tcp_data_queue+0x2b9'
    	...
    
    13:28:39 1      4  192.0.2.85:51616  > 192.0.2.1:22   CLOSE (ACK)
    	b'tcp_drop+0x1'
    	b'tcp_rcv_state_process+0xe2'
    	...

    カーネルが TCP パケットとセグメントを破棄するたびに、tcpdrop は、破棄されたパッケージにつながるカーネルスタックトレースを含む接続の詳細を表示します。

    詳細は、システム上の tcpdrop(8) man ページと /usr/share/bcc/tools/doc/tcpdrop_example.txt ファイルを参照してください。

  2. Ctrl+C を押して、追跡プロセスを停止します。

3.2.6. TCP セッションのトレース

tcplife ユーティリティーは eBPF を使用して、開いて閉じる TCP セッションを追跡し、出力を 1 行で出力してそれぞれを要約します。管理者は tcplife を使用して、接続と転送されたトラフィック量を特定できます。

たとえば、ポート 22 (SSH) への接続を表示して、以下の情報を取得できます。

  • ローカルプロセス ID (PID)
  • ローカルプロセス名
  • ローカルの IP アドレスおよびポート番号
  • リモートの IP アドレスおよびポート番号
  • 受信および送信トラフィックの量 (KB 単位)
  • 接続がアクティブであった時間 (ミリ秒単位)

手順

  1. 次のコマンドを実行して、ローカルポート 22 への接続の追跡を開始します。

    # /usr/share/bcc/tools/tcplife -L 22
    PID   COMM    LADDR      LPORT RADDR       RPORT TX_KB  RX_KB      MS
    19392 sshd    192.0.2.1  22    192.0.2.17  43892    53     52 6681.95
    19431 sshd    192.0.2.1  22    192.0.2.245 43902    81 249381 7585.09
    19487 sshd    192.0.2.1  22    192.0.2.121 43970  6998     7 16740.35
    ...

    接続が閉じられるたびに、tcplife は接続の詳細を表示します。

    詳細は、システム上の tcplife(8) man ページと /usr/share/bcc/tools/doc/tcplife_example.txt ファイルを参照してください。

  2. Ctrl+C を押して、追跡プロセスを停止します。

3.2.7. TCP 再送信の追跡

tcpretrans ユーティリティーは、ローカルおよびリモート IP アドレスおよびポート番号、再送信時の TCP 状態などの TCP 再送信の詳細を表示します。

このユーティリティーは eBPF 機能を使用するため、オーバーヘッドが非常に低くなります。

手順

  1. 以下のコマンドを使用して、TCP 再送信の詳細を表示します。

    # /usr/share/bcc/tools/tcpretrans
    TIME     PID  IP LADDR:LPORT   T> RADDR:RPORT         STATE
    00:23:02 0    4  192.0.2.1:22  R> 198.51.100.0:26788  ESTABLISHED
    00:23:02 0    4  192.0.2.1:22  R> 198.51.100.0:26788  ESTABLISHED
    00:45:43 0    4  192.0.2.1:22  R> 198.51.100.0:17634  ESTABLISHED
    ...

    カーネルが TCP 再送信関数を呼び出すたびに、tcpretrans は、接続の詳細を表示します。

    詳細は、システム上の tcpretrans(8) man ページと /usr/share/bcc/tools/doc/tcpretrans_example.txt ファイルを参照してください。

  2. Ctrl+C を押して、追跡プロセスを停止します。

3.2.8. TCP 状態変更情報の表示

TCP セッション時に、TCP の状態が変わります。tcpstates ユーティリティーは、eBPF 関数を使用してこれらの状態の変更を追跡し、各状態の期間を含む詳細を出力します。たとえば、tcpstates を使用して、接続の初期化に時間がかかりすぎるかどうかを特定します。

手順

  1. 以下のコマンドを使用して、TCP 状態変更の追跡を開始します。

    # /usr/share/bcc/tools/tcpstates
    SKADDR           C-PID C-COMM     LADDR     LPORT RADDR       RPORT OLDSTATE    -> NEWSTATE    MS
    ffff9cd377b3af80 0     swapper/1  0.0.0.0   22    0.0.0.0     0     LISTEN      -> SYN_RECV    0.000
    ffff9cd377b3af80 0     swapper/1  192.0.2.1 22    192.0.2.45  53152 SYN_RECV    -> ESTABLISHED 0.067
    ffff9cd377b3af80 818   sssd_nss   192.0.2.1 22    192.0.2.45  53152 ESTABLISHED -> CLOSE_WAIT  65636.773
    ffff9cd377b3af80 1432  sshd       192.0.2.1 22    192.0.2.45  53152 CLOSE_WAIT  -> LAST_ACK    24.409
    ffff9cd377b3af80 1267  pulseaudio 192.0.2.1 22    192.0.2.45  53152 LAST_ACK    -> CLOSE       0.376
    ...

    接続の状態が変更されるたびに、tcpstates は、更新された接続の詳細を含む新しい行を表示します。

    複数の接続が状態を同時に変更する場合は、最初の列 (SKADDR) のソケットアドレスを使用して、同じ接続に属するエントリーを判断します。

    詳細は、システム上の tcpstates(8) man ページと /usr/share/bcc/tools/doc/tcpstates_example.txt ファイルを参照してください。

  2. Ctrl+C を押して、追跡プロセスを停止します。

3.2.9. 特定のサブネットに送信された TCP トラフィックの要約および集計

tcpsubnet ユーティリティーは、ローカルホストがサブネットに送信する IPv4 TCP トラフィックを要約し、固定の間隔で出力を表示します。このユーティリティーは、eBPF 機能を使用してデータを収集および要約して、オーバーヘッドを削減します。

デフォルトでは、tcpsubnet は以下のサブネットのトラフィックを要約します。

  • 127.0.0.1/32
  • 10.0.0.0/8
  • 172.16.0.0/12
  • 192.0.2.0/24/16
  • 0.0.0.0/0

最後のサブネット (0.0.0.0/0) は catch-all オプションであることに注意してください。tcpsubnet ユーティリティーは、最初の 4 つとは異なるサブネットのすべてのトラフィックを、この catch-all エントリーでカウントします。

192.0.2.0/24 および 198.51.100.0/24 サブネットのトラフィックをカウントするには、以下の手順に従います。他のサブネットへのトラフィックは、0.0.0.0/0 の 包括的なサブネットエントリーで追跡されます。

手順

  1. 192.0.2.0/24198.51.100.0/24、および他のサブネットに送信するトラフィック量のモニタリングを開始します。

    # /usr/share/bcc/tools/tcpsubnet 192.0.2.0/24,198.51.100.0/24,0.0.0.0/0
    Tracing... Output every 1 secs. Hit Ctrl-C to end
    [02/21/20 10:04:50]
    192.0.2.0/24           856
    198.51.100.0/24       7467
    [02/21/20 10:04:51]
    192.0.2.0/24          1200
    198.51.100.0/24       8763
    0.0.0.0/0              673
    ...

    このコマンドは、指定したサブネットのトラフィックを 1 秒ごとに 1 回ずつバイト単位で表示します。

    詳細は、システム上の tcpsubnet(8) man ページと /usr/share/bcc/tools/doc/tcpsubnet.txt ファイルを参照してください。

  2. Ctrl+C を押して、追跡プロセスを停止します。

3.2.10. IP アドレスとポートによるネットワークスループットの表示

tcptop ユーティリティーは、ホストがキロバイト単位で送受信する TCP トラフィックを表示します。レポートは自動的に更新され、アクティブな TCP 接続のみが含まれます。このユーティリティーは eBPF 機能を使用するため、オーバーヘッドは非常に低くなります。

手順

  1. 送受信トラフィックを監視するには、次のコマンドを実行します。

    # /usr/share/bcc/tools/tcptop
    13:46:29 loadavg: 0.10 0.03 0.01 1/215 3875
    
    PID    COMM         LADDR           RADDR              RX_KB   TX_KB
    3853   3853         192.0.2.1:22    192.0.2.165:41838  32     102626
    1285   sshd         192.0.2.1:22    192.0.2.45:39240   0           0
    ...

    コマンドの出力には、アクティブな TCP 接続のみが含まれます。ローカルシステムまたはリモートシステムが接続を閉じると、接続が出力に表示されなくなります。

    詳細は、システム上の tcptop(8) man ページと /usr/share/bcc/tools/doc/tcptop.txt ファイルを参照してください。

  2. Ctrl+C を押して、追跡プロセスを停止します。

3.2.11. 確立された TCP 接続の追跡

tcptracer ユーティリティーは、TCP 接続を接続、許可、および閉じるカーネル機能を追跡します。このユーティリティーは eBPF 機能を使用するため、オーバーヘッドが非常に低くなります。

手順

  1. 次のコマンドを実行して、トレースプロセスを開始します。

    # /usr/share/bcc/tools/tcptracer
    Tracing TCP established connections. Ctrl-C to end.
    T  PID    COMM        IP SADDR        DADDR       SPORT  DPORT
    A  1088   ns-slapd    4  192.0.2.153  192.0.2.1   0      65535
    A  845    sshd        4  192.0.2.1    192.0.2.67  22     42302
    X  4502   sshd        4  192.0.2.1    192.0.2.67  22     42302
    ...

    カーネルが接続を開始し、受け入れ、または閉じるたびに、tcptracer は、接続の詳細を表示します。

    詳細は、システム上の tcptracer(8) man ページと /usr/share/bcc/tools/doc/tcptracer_example.txt ファイルを参照してください。

  2. Ctrl+C を押して、追跡プロセスを停止します。

3.2.12. IPv4 および IPv6 リッスン試行の追跡

solisten ユーティリティーは、すべての IPv4 および IPv6 のリッスン試行を追跡します。最終的に失敗するものや、接続を許可しないリスニングプログラムなど、試行を追跡します。このユーティリティーは、プログラムが TCP 接続をリッスンする場合にカーネルが呼び出す関数を追跡します。

手順

  1. 次のコマンドを実行して、リッスンする TCP 試行をすべて表示するトレースプロセスを開始します。

    # /usr/share/bcc/tools/solisten
    PID    COMM           PROTO         BACKLOG     PORT     ADDR
    3643   nc             TCPv4         1           4242     0.0.0.0
    3659   nc             TCPv6         1           4242     2001:db8:1::1
    4221   redis-server   TCPv6         128         6379     ::
    4221   redis-server   TCPv4         128         6379     0.0.0.0
    ....

    詳細は、システム上の solisten(9) man ページと /usr/share/bcc/tools/doc/solisten_example.txt ファイルを参照してください。

  2. Ctrl+C を押して、追跡プロセスを停止します。

3.2.13. ソフト割り込みのサービス時間の要約

softirqs ユーティリティーは、ソフト割り込み (ソフト IRQ) に費やした時間を要約し、この時間を合計またはヒストグラムのディストリビューションとして表示します。このユーティリティーは、安定したトレースメカニズムであるカーネルトレースポイント irq:softirq_enter および irq:softirq_exit を使用します。

手順

  1. 以下のコマンドを実行して、soft irq イベント時間を追跡します。

    # /usr/share/bcc/tools/softirqs
    Tracing soft irq event time... Hit Ctrl-C to end.
    ^C
    SOFTIRQ          TOTAL_usecs
    tasklet                  166
    block                   9152
    net_rx                 12829
    rcu                    53140
    sched                 182360
    timer                 306256

    詳細は、システム上の softirqs(8) および mpstat(1) man ページと /usr/share/bcc/tools/doc/softirqs_example.txt ファイルを参照してください。

  2. Ctrl+C を押して、追跡プロセスを停止します。

3.2.14. ネットワークインターフェイス上のパケットサイズとパケット数のまとめ

netqtop ユーティリティーは、特定のネットワークインターフェイスの各ネットワークキュー上の受信 (RX) パケットと送信 (TX) パケットの属性に関する統計情報を表示します。

統計情報には次のものが含まれます。

  • 1 秒あたりのバイト数 (BPS)
  • 1 秒あたりのパケット数 (PPS)
  • 平均パケットサイズ
  • 総パケット数

これらの統計情報を生成するために、netqtop は、送信パケット net_dev_start_xmit および受信パケット netif_receive_skb のイベントを実行するカーネル関数をトレースします。

手順

  1. 2 秒間のバイトサイズの範囲内に含まれるパケット数を表示します。

    # /usr/share/bcc/tools/netqtop -n enp1s0 -i 2
    
    Fri Jan 31 18:08:55 2023
    TX
     QueueID	avg_size   [0, 64)	[64, 512)  [512, 2K)  [2K, 16K)  [16K, 64K)
     0      	0      	0      	0      	0      	0      	0
     Total  	0      	0      	0      	0      	0      	0
    
    RX
     QueueID	avg_size   [0, 64)	[64, 512)  [512, 2K)  [2K, 16K)  [16K, 64K)
     0      	38.0   	1      	0      	0      	0      	0
     Total  	38.0   	1      	0      	0      	0      	0
    -----------------------------------------------------------------------------
    Fri Jan 31 18:08:57 2023
    TX
     QueueID	avg_size   [0, 64)	[64, 512)  [512, 2K)  [2K, 16K)  [16K, 64K)
     0      	0      	0      	0      	0      	0      	0
     Total  	0      	0      	0      	0      	0      	0
    
    RX
     QueueID	avg_size   [0, 64)	[64, 512)  [512, 2K)  [2K, 16K)  [16K, 64K)
     0      	38.0   	1      	0      	0      	0      	0
     Total  	38.0   	1      	0      	0      	0      	0
    -----------------------------------------------------------------------------

    詳細は、システム上の netqtop(8) man ページと /usr/share/bcc/tools/doc/netqtop_example.txt ファイルを参照してください。

  2. Ctrl+C を押して netqtop を停止します。

3.3. xdp-filter を使用した高性能なトラフィックフィルタリングによる DDoS 攻撃の防止

xdp-filter ユーティリティーは、XDP を使用してネットワークインターフェイスで直接パケットを破棄します。そのため、nftables などのフィルターよりも高速です。これは DDoS 攻撃中にトラフィックを迅速にブロックするのに役立ちます。フィルタリングは、IP、MAC アドレス、またはポートごとに実行できます。

たとえば、テスト時に Red Hat は 1 つのコア上で 1 秒あたり 2,600 万のネットワークパケットを破棄しました。これは、同じハードウェア上での nftables のドロップ率よりも大幅に高い値です。

xdp-filter ユーティリティーは、XDP を使用して着信ネットワークパケットを許可または破棄します。特定のトラフィックに対するトラフィックのフィルターを行うルールを作成できます。

  • IP アドレス
  • MAC アドレス
  • ポート

xdp-filter はパケット処理速度が大幅に速いものの、nftables などと同等の機能を備えているわけではないことに注意してください。xdp-filter は、XDP を使用したパケットフィルタリングを実演するための概念的なユーティリティーと捉えてください。また、独自の XDP アプリケーションの作成方法をより深く理解するために、このユーティリティーのコードを使用することもできます。

重要

AMD および Intel 64 ビット以外のアーキテクチャーでは、xdp-filter ユーティリティーはテクノロジープレビュー機能としてのみ提供されます。テクノロジープレビュー機能は、Red Hat 製品サポートのサービスレベルアグリーメント (SLA) ではサポートされておらず、機能的に完全ではない可能性があるため、Red Hat では実稼働環境での使用を推奨していません。テクノロジープレビュー機能では、最新の製品機能をいち早く提供します。これにより、お客様は開発段階で機能をテストし、フィードバックを提供できます。

3.3.1. xdp-filter ルールに一致するネットワークパケットの破棄

xdp-filter ユーティリティーは、特定のルールに一致するパケット (特定の送信元 IP アドレスや送信元 MAC アドレスからのパケット、または特定の宛先ポートへのパケットなど) を除くすべてのトラフィックを許可する allow ポリシーを使用できます。

前提条件

  • xdp-tools パッケージがインストールされている。
  • XDP プログラムをサポートするネットワークドライバー。

手順

  1. xdp-filter を読み込み、enp1s0 などの特定のインターフェイスの着信パケットを処理します。

    # xdp-filter load enp1s0

    デフォルトでは、xdp-filterallow ポリシーを使用し、ユーティリティーはすべてのルールに一致するトラフィックのみを破棄します。

    オプション: tcpipv4ethernet などの特定の機能のみを有効にするには、-f <feature> オプションを使用します。すべての機能をロードするのではなく、必要な機能のみをロードすることで、パケット処理の速度が向上します。複数の機能を有効にするには、コンマで区切ります。

    コマンドがエラーで失敗した場合、ネットワークドライバーは XDP プログラムをサポートしません。

  2. ルールを追加して、それに一致するパケットをドロップします。以下に例を示します。

    • 受信パケットをポート 22 に破棄するには、次のコマンドを実行します。

      # xdp-filter port 22

      このコマンドは、TCP および UDP トラフィックに一致するルールを追加します。特定のプロトコルのみと一致する場合は、-p protocol オプションを使用します。

    • 192.0.2.1 から着信パケットを破棄するには、次のコマンドを実行します。

      # xdp-filter ip 192.0.2.1 -m src

      xdp-filter は IP 範囲に対応していないことに注意してください。

    • MAC アドレス 00:53:00:AA:07:BE から着信パケットを破棄するには、次のコマンドを実行します。

      # xdp-filter ether 00:53:00:AA:07:BE -m src

検証

  • 以下のコマンドを使用して、破棄されたパケットおよび許可されるパケットに関する統計を表示します。

    # xdp-filter status

    開発者であり、xdp-filter のコードに関心がある場合は、Red Hat カスタマーポータルから対応するソース RPM (SRPM) をダウンロードしてインストールします。

3.3.2. xdp-filter ルールに一致するものを除くすべてのネットワークパケットの破棄

xdp-filter ユーティリティーは、特定のルールに一致するパケット (特定の送信元 IP アドレスや送信元 MAC アドレスからのパケット、または特定の宛先ポートへのパケットなど) を除くすべてのトラフィックを破棄する deny ポリシーを使用できます。

警告

インターフェイスで xdp-filter を読み込む際にデフォルトのポリシーを deny に設定すると、特定のトラフィックを許可するルールを作成するまで、カーネルはこのインターフェイスからのパケットをすべて直ちに破棄します。システムからロックアウトしないようにするには、ローカルにコマンドを入力するか、別のネットワークインターフェイスからホストに接続します。

前提条件

  • xdp-tools パッケージがインストールされている。
  • ホストにローカルにログインするか、トラフィックのフィルタリングを予定しないネットワークインターフェイスを使用してホストにログインします。
  • XDP プログラムをサポートするネットワークドライバー。

手順

  1. xdp-filter を読み込み、enp1s0 などの特定のインターフェイスのパケットを処理します。

    # xdp-filter load enp1s0 -p deny

    オプション: tcpipv4ethernet などの特定の機能のみを有効にするには、-f <feature> オプションを使用します。すべての機能をロードするのではなく、必要な機能のみをロードすることで、パケット処理の速度が向上します。複数の機能を有効にするには、コンマで区切ります。

    コマンドがエラーで失敗した場合、ネットワークドライバーは XDP プログラムをサポートしません。

  2. ルールを追加して、一致するパケットを許可します。以下に例を示します。

    • パケットのポート 22 を許可するには、以下のコマンドを実行します。

      # xdp-filter port 22

      このコマンドは、TCP および UDP トラフィックに一致するルールを追加します。特定のプロトコルのみと一致するように、-p protocol オプションをコマンドに渡します。

    • パケットの 192.0.2.1 を許可するには、次のコマンドを実行します。

      # xdp-filter ip 192.0.2.1

      xdp-filter は IP 範囲に対応していないことに注意してください。

    • MAC アドレス 00:53:00:AA:07:BE へのパケットを許可するには、次のコマンドを実行します。

      # xdp-filter ether 00:53:00:AA:07:BE
    重要

    xdp-filter ユーティリティーは、ステートフルパケットの検査に対応していません。これには、-m mode オプションでモードを設定せず、マシンが送信トラフィックに応答して受信トラフィックを許可する明示的なルールを追加する必要があります。

検証

  • 以下のコマンドを使用して、破棄されたパケットおよび許可されるパケットに関する統計を表示します。

    # xdp-filter status

    開発者であり、xdp-filter のコードに関心がある場合は、Red Hat カスタマーポータルから対応するソース RPM (SRPM) をダウンロードしてインストールします。

xdpdump ユーティリティーは、XDP プログラムによって破棄または変更されたパケットを含むネットワークパケットをキャプチャーします。tcpdump とは異なり、xdpdump は eBPF プログラムを使用するため、従来のユーザー空間ユーティリティーではキャプチャーできないパケットをキャプチャーできます。

xdpdump を使用して、インターフェイスにすでに割り当てられている XDP プログラムをデバッグすることができます。したがって、ユーティリティーは、XDP プログラムを起動し、終了する前にパケットをキャプチャーできます。後者の場合、xdpdump は XDP アクションもキャプチャーします。デフォルトでは、xdpdump は XDP プログラムのエントリーで着信パケットをキャプチャーします。

重要

AMD および Intel 64 ビット以外のアーキテクチャーでは、xdpdump ユーティリティーはテクノロジープレビュー機能としてのみ提供されます。テクノロジープレビュー機能は、Red Hat 製品サポートのサービスレベルアグリーメント (SLA) ではサポートされておらず、機能的に完全ではない可能性があるため、Red Hat では実稼働環境での使用を推奨していません。テクノロジープレビュー機能では、最新の製品機能をいち早く提供します。これにより、お客様は開発段階で機能をテストし、フィードバックを提供できます。

テクノロジープレビュー機能のサポート範囲は、Red Hat カスタマーポータルの テクノロジープレビュー機能のサポート範囲 を参照してください。

xdpdump には、パケットフィルターまたはデコード機能がないことに注意してください。ただし、パケットのデコードに tcpdump と組み合わせて使用できます。

前提条件

  • XDP プログラムをサポートするネットワークドライバー。
  • XDP プログラムが enp1s0 インターフェイスに読み込まれている。プログラムが読み込まれていない場合は、xdpdump が後方互換性として tcpdump と同様にパケットをキャプチャーします。

手順

  1. enp1s0 インターフェイスでパケットをキャプチャーして、/root/capture.pcap ファイルに書き込むには、次のコマンドを実行します。

    # xdpdump -i enp1s0 -w /root/capture.pcap

    開発者であり、xdpdump のソースコードに関心がある場合は、Red Hat カスタマーポータルから対応するソース RPM (SRPM) をダウンロードしてインストールします。

  2. パケットの取得を停止するには、Ctrl+C を押します。
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

Red Hat ドキュメントについて

Legal Notice

Theme

© 2026 Red Hat
トップに戻る