フックとチェーンについて
フックは、処理のためにパケットをインターセプトできるシステム内のポイントです。 これらのフックは、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ベース・チェーンを作成するには、次の手順を実行します:
-
次の構文を使用して、特定のアドレス・ファミリ・タイプおよび表のチェーンを作成します:
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>はチェーン・タイプです。 ベース・チェーンの有効な値は、
filter、natおよび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 ; }" - <address_family>には、
- 次を実行します。
- すべてのチェーンを表示するには、次の手順を実行します:
sudo nft list chains - 単一のチェーンを表示するには、次の手順を実行します:
sudo nft list chain <address_family> <table_name><chain_name>
- すべてのチェーンを表示するには、次の手順を実行します: