機械翻訳について

フックとチェーンについて

フックは、処理のためにパケットをインターセプトできるシステム内のポイントです。 これらのフックは、nftablesがパケットに何が起こるかを決定するチェーンおよびルールを適用する場所です。 表に適用されているアドレス・ファミリに応じて、さまざまなフックを使用できます。

次の表に、各アドレス・ファミリで使用可能なフックを示します。

アドレス・ファミリ フック 説明

IP、IPv6、inet / Bridge

prerouting

ルーティングのディシジョンの前に、すべての受信パケットを処理します。

input

ローカル・システム宛てのパケットを処理します。

forward

別のホストに転送されるパケットを管理します。

output

ローカル・システムから発信されたパケットを処理します。

postrouting

ルーティング後のすべての送信パケットを処理します。

ingress

inetファミリのLinuxカーネル5.10から使用可能な、事前ルーティングの前に受信パケットを管理します。

ARP

input

ローカル・システムのパケットを処理します。

output

ローカル・システムから送信されたパケットを処理します。

Netdev

ingress

レイヤー3の処理前に、tcpdumpなどのネットワーク・タップ後に受信パケットを処理します。

egress

レイヤー3の処理後、最終的なネットワーク終了前に送信パケットを管理します。

基本チェーンはフックに接続されます。 ベース・チェーンで構成されたフックにパケットが到着すると、そのパケットはチェーンをトラバースし、ルールが一致するか、チェーンの終わりに達するまで、チェーン内の各ルールが順番に評価されます。nftablesには、次のチェーン・タイプが含まれます:
  • ベース・チェーン: これらは、フック上で直接構築されたチェーンです。 たとえば、myinputという名前のベース・チェーンは、ローカル・システムに到着するIPv4またはIPv6パケットのinet入力フックにリンクできます。
  • レギュラ・チェーン: これらは、ベース・チェーンやその他の通常のチェーンからジャンプするチェーンです。 これらはフックで直接構築されるわけではありませんが、ベース・チェーン内のディシジョン・プロセスの一部にすることができます。
ベース・チェーンには、ベース・チェーン・タイプ、フックおよび優先度パラメータを含める必要があります。 チェーン・タイプには次のものがあります:
  • filter: 主に、発信元および着信先IP、ポート、プロトコルなどのさまざまな条件に基づいてパケットを許可またはブロックするかどうかなど、パケット・フィルタリングに使用されます。 このチェーン・タイプは、すべてのアドレス・ファミリとそのフックで動作します。
  • nat: 主に、NAT操作のパケット・ヘッダーのIPアドレス、ポート、またはその両方を変更するために使用されます。 これには、送信トラフィックのソースNAT (SNAT)および着信トラフィックの宛先NAT (DNAT)への変更が含まれます。 このチェーン・タイプは、ip、ipv6およびinetアドレス・ファミリで構成でき、事前ルーティング、入力、出力およびポスト・ルーティング・フックを使用できます。
  • route: 主に、ルーティング表の変更や特定のルーティング・ポリシーのパケットのマーキングなどのルーティングのディシジョンに使用されます。 このチェーン・タイプは、ipおよびipv6アドレス・ファミリとともに使用でき、出力フックのみを取得できます。

イングレス・フックまたはエグレス・フックを使用する場合は、deviceパラメータを使用して、ネットワーク・インタフェース名を文字列として指定します。 イングレス・チェーンまたはエグレス・チェーンは、デバイス・パラメータで指定されたインタフェースからのトラフィックのみをフィルタします。

priorityパラメータは、符号付き整数または標準優先度名を使用して、同じフックを持つチェーンが処理される順序を決定します。 チェーンは、優先度が低い値または名前から優先度が高い値または名前まで処理されます。

次の表に、関連する各アドレス・ファミリおよびフック・タイプの優先順位名と値を示します。

名前 ファミリ フック

raw

-300

ip、ip6、inet all

mangle

-150

ip、ip6、inet all

dsnat

-100

ip、ip6、inet prerouting

filter

0

ip、ip6、inet、arp、netdev all

security

50

ip、ip6、inet all

srcnat

100

ip、ip6、inet postrouting

次の表に、ブリッジ・アドレス・ファミリとフック・タイプの優先順位名と値を示します。

名前 フック

dsnat

-300

prerouting

filter

-200

all

out

100

output

srcnat

300

postrouting

また、チェーンに定義されたどのルールもパケットと一致しない場合は、パケットをacceptまたはdropのいずれにするかを定義するポリシーを設定することもできます。 デフォルトでは、ベース・チェーンはすべてのパケットを受け入れます。 ただし、チェーンで明示的に許可されていないすべてのトラフィックを削除するようにポリシーを設定することは、セキュリティ上の理由から推奨されます。

ベース・チェーンの作成

メモリーにnftableベース・チェーンを作成するには、次の手順を実行します:
  1. 次の構文を使用して、特定のアドレス・ファミリ・タイプおよび表のチェーンを作成します:

    sudo nft add chain <address_family> <table_name> <chain_name>{ type <chain_type> hook <hook_type> device <network_interface_name> priority <priority> policy <policy> comment <comment> ; }
    
    前述のコマンドでは、
    • <address_family>には、ip, ip6, inet, arp, bridgeまたはnetdevを指定できます。 すべてのnftablesオブジェクトは、これらのアドレス・ファミリのいずれかにあります。 これらのアドレス・ファミリの詳細は、nft(8)マニュアル・ページを参照してください。
    • <table_name>は、表の名前です。 表はチェーンのコンテナで、ルールはコンテナです。
    • <chain_name>は、チェーンの任意の名前です。 iptablesベースのファイアウォールから移行するユーザーは、多くの場合、従来のiptablesネーミングを使用します。
    • <chain_type>はチェーン・タイプです。 ベース・チェーンの有効な値は、filternatおよびrouteです。 詳細については、「フックとチェーンについて」を参照してください。
    • <hook_type>はフック・タイプです。 可能な値は、選択したアドレス・ファミリおよびチェーン・タイプによって異なります。 詳細については、「フックとチェーンについて」を参照してください。
    • <network_interface_name>は、デバイス・パラメータのネットワーク・インタフェース名です。 このパラメータは、イングレス・フックまたはエグレス・フックを使用する場合にのみ必要です。
    • <priority>は、チェーンの優先度の値または名前です。 優先度は、選択したアドレス・ファミリとフック・タイプによって異なります。 詳細については、「フックとチェーンについて」を参照してください。
    • <policy>は、チェーンに定義されているすべてのルールがパケットと一致しない場合に実行されるアクションです。 有効な値は、acceptまたはdropです。 指定しない場合、デフォルト値はacceptです。
    たとえば、次のコマンドでは、inetファミリを持つmychainというmytable表にチェーンが作成されます。 チェーン・タイプはfilter、フックはinput、優先度は0です。 最後に、ルールに一致しないすべてのパケットを削除するようにポリシーが設定されます:
    sudo nft add chain inet mytable mychain "{ type filter hook input priority 0 ; policy drop ; }"
  2. 次を実行します。
    • すべてのチェーンを表示するには、次の手順を実行します:
      sudo nft list chains
    • 単一のチェーンを表示するには、次の手順を実行します:
      sudo nft list chain <address_family> <table_name> <chain_name>