Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

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

本セクションでは、nftables ルールセットを表示する方法と、その管理方法を説明します。

6.2.1. nftables ルールセットの表示

nftables のルールセットには、テーブル、チェーン、およびルールが含まれます。本セクションでは、このルールセットを表示する方法を説明します。
ルールセットを表示するには、以下のコマンドを実行します。
# nft list ruleset
table inet example_table {
  chain example_chain {
    type filter hook input priority filter; policy accept;
    tcp dport http accept
    tcp dport ssh accept
  }
}
注記
デフォルトでは、nftables は事前にテーブルを作成しません。これにより、テーブルのないホストに設定されたルールセットを表示すると、nft list ruleset コマンドは出力を表示しません。

6.2.2. nftables テーブルの作成

nftables のテーブルは、チェーン、ルール、セット、およびその他のオブジェクトのコレクションを含む名前空間です。本セクションでは、テーブルの作成方法を説明します。
各テーブルには、アドレスファミリーが定義されている必要があります。テーブルのアドレスファミリーは、テーブルプロセスのアドレスタイプを定義します。テーブルを作成する際に、以下のいずれかのアドレスファミリーを設定できます。
  • ip: IPv4 パケットのみに一致します。アドレスファミリーを指定しないと、これがデフォルトになります。
  • ip6: IPv6 パケットのみに一致します。
  • inet: IPv4 パケットと IPv6 パケットの両方に一致します。
  • ARP: IPv4 アドレス解決プロトコル(ARP)パケットに一致します。
  • bridge: ブリッジデバイスを通過するパケットと一致します。
  • netdev: ingress からのパケットに一致します。

手順6.4 nftables テーブルの作成

  1. nft add table コマンドを使用して、新しいテーブルを作成します。たとえば、IPv4 パケットおよび IPv6 パケットを処理する example_table という名前のテーブルを作成するには、次のコマンドを実行します。
    # nft add table inet example_table
  2. 必要に応じて、ルールセットのテーブルを一覧表示します。
    # nft list tables
    table inet example_table

関連情報

  • アドレスファミリーの詳細は、nft (8) man ページの Address family セクションを参照してください。
  • テーブルで実行できるその他のアクションの詳細は、nft (8) man ページの Tables セクションを参照してください。

6.2.3. nftables チェーンの作成

チェーンは、ルールのコンテナーです。次の 2 つのルールタイプが存在します。
  • ベースチェーン - ネットワークスタックからのパケットのエントリーポイントとしてベースチェーンを使用できます。
  • 通常のチェーン: jump ターゲットとして通常のチェーンを使用し、ルールをより適切に整理できます。
この手順では、既存のテーブルにベースチェーンを追加する方法を説明します。

前提条件

  • 新しいチェーンを追加するテーブルが存在する。

手順6.5 nftables チェーンの作成

  1. nft add chain コマンドを使用して、新しいチェーンを作成します。たとえば、example_table に、example_chain という名前のチェーンを作成するには、次のコマンドを実行します。
    # nft add chain inet example_table example_chain '{ type filter hook input priority 0 ; policy accept ; }'
    重要
    シェルで、セミコロンがコマンドの最後として解釈されないようにするには、セミコロンをバックスラッシュでエスケープする必要があります。さらに、一部のシェルは中括弧も解釈するので、中括弧とその中のものはティック(')で引用します。
    このチェーンは、着信パケットをフィルターリングします。priority パラメーターは、nftables が同じフック値を持つチェーンを処理する順序を指定します。優先度の値が低いほど優先されます。policy パラメーターは、このチェーンのルールのデフォルトアクションを設定します。サーバーにリモートでログインし、デフォルトのポリシーを を ドロップ するように設定すると、他のルールでリモートアクセスが許可されていない場合は、すぐに切断されることに注意してください。
  2. 必要に応じて、すべてのチェーンを表示します。
    # nft list chains
    table inet example_table {
      chain example_chain {
        type filter hook input priority filter; policy accept;
      }
    }
    

関連情報

  • アドレスファミリーの詳細は、nft (8) man ページの Address family セクションを参照してください。
  • チェーンで実行できるその他のアクションの詳細は、nft (8) man ページの Chains セクションを参照してください。

6.2.4. nftables チェーンの最後に対するルールの追加

本セクションでは、既存の nftables チェーンの最後にルールを追加する方法を説明します。

前提条件

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

手順6.6 nftables チェーンの最後に対するルールの追加

  1. 新しいルールを追加するには、nft add rule コマンドを使用します。たとえば、example_tableexample_chain に、ポート 22 の TCP トラフィックを許可するルールを追加するには、次のコマンドを実行します。
    # nft add rule inet example_table example_chain tcp dport 22 accept
    代わりに、ポート番号の代わりにサービスの名前を指定することもできます。この例では、ポート番号 22 の代わりに ssh を使用できます。サービス名は、/etc/services ファイルのエントリーに基づいてポート番号に解決されることに注意してください。
  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 accept
      }
    }
    

関連情報

  • アドレスファミリーの詳細は、nft (8) man ページの Address family セクションを参照してください。
  • チェーンで実行できるその他のアクションの詳細は、nft (8) man ページの Rules セクションを参照してください。

6.2.5. nftables チェーンの先頭へのルールの挿入

本セクションでは、既存の nftables チェーンの先頭にルールを追加する方法を説明します。

前提条件

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

手順6.7 nftables チェーンの先頭へのルールの挿入

  1. 新しいルールを挿入するには、nft insert rule コマンドを使用します。たとえば、ポート 22 で TCP トラフィックを許可するルールを example_tableexample_chain に挿入するには、次のコマンドを実行します。
    # nft insert rule inet example_table example_chain tcp dport 22 accept
    代わりに、ポート番号の代わりにサービスの名前を指定することもできます。この例では、ポート番号 22 の代わりに ssh を使用できます。サービス名は、/etc/services ファイルのエントリーに基づいてポート番号に解決されることに注意してください。
  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 accept
        ...
      }
    }
    

関連情報

  • アドレスファミリーの詳細は、nft (8) man ページの Address family セクションを参照してください。
  • チェーンで実行できるその他のアクションの詳細は、nft (8) man ページの Rules セクションを参照してください。

6.2.6. nftables チェーンの特定の位置へのルールの挿入

本セクションでは、nftables チェーンで、既存のルールの前後にルールを追加する方法を説明します。これにより、正しい場所に新しいルールを配置することができます。

前提条件

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

手順6.8 nftables チェーンの特定の位置へのルールの挿入

  1. nft -a list ruleset コマンドを使用して、ハンドルを含む example_table のすべてのチェーンとそのルールを表示します。
    # nft -a list table inet example_table
    table inet example_table { # handle 1
      chain example_chain { # handle 1
        type filter hook input priority filter; policy accept;
        tcp dport 22 accept # handle 2
        tcp dport 443 accept # handle 3
        tcp dport 389 accept # handle 4
      }
    }
    
    -a を使用すると、ハンドルが表示されます。次の手順で新しいルールを配置するときに、この情報が必要です。
  2. example_tableexample_chain チェーンに新しいルールを挿入します。
    • ハンドル 3 の前に、ポート 636 で TCP トラフィックを許可するルールを挿入するには、次のコマンドを実行します。
      # nft insert rule inet example_table example_chain position 3 tcp dport 636 accept
    • ハンドル 3 の後ろに、ポート 80 で TCP トラフィックを許可するルールを追加するには、次のコマンドを実行します。
      # nft add rule inet example_table example_chain position 3 tcp dport 80 accept
  3. 必要に応じて、example_table ですべてのチェーンとそのルールを表示します。
    # nft -a list table inet example_table
    table inet example_table { # handle 1
      chain example_chain { # 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
        tcp dport 389 accept # handle 4
      }
    }
    

関連情報

  • アドレスファミリーの詳細は、nft (8) man ページの Address family セクションを参照してください。
  • チェーンで実行できるその他のアクションの詳細は、nft (8) man ページの Rules セクションを参照してください。