man nftables 日本語訳


man nftables で表示されるマニュアルの日本語訳。

名前

nft - パケットのフィルタリングと分類を目的とする nftables フレームワークの管理ツール

概要

nft [ -nNscae ] [ -I directory ] [ -f filename | -i | cmd ...]
nft -h
nft -v

説明

nft は nftables フレームワークの Linux カーネルでパケットフィルタリングおよび分類ルールを設定、管理、検査するために使用されるコマンドラインツールです。
Linux カーネルサブシステムは nf_tables として知られており、 nfNetfilter を表します。

オプション

オプションの完全な要約を見るには、 nft --help を実行してください。

  • -h, -help ヘルプメッセージとすべてのオプションを表示します。
  • -v, -version バージョンを表示します。
  • -n, -numeric データを数値で表示します。 1 回指定すると(デフォルトの動作)、アドレスからシンボル名への変換をスキップします。 インターネットサービス(ポート番号)を数値で表示するには、 2 回指定します。 3 回指定して、プロトコルと UID / GID を数値で表示します。
  • -N, -reversedns IP アドレスを名前に変換します。通常、 DNS ルックアップにはネットワークトラフィックが必要です。
  • -s, -stateless ルールとステートフルオブジェクトの状態情報を省略します。
  • -c, -check 実際に変更を適用せずにコマンドの有効性を確認します。
  • -a, -handle 出力にオブジェクトハンドルを表示します。
  • -e, -echo add, insert, replace コマンドを使用してルールセットにアイテムを挿入する際に、 nft モニターと同様に通知を表示します。
  • -I, -includepath directory 引数 directory に指定したディレクトリを、インクルードファイルを検索するディレクトリのリストに追加します。 このオプションは複数回指定できます。
  • -f、-file filename ファイル名から入力を読み取ります。 ファイル名が - の場合、標準入力から読み取ります。 nft スクリプトは #!/usr/sbin/nft -f から開始する必要があります。
  • -i, -interactive 対話型の readline CLI から入力を読み取ります。 quit を使用して終了するか、 EOF マーカーを使用できます。 通常、 EOF マーカーは CTRL-D です。

入力ファイル形式

語彙規約

入力は行ごとに解析されます。
行の最後の文字(改行文字の直前)が引用符で囲まれていないバックスラッシュ( \ )の場合、次の行は継続として扱われます。
同じ行にある複数のコマンドは、セミコロン( ; )を使用して区切ることができます。

ハッシュ記号( #)はコメントを開始します。
同じ行の後続の文字はすべて無視されます。

識別子は英字(a-z, A-Z)で始まり、 0 個以上の英数字(a-z, A-Z, 0-9)と、スラッシュ( / )、バックスラッシュ( \ )、アンダースコア( _ )、ドット( . )の文字が続きます。
異なる文字を使用したり、キーワードと競合する識別子は、二重引用符( " )で囲む必要があります。

ファイルの読込

include ステートメントを使用して、他のファイルを読込むことができます。
インクルードファイルを検索するディレクトリは、 -I/--includepath オプションを使用して指定できます。
この動作を上書きするには、パスの先頭に ./ を追加して、現在の作業ディレクトリにあるファイル(つまり相対パス)を強制的に含めるか、 / 絶対パスで表されるファイルの場所を指定します。

-I/--includepath が指定されていない場合、 nft はコンパイル時に指定されたデフォルトのディレクトリを使用します。
このデフォルトのディレクトリは -h/--help オプションで取得できます。

include ステートメントは、通常のシェルワイルドカード記号( * , ? , [] )をサポートします。
include ステートメントでワイルドカード記号が使用されている場合、 include ステートメントに一致するものが存在しない場合でもエラーになりません。
これにより、 include /etc/firewall/rules/* のような空かもしれない include ディレクトリを指定することができます。
ワイルドカードの一致はアルファベット順に読み込まれます。
ドット( . )で始まるファイルは、 include ステートメントでは一致しません。

変数記号

変数式の定義

$variable

変数記号は、 define ステートメントを使用して定義できます。
変数参照は式であり、他の変数を初期化するために使用できます。
定義のスコープは、現在のブロックとその中に含まれるすべてのブロックです。

変数の使用例
define int_if1 = eth0
define int_if2 = eth1
define int_ifs = { $int_if1, $int_if2 }

filter input iif $int_ifs accept

アドレスファミリ

アドレスファミリは、処理されるパケットの種類を決定します。
各アドレスファミリに対して、カーネルには、パケット処理過程の特定の段階を表すフックが含まれています。
これらのフックは、フックのルールが存在する場合に nftables を呼び出します。

  • ip: IPv4アドレスファミリ。
  • ip6: IPv6アドレスファミリ。
  • inet: インターネット(IPv4 / IPv6)アドレスファミリ。
  • arp: ARPアドレスファミリ。 IPv4 ARP パケットを処理する。
  • bridge: ブリッジアドレスファミリ。ブリッジデバイスを通過するパケットを処理します。
  • netdev: Netdev アドレスファミリ。入力からのパケットを処理します。

すべての nftables オブジェクトはアドレスファミリ固有の名前空間に存在するため、すべての識別子にはアドレスファミリが含まれます。
アドレスファミリなしで識別子を指定すると、デフォルトで ip ファミリが使用されます。

IPV4 / IPV6 / INET アドレスファミリ

IPv4 / IPv6 / Inet アドレスファミリは、 IPv4, IPv6 または両方のタイプのパケットを処理します。
これらには、ネットワークスタックの異なるパケット処理段階で 5 つのフックが含まれています。

IPv4 / IPv6 / Inet アドレスファミリーフック

フック 説明
prerouting システムに入るすべてのパケットは、 prerouting フックによって処理されます。これはルーティングプロセスの前に呼び出され、ルーティングに影響するパケット属性の早期フィルタリングまたは変更に使用されます。
input ローカルシステムに配信されたパケットは、 input フックによって処理されます。
forward 別のホストに転送されたパケットは、 forward フックによって処理されます。
output ローカルプロセスによって送信されたパケットは、 output フックによって処理されます。
postrouting システムを出るすべてのパケットは、 postrouting フックによって処理されます。

ARPアドレスファミリ

ARP アドレスファミリは、システムが送受信する ARP パケットを処理します。
これは通常、クラスタリングのために ARP パケットをマングルするために使用されます。

ARP アドレスファミリーフック

フック 説明
input ローカルシステムに配信されたパケットは、 input フックによって処理されます。
output ローカルシステムによって送信されたパケットは、 output フックによって処理されます。

ブリッジアドレスファミリ

ブリッジアドレスファミリは、ブリッジデバイスを通過するイーサネットパケットを処理します。

サポートされるフックのリストは、上記の IPv4 / IPv6 / Inet アドレスファミリーと同じです。

NETDEV アドレスファミリ

Netdev アドレスファミリは、入力からのパケットを処理します。

Netdev アドレスファミリーフック

フック 説明
ingress システムに入るすべてのパケットは、このフックによって処理されます。レイヤ 3 プロトコルハンドラの前に呼び出され、早期のフィルタリングとポリシングに使用できます。

ルールセット

{list | flush} ruleset [family]
export [ruleset] format

ruleset キーワードは、現在カーネルに配置されているテーブル、チェーンなどのセット全体を識別するために使用されます。
次のルールセットコマンドが存在します。

  • list: 人間が読める形式でルールセットを表示します。
  • flush: ルールセット全体をクリアします。 iptables とは異なり、これはすべてのテーブルとそれらに含まれるすべてのものを削除し、実質的に空のルールセットになることに注意してください。 パケットフィルタリングはもはや発生しないため、カーネルは受信する有効なパケットを全て受け入れます。
  • export: 機械可読形式でルールセットを表示します。 必須のフォーマットパラメータは、 xml または json のいずれかです。

リストを制限し、特定のアドレスファミリのみフラッシュすることが可能です。
有効なファミリ名のリストについては、上記の アドレスファミリ を参照してください。

想定とは逆に、 export によって生成された出力は nft -f では解析できないことに注意してください。
代わりに list コマンドの出力がその目的に役立ちます。

テーブル

{add | create} table [family] table [ { flags flags } ]
{delete | list | flush} table [family] table
delete table [family] handle handle

テーブルは、チェーン、セット、およびステートフルオブジェクトのコンテナです。
それらは、アドレスファミリと名前によって識別されます。
アドレスファミリは、 ip, ip6, inet, arp, bridge, netdev のいずれかである必要があります。
inet アドレスファミリは、ハイブリッド IPv4 / IPv6 テーブルを作成するために使用されるダミーファミリです。
メタ表現 nfproto キーワードを使用して、パケットが処理されているファミリー(IPv4 または IPv6)コンテキストをテストできます。
アドレスファミリーが指定されていない場合、デフォルトで ip が使用されます。
add と create の唯一の違いは、 create がエラーを返す一方で、指定されたテーブルがすでに存在する場合、 add はエラーを返さないことです。

テーブルフラグ

フラグ 説明
dormant テーブルは評価されません(ベースチェーンは登録されていません)
テーブルを追加、変更、削除する例
# 対話モードで nft を起動
nft --interactive

# 新しいテーブルを作成します。
create table inet mytable

# 新しいベースチェーンを追加: 入力パケットを取得
add chain inet mytable myin { type filter hook input priority 0; }

# チェーンに単一のカウンターを追加
add rule inet mytable myin counter

# テーブルを一時的に無効にする(ルールは評価されない)
add table inet mytable { flags dormant; }

# テーブルを再びアクティブにします:
add table inet mytable
  • add: 指定された名前の指定されたファミリの新しいテーブルを追加します。
  • delete: 指定したテーブルを削除します。
  • list: 指定したテーブルのすべてのチェーンとルールを一覧表示します。
  • flush: 指定したテーブルのすべてのチェーンとルールをフラッシュします。

チェーン

{add | create} chain [family] table chain [ { type type hook hook [device device] priority priority ; [policy policy ;] } ]
{delete | list | flush} chain [family] table chain
delete chain [family] table handle handle
rename chain [family] table chain newname

チェーンはルールのコンテナです。
チェーンは 2 種類、ベースチェーンとレギュラーチェーンで存在します。
ベースチェーンはネットワーキングスタックからのパケットのエントリポイントです。
レギュラーチェーンはジャンプターゲットとして使用でき、より良いルール編成に使用されます。

  • add: 指定したテーブルに新しいチェーンを追加します。 フックと優先度の値が指定されると、チェーンはベースチェーンとして作成され、ネットワークスタックにフックされます。
  • create: add コマンドに似ていますが、チェーンがすでに存在する場合はエラーを返します。
  • delete: 指定したチェーンを削除します。 チェーンにはルールを含めたり、ジャンプターゲットとして使用しないでください。
  • rename: 指定したチェーンの名前を変更します。
  • list: 指定したチェーンのすべてのルールを一覧表示します。
  • flush: 指定したチェーンのすべてのルールをフラッシュします。

ベースチェーンの場合、タイプ、フック、優先度のパラメーターは必須です。

サポートされるチェーンタイプ

タイプ ファミリー フック 説明
filter all all 迷わず使えるスタンダードチェーンタイプ。
nat ip, ip6 prerouting, input, output, postrouting このタイプのチェーンは、 conntrack エントリに基づいてネットワークアドレス変換を実行します。接続の最初のパケットだけが実際にこのチェーンを通過します。そのルールは通常、作成された conntrack エントリ(たとえば、 NAT ステートメント)の詳細を定義します。
route ip, ip6 output パケットがこのタイプのチェーンを通過し、受け入れようとしている場合、 IP ヘッダーの関連部分が変更されていれば、新しいルート検索が実行されます。これにより、たとえば nftables にポリシールーティングセレクターを実装します。

上記の特殊なケース(たとえば、 nat タイプが forward フックをサポートしていない、または route タイプが output フックのみをサポートしている)とは別に、注目に値するさらに 2 つの癖があります。

  • netdev ファミリは、単一の組み合わせ、つまり filter タイプと input フックのみをサポートします。
    このファミリのベースチェーンは、受信インターフェイスごとに存在するため、デバイスパラメータが存在することも必要です。

  • arp ファミリーは、 filter タイプのチェーンで、 input フックと output フックのみをサポートします。

priority パラメータは、同じフック値を持つチェーンがトラバースされる順序を指定する符号付き整数値を受け入れます。
順序は昇順です。つまり低い優先度の値が高い値よりも優先されます。

ベースチェーンでは、チェーンのポリシーを設定することもできます。
ポリシーは、定義済みルールで明示的に受け入れられたり拒否されたりしていないパケットに何が起こるかを設定します。
サポートされるポリシー値は、accept (デフォルト)または drop です。

ルール

[add | insert] rule [family] table chain [ {handle | position} handle | index index] statement...
replace rule [family] table chain handle handle statement...
delete rule [family] table chain handle handle

指定されたテーブルのチェーンにルールが追加されます。
ファミリーが指定されていない場合は、 ip ファミリーが使用されます。
ルールは一連の文法規則に従って、 2 種類のコンポーネントから構成されます。
式とステートメントです。

add および insert コマンドは、任意の位置指定子をサポートします。
これは、既存のルールのハンドルまたはインデックス(ゼロから開始)のいずれかです。
内部的には、ルールの場所は常にハンドルによって識別され、インデックスからの変換はユーザー空間で行われます。
変換後に同時ルールセット変更が発生した場合、これには 2 つの潜在的な影響があります。
参照されたルールの前にルールが挿入または削除された場合、有効なルールインデックスが変更される可能性があります。
参照されたルールが削除された場合、無効なハンドルが指定された場合と同様に、コマンドはカーネルによって拒否されます。

  • add: ステートメントのリストで記述された新しいルールを追加します。 ハンドルが指定されていない限り、ルールは指定されたチェーンに追加されます。 ハンドルが指定されている場合、ルールはハンドルによって指定されたルールに追加されます。 代替名の位置は非推奨です。今後は使用しないでください。
  • insert: add コマンドと同様ですが、ルールはチェーンの最初または指定されたハンドルを持つルールの前に追加されます。
  • replace: add コマンドに似ていますが、指定されたルールを置き換えます。
  • delete: 指定したルールを削除します。
ipテーブルのinputチェーンにルールを追加する例
# 'ip filter' が想定されます
nft add rule filter output ip daddr 192.168.0.0/24 accept
# 同じコマンド、もう少し詳細
nft add rule ip filter output ip daddr 192.168.0.0/24 accept
inetテーブルからルールを削除する例
nft -a list ruleset

table inet filter {
  chain input {
    type filter hook input priority 0; policy accept;
    ct state established,related accept # handle 4
    ip saddr 10.1.1.1 tcp dport ssh accept # handle 5
    ...

# handle 5 のルールを削除する。
nft delete rule inet filter input handle 5

セット

nftables は 2 種類のセットの概念を提供します。
匿名セットは、特定の名前を持たないセットです。
セットのメンバーは中括弧で囲まれ、セットを使用するルールの作成時に要素をコンマで区切ります。
そのルールが削除されると、セットも削除されます。
それらを更新することはできません。
つまり匿名セットが宣言されると、匿名セットを使用するルールを削除または変更しない限り、更新できなくなります。

匿名セットを使用して特定のサブネットとポートを受け入れる例
nft add rule filter input ip saddr { 10.0.0.0/8, 192.168.0.0/16 } tcp dport { 22, 443 } accept

名前付きセットは、ルールで参照する前に最初に定義する必要があるセットです。
匿名セットとは異なり、要素は名前付きセットにいつでも追加または削除できます。
セットはセット名の前に @ を付けてルールから参照されます。

名前付きセットを使用してアドレスとポートを受け入れる例
nft add rule filter input ip saddr @allowed_hosts tcp dport @allowed_ports accept

セット allowed_hosts および allowed_ports を最初に作成する必要があります。

次のセクションでは nft の set 構文について詳しく説明します。

add set [family] table set { type type ; [flags flags ;] [timeout timeout ;] [gc-interval gc-interval ;] [elements = { element[,...] } ;] [size size ;] [policy policy ;] [auto-merge auto-merge ;] }
{delete | list | flush} set [family] table set
delete set [family] table handle handle
{add | delete} element [family] table set { element[,...] }

セットはユーザー定義のデータ型の要素コンテナであり、ユーザー定義の名前によって一意に識別され、テーブルにアタッチされます。

  • add: 指定したテーブルに新しいセットを追加します。
  • delete: 指定したセットを削除します。
  • list: 指定されたセットの要素を表示します。
  • flush: 指定したセットからすべての要素を削除します。
  • add element 指定したセットに追加する要素のカンマ区切りのリスト。
  • delete element 指定したセットから削除する要素のカンマ区切りのリスト。

セット仕様

キーワード 説明 タイプ
type セット要素のデータ型 文字列: ipv4_addr, ipv6_addr, ether_addr, inet_proto, inet_service, mark
flags フラグを設定する 文字列: constant, interval, timeout
timeout 要素がセット内に留まる時間。セットがパケットパス(ルールセット)から追加される場合は必須。 文字列: 10進数の後に単位(d, h, m, s)を付加する。
gc-interval ガベージコレクションの間隔。タイムアウトまたはフラグタイムアウトがアクティブな場合にのみ使用可能 文字列: 10進数の後に単位(d, h, m, s)を付加する。
elements セットに含まれる要素 データ型を設定する。
size セット内の要素の最大数。セットがパケットパス(ルールセット)から追加される場合は必須。 符号なし整数(64ビット)
policy ポリシーを設定する。 文字列: performance [default], memory
auto-merge 隣接 / 重複するセット要素の自動マージ(interval セットのみ)

マップ

add map [family] table map { type type [flags flags ;] [elements = { element[,...] };] [size size ;] [policy policy ;] }
{delete | list | flush} map [family] table map
{add | delete} element [family] table map { elements = { element[,...] } ; }

マップは入力として使用される特定のキーに基づいてデータを格納し、ユーザー定義の名前によって一意に識別され、テーブルに添付されます。

  • add: 指定したテーブルに新しいマップを追加します。
  • delete: 指定したマップを削除します。
  • list: 指定されたマップの要素を表示します。
  • flush: 指定されたマップからすべての要素を削除します。
  • add element 指定したマップに追加する要素のカンマ区切りのリスト。
  • delete element 指定したマップから削除する要素キーのカンマ区切りのリスト。

マップの仕様

キーワード 説明 タイプ
type マップ要素のデータ型 key_name:value の形式で指定する。 値として使用可能な型: ipv4_addr, ipv6_addr, ether_addr, inet_proto, inet_service, mark, counter, quota。 couterquota はキー名として使用できません。
flags マップフラグ 文字列: constant, interval
elements マップに含まれる要素 マップデータ型
size マップ内の要素の最大数 符号なし整数(64ビット)
policy マップポリシー 文字列: performance [default], memory

フローテーブル

{add | create} flowtable [family] table flowtable { hook hook priority priority ; devices = { device[,...] } ; }
{delete | list} flowtable [family] table flowtable

フローテーブルを使用すると、ソフトウェアでのパケット転送を高速化できます。
フローテーブルエントリは、入力インターフェイス、送信元と宛先のアドレス、送信元と宛先のポート; レイヤー3 / 4 プロトコルで構成されるタプルで表されます。
各エントリは、宛先インターフェイスとゲートウェイアドレスをキャッシュし、宛先リンク層アドレスを更新して、パケットを転送します。
ttl および hoplimit フィールドも減少します。
したがってフローテーブルは、パケットが従来の転送パスをバイパスできるようにする代替パスを提供します。
フローテーブルは prerouting フックの前にある ingress フックにあります。
forward チェーンからのフローオフロード式を使用して、オフロードするフローを選択できます。
フローテーブルは、アドレスファミリと名前で識別されます。
アドレスファミリは ip, ip6, inet のいずれかである必要があります。
inet アドレスファミリは、ハイブリッド IPv4 / IPv6 テーブルを作成するために使用されるダミーファミリです。
アドレスファミリが指定されていない場合、デフォルトで ip が使用されます。

  • add: 指定された名前の指定されたファミリの新しいフローテーブルを追加します。
  • delete: 指定したフローテーブルを削除します。
  • list: すべてのフローテーブルを一覧表示します。

ステートフルオブジェクト

{add | delete | list | reset} type [family] table object
delete type [family] table handle handle

ステートフルオブジェクトはテーブルにアタッチされ、一意の名前で識別されます。
それらはルールからステートフルな情報をグループ化し、ルールでそれらを参照するためにキーワード type name が使用されます。
例: counter name

  • add: 指定されたテーブルに新しいステートフルオブジェクトを追加します。
  • delete: 指定したオブジェクトを削除します。
  • list: オブジェクトが保持するステートフル情報を表示します。
  • reset: ステートフルオブジェクトの一覧表示とリセットを実行します。

CT

ct helper helper { type type protocol protocol ; [l3proto family ;] }

ct helper は、 ct helper set ステートメントと組み合わせて使用​​できる接続追跡ヘルパーを定義するために使用されます。
type と protocol は必須です。
l3proto はデフォルトでテーブルファミリーから派生します。
つまりカーネルがサポートしている場合、カーネルは inet テーブルで IPv4 と IPv6 の両方のヘルパーバックエンドをロードしようとします。

conntrack ヘルパーの仕様

キーワード 説明 タイプ
type ヘルパータイプの名前 引用符付きの文字列(例: "ftp")
protocol ヘルパーのレイヤー 4 プロトコル 文字列(例: tcp)
l3proto ヘルパーのレイヤー 3 プロトコル アドレスファミリ(例: ip)

FTP ヘルパーの定義と割り当て

iptables とは異なり、ヘルパーの割り当ては、 conntrack 検索が完了した後に、たとえばデフォルトの 0 フック優先度で実行する必要があります。

table inet myhelpers {
  ct helper ftp-standard {
    type "ftp" protocol tcp
  }
  chain prerouting {
    type filter hook prerouting priority 0;
    tcp dport 21 ct helper set "ftp-standard"
  }
}

カウンター

counter [packets bytes]

カウンター仕様

キーワード 説明 タイプ
packets パケットの初期数 符号なし整数(64ビット)
bytes バイトの初期数 符号なし整数(64ビット)

クォータ

quota [over | until] [used]

クォータ仕様

キーワード 説明 タイプ
quota クォータ制限。クォータ名として使用されます。 符号なし整数(64ビット)と文字列(bytes, kbytes, mbytes)の 2 つの引数を指定する。 overuntil はこれらの引数の前にあります
used 使用済みクォータの初期値 符号なし整数(64ビット)と文字列(bytes, kbytes, mbytes)の 2 つの引数を指定する。

式は、ネットワークアドレス、ポート番号などの定数、またはルールセットの評価中にパケットから収集されたデータのいずれかの値を表します。
バイナリ式、論理式、リレーショナル式、およびその他のタイプの式を使用して式を組み合わせて、複雑な式またはリレーショナル(一致)式を形成できます。
これらは NAT、パケットマーキングなど、特定のタイプの操作の引数としても使用されます。

各式にはデータ型があり、これにより、シンボリック値のサイズ、解析、表現、および他の式との型の互換性が決まります。

DESCRIBE コマンド

describe expression

describe コマンドは、式のタイプとそのデータ型に関する情報を表示します。

$ nft describe tcp flags
payload expression, datatype tcp_flag (TCP flag) (basetype bitmask, integer), 8 bits

predefined symbolic constants:
fin                           0x01
syn                           0x02
rst                           0x04
psh                           0x08
ack                           0x10
urg                           0x20
ecn                           0x40
cwr                           0x80

データ型

データ型は、シンボリック値のサイズ、解析、表現、および式の型の互換性を決定します。
いくつかのグローバルデータタイプが存在し、さらにいくつかの式タイプは、その式タイプに固有の追加のデータ型を定義します。
ほとんどのデータ型は固定サイズですが、一部は動的サイズです。
(例: 文字列型)

型は、低次の型から派生できます。
IPv4 アドレスタイプは整数タイプから派生しています。
つまり IPv4 アドレスを整数値として指定することもできます。

特定のコンテキスト(セットおよびマップ定義)では、データ型を明示的に指定する必要があります。
各型には、このために使用される名前があります。

整数型

名前 キーワード サイズ ベースタイプ
Integer integer 可変 -

整数型は数値に使用されます。
10 進数、 16 進数、または 8 進数で指定できます。
整数型は固定サイズではなく、そのサイズは使用される式によって決定されます。

ビットマスク型

名前 キーワード サイズ ベースタイプ
Bitmask bitmask 可変 integer

ビットマスクにはビットマスクタイプ(bitmask)が使用されます。

文字列型

名前 キーワード サイズ ベースタイプ
String string 可変 -

文字列タイプは文字列に使用されます。
文字列は英字(a-zA-Z)で始まり、その後に 0 個以上の英数字または文字と記号( / , - , _ , . )が続きます。
さらに、二重引用符( " )で囲まれたものはすべて文字列として認識されます。

文字列型の指定

# インターフェース名
filter input iifname eth0

# 変わったインターフェース名
filter input iifname "(eth0)"

リンク層アドレス型

名前 キーワード サイズ ベースタイプ
Link layer address lladdr 可変 integer

リンク層アドレスタイプは、リンク層アドレスに使用されます。
リンク層アドレスは、コロン(:)を使用して区切られた 2 桁の 16 進数の可変数のグループとして指定されます。

リンク層アドレス指定
# イーサネット宛先 MAC アドレス
filter input ether daddr 20:c9:d0:43:12:d9

IPV4 アドレス型

名前 キーワード サイズ ベースタイプ
IPv4 address ipv4_addr 32ビット integer

IPv4 アドレスには IPv4 アドレスタイプが使用されます。
アドレスはドット付き 10 進数、ドット付き 16 進数、ドット付き 8 進数、 10 進数、 16 進数、 8 進数のいずれか、またはホスト名として指定されます。
ホスト名は、標準のシステムリゾルバーを使用して解決されます。

IPv4アドレス指定
# ドット 10 進表記
filter output ip daddr 127.0.0.1

# ホスト名
filter output ip daddr localhost

IPV6 アドレス型

名前 キーワード サイズ ベースタイプ
IPv6 address ipv6_addr 128ビット integer

IPv6 アドレスには IPv6 アドレスタイプが使用されます。
アドレスはホスト名として、またはコロンで区切られた 16 進数のハーフワードとして指定されます。
アドレスはポート番号と区別するために角括弧( [] )で囲まれる場合があります。

IPv6アドレスの指定
# 省略されたループバックアドレス
filter output ip6 daddr ::1

# 角括弧表記を使用した IPv6 アドレスの指定
# [] なしのポート番号(22)は、 ipv6 アドレスの一部として解析されます。
ip6 nat prerouting tcp dport 2222 dnat to [1ce::d0]:22

ブール型

名前 キーワード サイズ ベースタイプ
Boolean boolean 1 ビット integer

ブール型はユーザー空間における構文ヘルパー型です。
これは(通常は暗黙的な)関係式の右辺で、左辺の式をブール値チェック(通常は exists )に変更するために使用されます。

次のキーワードは、指定された値を持つブール型に自動的に解決されます。

キーワード
exists 1
missing 0

ブール仕様

次の式はブール比較をサポートしています。

動作
fib ルートの存在を確認する。
exthdr IPv6 拡張ヘッダーの存在を確認する。
tcp option TCP オプションヘッダーの存在を確認する。
# ルートが存在する場合に一致
filter input fib daddr . iif oif exists

# IPv6 トラフィックの断片化されていないパケットのみに一致
filter input exthdr frag missing

# TCP タイムスタンプオプションが存在する場合に一致
filter input tcp option timestamp exists

ICMP タイプ型

名前 キーワード サイズ ベースタイプ
ICMP Type icmp_type 8 ビット integer

ICMP タイプ型は ICMP ヘッダーのタイプフィールドを簡単に指定するために使用されます。

ICMP タイプを指定する場合、次のキーワードを使用できます。

キーワード
echo-reply 0
destination-unreachable 3
source-quench 4
redirect 5
echo-request 8
router-advertisement 9
router-solicitation 10
time-exceeded 11
parameter-problem 12
timestamp-request 13
timestamp-reply 14
info-request 15
info-reply 16
address-mask-request 17
address-mask-reply 18
ICMPタイプの指定
# pingパケットに一致
filter output icmp type { echo-request, echo-reply }

ICMP コード型

名前 キーワード サイズ ベースタイプ
ICMP Code icmp_code 8 ビット integer

ICMP コードタイプは ICMP ヘッダーのコードフィールドを簡単に指定するために使用されます。

ICMP コードを指定するときは、次のキーワードを使用できます。

キーワード
net-unreachable 0
host-unreachable 1
prot-unreachable 2
port-unreachable 3
net-prohibited 9
host-prohibited 10
admin-prohibited 13

ICMPV6 タイプ型

名前 キーワード サイズ ベースタイプ
ICMPv6 Type icmpv6_type 8 ビット integer

ICMPv6 タイプ型は ICMPv6 ヘッダーのタイプフィールドを簡単に指定するために使用されます。

ICMPv6 タイプを指定する場合、次のキーワードを使用できます。

キーワード
destination-unreachable 1
packet-too-big 2
time-exceeded 3
parameter-problem 4
echo-request 128
echo-reply 129
mld-listener-query 130
mld-listener-report 131
mld-listener-done 132
mld-listener-reduction 132
nd-router-solicit 133
nd-router-advert 134
nd-neighbor-solicit 135
nd-neighbor-advert 136
nd-redirect 137
router-renumbering 138
ind-neighbor-solicit 141
ind-neighbor-advert 142
mld2-listener-report 143
ICMPv6タイプの指定
# ICMPv6 ping パケットに一致
filter output icmpv6 type { echo-request, echo-reply }

ICMPV6 コード型

名前 キーワード サイズ ベースタイプ
ICMPv6 Code icmpv6_code 8 ビット integer

ICMPv6 コードタイプは、 ICMPv6 ヘッダーのコードフィールドを簡単に指定するために使用されます。

ICMPv6 コードを指定する場合、次のキーワードを使用できます。

キーワード
no-route 0
admin-prohibited 1
addr-unreachable 3
port-unreachable 4
policy-fail 5
reject-route 6

ICMPVX コード型

名前 キーワード サイズ ベースタイプ
ICMPvX Code icmpx_code 8 ビット integer

ICMPvX コード型の抽象化は、 inet ファミリから使用される ICMP と ICMPv6 コード型の間で重複する値のセットです。

ICMPvX コードを指定する場合、次のキーワードを使用できます。

キーワード
no-route 0
port-unreachable 1
host-unreachable 2
admin-prohibited 3

Conntrack 型

これは ct 式およびステートメントで使用される型の概要です。

名前 キーワード サイズ ベースタイプ
conntrack state ct_state 4 バイト bitmask
conntrack direction ct_dir 8 ビット integer
conntrack status ct_status 4 バイト bitmask
conntrack event bits ct_event 4 バイト bitmask
conntrack label ct_label 128 ビット bitmask

上記のタイプごとに、便宜上キーワードを使用できます。

conntrack state(ct_state)

キーワード
invalid 1
established 2
related 4
new 8
untracked 64

conntrack direction(ct_dir)

キーワード
original 0
reply 1

conntrack status(ct_status)

キーワード
expected 1
seen-reply 2
assured 4
confirmed 8
snat 16
dnat 32
dying 512

conntrack event bits(ct_event)

キーワード
new 1
related 2
destroy 4
reply 8
assured 16
protoinfo 32
helper 64
mark 128
seqadj 256
secmark 512
label 1024

conntrack label type(ct_label) の指定可能なキーワードは、実行時に /etc/connlabel.conf から読み込まれます。

一次式

最下位の式は、パケットのペイロード、メタデータ、またはステートフルモジュールからの定数または単一のデータを表す一次式です。

メタ式

meta {length | nfproto | l4proto | protocol | priority}
[meta] {mark | iif | iifname | iiftype | oif | oifname | oiftype | skuid | skgid | nftrace | rtclassid | ibrname | obrname | pkttype | cpu | iifgroup | oifgroup | cgroup | random | secpath}

メタ式とは、パケットに関連付けられたメタデータを指します。

メタ式には、非修飾メタ式と修飾メタ式の 2 種類があります。
修飾されたメタ式では、メタキーの前に meta キーワードが必要です。
修飾されていないメタ式は、メタキーを直接または修飾されたメタ式として指定できます。
meta l4proto は、 IPv4 または IPv6 パケットの一部である特定のトランスポートプロトコルを照合するのに役立ちます。
また IPv6 パケットに存在する IPv6 拡張ヘッダーもスキップします。

メタ式タイプ

キーワード 説明 タイプ
length パケットの長さ(バイト) integer(32 ビット)
nfproto 実際のフックプロトコルファミリ。 inet テーブルでのみ有用 integer(32 ビット)
l4proto レイヤー 4 プロトコル。 ipv6 拡張ヘッダーをスキップ integer(8 ビット)
protocol EtherType プロトコル値 ether_type
priority TC パケットの優先度 tc_handle
mark パケットマーク mark
iif 入力インターフェースインデックス iface_index
iifname 入力インターフェース名 ifname
iiftype 入力インターフェースタイプ iface_type
oif 出力インターフェイスインデックス iface_index
oifname 出力インターフェース名 ifname
oiftype 出力インターフェイスハードウェアタイプ iface_type
skuid 元のソケットに関連付けられた UID uid
skgid 元のソケットに関連付けられた GID gid
rtclassid ルーティングレルム realm
ibrname 入力ブリッジインターフェース名 ifname
obrname 出力ブリッジインターフェイス名 ifname
pkttype パケットタイプ pkt_type
cpu パケットを処理する CPU 番号 integer(32 ビット)
iifgroup 受信デバイスグループ devgroup
oifgroup 送信デバイスグループ devgroup
cgroup コントロールグループ ID integer(32 ビット)
random 疑似乱数 integer(32ビット)
secpath ブール値 boolean(1ビット)

メタ式固有の型

タイプ 説明
iface_index インターフェイスインデックス(32 ビット番号)。数値または既存のインターフェースの名前として指定できます。
ifname インターフェース名(16 バイト文字列)。必須ではありません。
iface_type インターフェイスの種類(16 ビット番号)。
uid ユーザー ID(32 ビット番号)。数値またはユーザー名として指定できます。
gid グループ ID(32 ビット番号)。数値またはグループ名として指定できます。
realm ルーティングレルム(32 ビット番号)。数値、または /etc/iproute2/rt_realms で定義されたシンボル名として指定できます。
devgroup_type デバイスグループ(32 ビット番号)。数値または /etc/iproute2/group で定義されている記号名として指定できます。
pkt_type パケットタイプ: ユニキャスト(ローカルホスト宛て)、ブロードキャスト(全員宛て)、マルチキャスト(グループ宛て)。
メタ式の使用例
# 修飾されたメタ式
filter output meta oif eth0

# 修飾されていないメタ式
filter output oif eth0

# ipsec 処理の対象だったパック
raw prerouting meta secpath exists accept

FIB(Forwarding Information Base) 式

fib {saddr | daddr | {mark | iif | oif}} {oif | oifname | type}

fib 式は、 fib(転送情報ベース)に照会して、特定のアドレスが使用する出力インターフェイスインデックスなどの情報を取得します。
入力は、 fib 検索関数への入力として使用される要素のタプルです。

fib 式固有の型

キーワード 説明 タイプ
oif 出力インターフェイスインデックス integer(32ビット)
oifname 出力インターフェース名 string
type アドレスの種類 fib_addrtype
FIB式の使用例
# リバースパスなしでパケットをドロップ
filter prerouting fib saddr . iif oif missing drop

# インターフェースに設定されていないアドレスへのパケットをドロップ
filter prerouting fib daddr . iif type != { local, broadcast, multicast } drop

# 特定の 'blackhole' テーブルで検索を実行( 0xdead, 適切な ip ルールが必要)
filter prerouting meta mark set 0xdead fib daddr . mark type vmap { blackhole : drop, prohibit : jump prohibited, unreachable : drop }

ルーティング式

rt {classid | nexthop}

ルーティング式は、パケットに関連付けられたルーティングデータを指します。

ルーティング式の型

キーワード 説明 タイプ
classid ルーティングレルム realm
nexthop ルーティングネクストホップ ipv4_addr / ipv6_addr
mtu ルートの TCP 最大セグメントサイズ integer(16 ビット)

ルーティング式固有の型

タイプ 説明
realm ルーティングレルム(32 ビット番号)。数値で、または /etc/iproute2/rt_realms で定義されたシンボル名として指定できます。
ルーティング式の使用例
# IPファミリに依存しない rt 式
filter output rt classid 10

# IPファミリ依存の rt 式
ip filter output rt nexthop 192.168.0.1
ip6 filter output rt nexthop fd00::1
inet filter output rt ip nexthop 192.168.0.1
inet filter output rt ip6 nexthop fd00::1

ペイロード式

ペイロード式は、パケットのペイロードからのデータを参照します。

イーサネットヘッダー式

ether [Ethernet header field]

イーサネットヘッダー式の型

キーワード 説明 タイプ
daddr 宛先 MAC アドレス ether_addr
saddr 送信元 MAC アドレス ether_addr
type EtherType ether_type

VLAN ヘッダー式

vlan [VLAN header field]
キーワード 説明 タイプ
id VLAN ID(VID) integer(12 ビット)
cfi Canonical Format Indicator integer(1 ビット)
pcp Priority code point integer(3 ビット)
type EtherType ether_type

ARPヘッダー式

arp [ARP header field]
キーワード 説明 タイプ
htype ARP ハードウェアタイプ integer(16 ビット)
ptype EtherType ether_type
hlen ハードウェアアドレス長 integer(8 ビット)
plen プロトコルアドレス長 integer(8 ビット)
operation オペレーション arp_op

IPV4 ヘッダー式

ip [IPv4 header field]
キーワード 説明 タイプ
version IP ヘッダーバージョン(4) integer(4 ビット)
hdrlength オプションを含む IP ヘッダーの長さ integer(4 ビット) FIXME スケーリング
dscp Differentiated Services Code Point dscp
ecn 明示的な輻輳通知(Explicit Congestion Notification) ecn
length 総パケット長 integer(16 ビット)
id IP ID integer(16 ビット)
frag-off フラグメントのオフセット integer(16 ビット)
ttl 生存時間(Time to live) integer(8 ビット)
protocol 上位層プロトコル inet_proto
checksum IP ヘッダーチェックサム integer(16 ビット)
saddr 送信元アドレス ipv4_addr
daddr 宛先アドレス ipv4_addr

ICMP ヘッダー式

icmp [ICMP header field]
キーワード 説明 タイプ
type ICMP タイプフィールド icmp_type
code ICMP コードフィールド integer(8 ビット)
checksum ICMP チェックサムフィールド integer(16 ビット)
id エコー要求 / 応答の ID integer(16 ビット)
sequence エコー要求 / 応答のシーケンス番号 integer(16 ビット)
gateway リダイレクトのゲートウェイ integer(32 ビット)
mtu MTU 経路探査の MTU integer(16 ビット)

IPV6 ヘッダー式

ip6 [IPv6 header field]

この式は ipv6 ヘッダーフィールドを参照します。
ip6 nexthdr を使用する場合の注意ですが、値は next ヘッダーのみを参照します。
つまり ip6 nexthdr tcp は ipv6 パケットに拡張ヘッダーが含まれていない場合にのみ一致します。
フラグメント化されたパケット、またはルーティング拡張ヘッダーが含まれている場合は照合されません。
実際のトランスポートヘッダーと一致させ、代わりに追加の拡張ヘッダーを無視する場合は meta l4proto を使用してください。

キーワード 説明 タイプ
version IP ヘッダーバージョン(6) integer(4 ビット)
dscp Differentiated Services Code Point dscp
ecn 明示的な輻輳通知(Explicit Congestion Notification) ecn
flowlabel フローラベル integer(20 ビット)
length ペイロードの長さ integer(16 ビット)
nexthdr nexthdr プロトコル inet_proto
hoplimit ホップ制限 integer(8 ビット)
saddr 送信元アドレス ipv6_addr
daddr 宛先アドレス ipv6_addr

最初の拡張ヘッダーがフラグメントを示している場合に一致

ip6 nexthdr ipv6-frag counter

ICMPV6 ヘッダー式

icmpv6 [ICMPv6 header field]
キーワード 説明 タイプ
type ICMPv6 タイプフィールド icmpv6_type
code ICMPv6 コードフィールド integer(8 ビット)
checksum ICMPv6 チェックサムフィールド integer(16 ビット)
parameter-problem 問題へのポインタ integer(32 ビット)
packet-too-big サイズ超過 MTU integer(32 ビット)
id エコー要求 / 応答の ID 整数(16 ビット)
sequence エコー要求 / 応答のシーケンス番号 integer(16 ビット)
max-delay MLD クエリの最大応答遅延 integer(16 ビット)

TCP ヘッダー式

tcp [TCP header field]
キーワード 説明 タイプ
sport 送信元ポート inet_service
dport 宛先ポート inet_service
sequence シーケンス番号 integer(32 ビット)
ackseq 確認番号 integer(32 ビット)
doff データのオフセット integer(4 ビット) FIXME スケーリング
reserved 予約エリア integer(4 ビット)
flags TCP フラグ tcp_flag
window ウィンドウ integer(16 ビット)
checksum チェックサム integer(16 ビット)
urgptr 緊急ポインタ integer(16 ビット)

UDP ヘッダー式

udp [UDP header field]
キーワード 説明 タイプ
sport 送信元ポート inet_service
dport 宛先ポート inet_service
length 総パケット長 integer(16 ビット)
checksum チェックサム integer(16 ビット)

簡易 UDP ヘッダー式

udplite [UDP-Lite header field]
キーワード 説明 タイプ
sport 送信元ポート inet_service
dport 宛先ポート inet_service
checksum チェックサム integer(16 ビット)

SCTP ヘッダー式

sctp [SCTP header field]
キーワード 説明 タイプ
sport 送信元ポート inet_service
dport 宛先ポート inet_service
vtag 検証タグ integer(32 ビット)
checksum チェックサム integer(32 ビット)

DCCP ヘッダー式

dccp [DCCP header field]
キーワード 説明 タイプ
sport 送信元ポート inet_service
dport 宛先ポート inet_service

認証ヘッダー式

ah [AH header field]
キーワード 説明 タイプ
nexthdr 次のヘッダープロトコル inet_proto
hdrlength AH ヘッダーの長さ integer(8 ビット)
reserved 予約エリア integer(16 ビット)
spi セキュリティパラメータインデックス integer(32 ビット)
sequence シーケンス番号 integer(32 ビット)

暗号化されたセキュリティペイロードのヘッダー式

esp [ESP header field]
キーワード 説明 タイプ
spi セキュリティパラメータインデックス integer(32 ビット)
sequence シーケンス番号 integer(32 ビット)

IPCOMP ヘッダー式

comp [IPComp header field]
キーワード 説明 タイプ
nexthdr 次のヘッダープロトコル inet_proto
flags フラグ bitmask
cpi 圧縮パラメータインデックス integer(16 ビット)

RAW ペイロード式

@ [base,offset,length]

Raw ペイロード式は、offsetbits から始まる lengthbits をロードするように指示します。
ビット 0 は最初のビットを指します。
C プログラミング言語では、これは最上位ビット、つまりオクテットの場合は 0x80 に対応します。
これらは人間が読めるテンプレート式がまだないヘッダーを照合するのに役立ちます。
nft は Raw ペイロード式の依存関係を追加しないことに注意してください。
例えばトランスポートヘッダーのプロトコルフィールドをプロトコル番号 5 に一致させるには、異なるトランスポートヘッダーを持つパケットを手動で除外する必要があります。
たとえば Raw 式の前に meta l4proto 5 を使用します。

サポートされているペイロードプロトコルベース

ベース 説明
ll イーサネットヘッダーなどのリンク層
nh ネットワークヘッダー、たとえば IPv4 または IPv6
th トランスポートヘッダー、たとえば TCP
# UDP と TCP の両方に一致する宛先ポート
inet filter input meta l4proto {tcp, udp} @th,16,16 { dns, http }

# ターゲットプロトコルアドレスが指定されたアドレスと一致する場合に
# arp パケットのターゲットハードウェアアドレスを書き換える。
input meta iifname enp2s0 arp ptype 0x0800 arp htype 1 arp hlen 6 arp plen 4 @nh,192,32 0xc0a88f10 @nh,144,48 set 0x112233445566 accept

拡張ヘッダー式

拡張ヘッダー式は、IPv6 拡張ヘッダーや TCP オプションなど、可変サイズのプロトコルヘッダーからのデータを参照します。

nftables は現在、特定の ipv6 拡張ヘッダーまたは TCP オプションのマッチング(検索)をサポートしています。

hbh {nexthdr | hdrlength}
frag {nexthdr | frag-off | more-fragments | id}
rt {nexthdr | hdrlength | type | seg-left}
dst {nexthdr | hdrlength}
mh {nexthdr | hdrlength | checksum | type}
srh {flags | tag | sid | seg-left}
tcp option {eol | noop | maxseg | window | sack-permitted | sack | sack0 | sack1 | sack2 | sack3 | timestamp} tcp_option_field

次の構文は、右辺にブール型があり、ヘッダーの存在を確認するだけの関係式でのみ有効です。

exthdr {hbh | frag | rt | dst | mh}
tcp option {eol | noop | maxseg | window | sack-permitted | sack | sack0 | sack1 | sack2 | sack3 | timestamp}

IPv6 拡張ヘッダー

キーワード 説明
hbh ホップバイホップ
rt ルーティングヘッダー
フラグメント フラグメンテーションヘッダー
dst dst オプション
mh モビリティヘッダー
srh セグメントルーティングヘッダー

TCP オプション

キーワード 説明 TCP オプションフィールド
eol オプションリストの終わり kind
noop 1 バイトの TCP No-op オプション kind
maxseg TCP 最大セグメントサイズ kind, length, size
window TCP ウィンドウスケーリング kind, length, count
sack-permitted 許可された TCP SACK kind, length
sack TCP 選択的確認応答(TCP Selective Acknowledgement)(block 0 のエイリアス) kind, length, left, right
sack0 TCP 選択的確認応答(block 0) kind, length, left, right
sack1 TCP 選択的確認応答(block 1) kind, length, left, right
sack2 TCP 選択的確認応答(block 2) kind, length, left, right
sack3 TCP 選択的確認応答(block 3) kind, length, left, right
timestamp TCP タイムスタンプ kind, length, tsval, tsecr
# TCP オプションの検索
filter input tcp option sack-permitted kind 1 counter

# IPv6 exthdr の検索
ip6 filter input frag more-fragments 1 counter

CONNTRACK 式

conntrack 式は、パケットに関連付けられた接続追跡エントリのメタデータを参照します。

conntrack 式には 3 つのタイプがあります。
一部の conntrack 式では conntrack キーの前にフローの方向が必要ですが、他の式は方向に依存しないため、直接使用する必要があります。
packets , bytes , avgpkt キーワードは、方向の有無にかかわらず使用できます。
方向を省略すると、元の方向と返信方向の合計が返されます。
同じことがゾーンにも当てはまります。
方向が指定されている場合、ゾーン ID が指定された方向に関連付けられている場合にのみゾーンが一致します。

ct {state | direction | status | mark | expiration | helper | label | l3proto | protocol | bytes | packets | avgpkt | zone}
ct {original | reply} {l3proto | protocol | proto-src | proto-dst | bytes | packets | avgpkt | zone}
ct {original | reply} {ip | ip6} {saddr | daddr}
キーワード 説明 タイプ
state 接続の状態 ct_state
direction 接続に対するパケットの方向 ct_dir
status 接続のステータス ct_status
mark 接続マーク mark
expiration 接続の有効期限 time
helper 接続に関連付けられたヘルパー string
label nftables インクルードパスの connlabel.conf で定義された接続追跡ラベルビットまたはシンボリック名 ct_label
l3proto 接続のレイヤー 3 プロトコル nf_proto
saddr 指定された方向の接続の送信元アドレス ipv4_addr / ipv6_addr
daddr 指定された方向の接続の宛先アドレス ipv4_addr / ipv6_addr
protocol 指定された方向の接続のレイヤー 4 プロトコル inet_proto
proto-src 指定された方向のレイヤ 4 送信元プロトコル integer(16 ビット)
proto-dst 指定された方向のレイヤー 4 宛先プロトコル integer(16 ビット)
packets 指定された方向に検知されるパケット数、またはオリジナルと返信の合計 integer(64 ビット)
bytes 検知バイト数、 packets キーワードの説明を参照 integer(64 ビット)
avgpkt パケットあたりの平均バイト、 packets キーワードの説明を参照 integer(64 ビット)
zone conntrack ゾーン integer(16 ビット)

上記の conntrack 固有の型の説明は、上記の CONNTRACK TYPES のサブセクションにあります。

ステートメント

ステートメントは実行されるアクションを表します。
制御フローを変更したり(return, 別のチェーンへの jump, パケットの accept または drop)、ロギングやパケットの拒否などのアクションを実行できます。

ステートメントは 2 種類あります。
終了ステートメントは現在のルールの評価を無条件に終了します。
非終了ステートメントは条件付きでのみ終了、または現在のルールの評価を決して終了しません。
つまりそれらはルールセット評価の観点から受動的です。
ルールには任意の数の非終了ステートメントを含めることができますが、最終ステートメントとして単一の終了ステートメントのみを使用できます。

判定ステートメント

判定ステートメントはルールセットの制御フローを変更し、パケットのポリシー決定を発行します。

{accept | drop | queue | continue | return}
{jump | goto} chain
  • accept: ルールセット評価を終了し、パケットを受け入れます。
  • drop: ルールセットの評価を終了し、パケットを破棄します。
  • queue: ルールセットの評価を終了し、パケットをユーザースペースにキューイングします。
  • continue: 次のルールでルールセットの評価を続行します。FIXME。
  • return: 現在のチェーンから戻り、最後のチェーンの次のルールで評価を続行します。ベースチェーンで発行された場合、それは accept と同等です。
  • jump chain: チェーンの最初のルールで評価を続行します。ルールセットの現在の位置はコールスタックにプッシュされ、新しいチェーンが完全に評価されて return 判定が発行されると、評価はそこで続行されます。
  • goto chain: jump に似ていますが、現在の位置はコールスタックにプッシュされません。つまり新しいチェーンの評価後は goto ステートメントを含むチェーンではなく、最後のチェーンで続行されます。
# eth0 と内部ネットワークからのパケットを from_lan で処理する。
filter input iif eth0 ip saddr 192.168.0.0/24 jump from_lan

# チェーン、異なる送信元アドレスを持つ eth0 からのすべてのパケットを破棄します。
filter input iif eth0 drop

ペイロードステートメント

ペイロードステートメントはパケットの内容を変更します。
たとえば、ip DSCP(differv) ヘッダーフィールドまたは ipv6 フローラベルを設定するために使用できます。

ブリッジする代わりに一部のパケットをルーティングする。

# tcp:http を 192.160.0.0/16 からローカルマシンにリダイレクトして、ブリッジングではなくルーティングする
# 00:11:22:33:44:55 がローカル MAC アドレスである想定です。
bridge input meta iif eth0 ip saddr 192.168.0.0/16 tcp dport 80 meta pkttype set unicast ether daddr set 00:11:22:33:44:55

# IPv4 DSCP ヘッダーフィールドの設定
ip forward ip dscp set 42

拡張ヘッダーステートメント

拡張ヘッダーステートメントは可変サイズのヘッダーのパケットコンテンツを変更します。
これは現在 TCPMSS と同様に、パケットの TCP 最大セグメントサイズを変更するために使用できます。

# tcp mss を変更する
tcp flags syn tcp option maxseg size set 1360

# ルート情報に基づいてサイズを設定する
tcp flags syn tcp option maxseg size set rt mtu

ログステートメント

log [prefix quoted_string] [level syslog-level] [flags log-flags]
log group nflog_group [prefix quoted_string] [queue-threshold value] [snaplen size]

log ステートメントは、一致するパケットのロギングを有効にします。
このステートメントをルールから使用すると、 Linux カーネルはヘッダーフィールドなど、一致するすべてのパケットに関する情報をカーネルログを介して出力します(dmesg(1) で読み取るか、 syslog で読み取ることができます)。
グループ番号が指定されている場合、 Linux カーネルはパケットを nfnetlink_log に渡し、 netlink ソケットを介してパケットを指定されたマルチキャストグループにマルチキャストします。
1 つ以上のユーザースペースプロセスがグループに登録されていてパケットを受信する場合があります。
詳細については、 libnetfilter_queue のドキュメントをご覧ください。
これは非終了ステートメントであるため、パケットがログに記録された後もルール評価は続行されます。

ログステートメントオプション

キーワード 説明 タイプ
prefix ログメッセージの接頭辞 引用符で囲まれた文字列
level ロギングの Syslog レベル string: emerg, alert, crit, err, warn [default], notice, info, debug
group メッセージを送信する NFLOG グループ 符号なし整数(16 ビット)
snaplen netlink メッセージに含めるパケットペイロードの長さ 符号なし整数(32 ビット)
que-threshold ユーザー空間に送信する前にカーネル内でキューに入れるパケットの数 符号なし整数(32 ビット)

ログフラグ

フラグ 説明
tcp sequence TCP シーケンス番号をログに記録します。
tcp options TCP パケットヘッダーのログオプション。
ip options IP / IPv6 パケットヘッダーのログオプション。
skuid パケットを生成したプロセスのユーザー ID をログに記録します。
ether MAC アドレスとプロトコルをデコードします。
all 上記のすべてのログフラグを有効にします。
ログステートメントの使用例
# パケットと IP オプションを生成した UID をログに記録する
ip filter output log flags skuid flags ip options

# TCP パケットからの TCP シーケンス番号と TCP オプションをログに記録する
ip filter output log flags tcp sequence,options

# サポートされているすべてのログフラグを有効にする
ip6 filter output log flags all

拒否ステートメント

reject [ with {icmp | icmpv6 | icmpx} type {icmp_code | icmpv6_code | icmpx_code} ]
reject [ with tcp reset ]

reject ステートメントは、一致したパケットに応答してエラーパケットを送り返すために使用されます。
それ以外の場合は drop と同じであるため、ルールトラバーサルを終了する終了ステートメントです。
このステートメントは、 input チェーン、 forward チェーン、 output チェーン、およびこれらのチェーンからのみ呼び出されるユーザー定義チェーンでのみ有効です。

さまざまな ICMP 拒否変数は、さまざまなテーブルファミリで使用するためのものです。

変数 ファミリー タイプ
icmp ip icmp_code
icmpv6 ip6 icmpv6_code
icmpx inet icmpx_code

タイプの説明とサポートされるキーワードのリストについては、上記の データ型 セクションを参照してください。一般的にデフォルトの拒否値は port-unreachable です。

bridge ファミリでは、 reject ステートメントは input または prerouting にフックするベースチェーンでのみ許可されていることに注意してください。

カウンターステートメント

counter ステートメントは、バイト数と共にパケットのヒット数を設定します。

counter [ packets number bytes number ]

CONNTRACK ステートメント

conntrack ステートメントを使用して、 conntrack マークと conntrack ラベルを設定できます。

ct {mark | event | label | zone} set value

ct ステートメントは、接続に関連付けられたメタデータを設定します。
ゾーン ID は、 conntrack 検索が実行される前に割り当てる必要があります。
つまり、これは prerouting および output(ローカルで生成されたパケットを個別のゾーンに配置する必要がある場合)で実行する必要があり、フック優先度は -300 です。

Conntrackステートメントタイプ

キーワード 説明
event conntrack イベントビット bitmask, integer(32 ビット)
helper 接続に割り当てる ct ヘルパーオブジェクトの名前 引用符で囲った文字列
mark 接続追跡マーク mark
label 接続追跡ラベル label
zone conntrack ゾーン integer(16 ビット)
# パケット nfmark を conntrack に保存する
ct mark set meta mark

# インターフェースを介してマップされたゾーンを設定
table inet raw {
  chain prerouting {
    type filter hook prerouting priority -300;
    ct zone set iif map { "eth1" : 1, "veth1" : 2 }
  }
  chain output {
    type filter hook output priority -300;
    ct zone set oif map { "eth1" : 1, "veth1" : 2 }
  }
}

# ctnetlink によって報告されるイベントを制限する
ct event set new,related,destroy

メタステートメント

meta ステートメントはメタ式の値を設定します。
既存のメタフィールドは、 priority , mark , pkttype , nftrace です。

meta {mark | priority | pkttype | nftrace} set value

メタステートメントは、パケットに関連付けられたメタデータを設定します。

メタステートメントのタイプ

キーワード 説明
priority TC パケットの優先度 tc_handle
mark パケットマーク mark
pkttype パケットタイプ pkt_type
nftrace ルールセットパケットトレースのオン / オフ。トレースを監視するには monitor trace コマンドを使用します。 0, 1

制限ステートメント

limit rate [over] packet_number / {second | minute | hour | day} [burst packet_number packets]
limit rate [over] byte_number {bytes | kbytes | mbytes} / {second | minute | hour | day | week} [burst byte_number bytes]

limit ステートメントは、トークンバケットフィルターを使用して制限されたレートで一致します。
このステートメントを使用するルールは、この制限に達するまで一致します。
これをログステートメントと組み合わせて使用​​すると、ロギングを制限できます。
オプションの over キーワードは、指定されたレートを超えて一致させます。

説明 タイプ
packet_number パケット数 符号なし整数(32 ビット)
byte_number バイト数 符号なし整数(32 ビット)

NAT ステートメント

snat to address [:port] [persistent, random, fully-random]
snat to address - address [:port - port] [persistent, random, fully-random]
dnat to address [:port] [persistent, random, fully-random]
dnat to address [:port - port] [persistent, random, fully-random]
masquerade to [:port] [persistent, random, fully-random]
masquerade to [:port - port] [persistent, random, fully-random]
redirect to [:port] [persistent, random, fully-random]
redirect to [:port - port] [persistent, random, fully-random]

nat ステートメントは nat チェーンタイプからのみ有効です。

snat および masquerade ステートメントは、パケットの送信元アドレスを変更する必要があることを指示します。
snatは postrouting と input チェーンでのみ有効ですが、 masquerade は postrouting でのみ意味があります。
dnat および redirect ステートメントは、 prerouting および output チェーンでのみ有効であり、パケットの宛先アドレスを変更する必要があることを指示します。
nat チェーンタイプのベースチェーンから呼び出される非ベースチェーンも使用できます。
この接続における将来のすべてのパケットは破棄され、ルールの評価は中止されます。

masquerade ステートメントは snat の特殊な形式であり、常に変換先の送信インターフェイスの IP アドレスを使用します。
これは動的(パブリック) IP アドレスを持つゲートウェイで特に役立ちます。

redirect ステートメントは dnat の特別な形式で、常に宛先アドレスをローカルホストのアドレスに変換します。
異なるインターフェイスの受信トラフィックの宛先ポートのみを変更したい場合に便利です。

すべての nat ステートメントには、 prerouting と postrouting の両方のベースチェーンが存在する必要があることに注意してください。
さもないと return 経路のパケットが netfilter で認識されず、逆変換が行われません。

NAT ステートメントの値

説明 タイプ
address パケットの送信元 / 宛先アドレスを変更する必要があることを指示します。マッピングを指定して、任意の式キーで構成されるタプルのリストをアドレス値と関連付けることができます。 ipv4_addr, ipv6_addr, たとえば abcd::1234 、またはマッピングを使用できます。meta mark map { 10:192.168.1.2, 20:192.168.1.3 }
port パケットの送信元 / 宛先アドレスを変更する必要があることを指示します。 ポート番号(16 ビット)

NAT ステートメントフラグ

フラグ 説明
persistent 各接続に同じ送信元 / 宛先アドレスをクライアントに与えます。
random 使用した場合、ポートマッピングは、送信元アドレスと宛先アドレス、および宛先ポートを使用してランダムにシードされた MD5 ハッシュミックスを使用してランダム化されます。
fully-random 使用すると、ポートマッピングは 32 ビットの疑似ランダムアルゴリズムに基づいて生成されます。

NAT ステートメントの使用

# その他すべての例に適したテーブル / チェーン設定を作成する
add table nat
add chain nat prerouting { type nat hook prerouting priority 0; }
add chain nat postrouting { type nat hook postrouting priority 100; }

# eth0 経由で送信されるすべてのパケットの送信元アドレスをアドレス 1.2.3.4 に変換します
add rule nat postrouting oif eth0 snat to 1.2.3.4

# eth0 経由で入るすべてのトラフィックを宛先アドレス 192.168.1.120 にリダイレクトします
add rule nat prerouting iif eth0 dnat to 192.168.1.120

# eth0 経由で送信されるすべてのパケットの送信元アドレスを何にでも変換
# ローカルで生成されたパケットは、同じ宛先に到達するためのソースとして使用されます
add rule nat postrouting oif eth0 masquerade

# ポート 22 の受信 TCP トラフィックをポート 2222 にリダイレクトする
add rule nat prerouting tcp dport 22 redirect to :2222

フローオフロードステートメント

フローオフロードステートメントでは、レイヤー 3 ネットワークスタックバイパスを介して転送を高速化するフローを選択できます。
このフローをオフロードするフローテーブル名を指定する必要があります。

flow offload @flowtable

キューステートメント

このステートメントは nfnetlink_queue ハンドラーを使用してパケットをユーザースペースに渡します。
パケットは 16 ビットのキュー番号で識別されるキューに入れられます。
ユーザースペースは必要に応じてパケットを検査および変更できます。
その後ユーザースペースはパケットをカーネルから破棄または再注入する必要があります。
詳細については libnetfilter_queue のドキュメントを参照してください。

queue [num queue_number] [bypass]
queue [num queue_number_from - queue_number_to] [bypass,fanout]

キューステートメント値

説明 タイプ
queue_number キュー番号を設定します。デフォルトは 0 です。 符号なし整数(16 ビット)
queue_number_from fanout が使用されている場合、範囲内に初期キューを設定します。 符号なし整数(16 ビット)
queue_number_to fanout が使用されている場合、範囲内に終了キューを設定します。 符号なし整数(16 ビット)

キューステートメントフラグ

フラグ 説明
bypass ユーザースペースアプリケーションがバックオフできない場合はパケットを通過させます。このフラグを使用する前に、 libnetfilter_queue のドキュメントを読んで、パフォーマンスチューニングの推奨事項を確認してください。
fanout 複数のキュー間でパケットを分配します。

DUP ステートメント

dup ステートメントはパケットを複製し、そのコピーを別の宛先に送信するために使用されます。

dup to device
dup to address device device

Dup ステートメントの値

説明 タイプ
address パケットのコピーを新しいゲートウェイに送信する必要があることを指示します。 ipv4_addr, ipv6_addr。たとえば abcd::1234 。またはマッピングを使用できます。 ip saddr map {192.168.1.2:10.1.1.1}
device コピーをデバイス経由で送信する必要があることを指示します。 string
dupステートメントの使用例
# eth0 で IP アドレス 10.2.3.4 のマシンに送信
ip filter forward dup to 10.2.3.4 device "eth0"

# raw フレームを別のインターフェースにコピー
netdetv ingress dup to "eth0"
dup to "eth0"

# ゲートウェイへのマップ dst addr と組み合わせる
dup to ip daddr map { 192.168.7.1 : "eth0", 192.168.7.2 : "eth1" }

FWD ステートメント

fwd ステートメントは、 raw パケットを別のインターフェースにリダイレクトするために使用されます。
これは netdev ファミリーの ingress フックでのみ使用できます。
コピーが作成されないことを除いて dup ステートメントに似ています。

fwd to device

set ステートメント

set ステートメントは、パケットパスからセット内の要素を動的に追加または更新するために使用されます。
set setname は、指定されたテーブルにすでに存在している必要があります。
さらに nftables ルールセットから動的に更新されるセットは、最大セットサイズ(メモリ不足を防ぐため)とタイムアウト(セット内のエントリ数が無制限に増加しないようにするため)の両方を指定する必要があります。
set ステートメントは、たとえば動的ブラックリストを作成します。

{add | update} @setname {expression [timeout timeout] [comment string]}
単純なブラックリストの例
# ファミリー "ip" のテーブル "filter" にバインドされたセットを宣言します。パケットパスから要素を追加するため、タイムアウトとサイズは必須です。
nft add set ip filter blackhole "{type ipv4_addr; flags timeout; size 65536;}"

# 内部インターフェースをホワイトリストに登録します。
nft add rule ip filter input meta iifname "internal" accept

# ブラックリストに登録された IP アドレスからのパケットを破棄します。
nft add rule ip filter input ip saddr @blackhole counter drop

# 1 秒あたり 10 を超える TCP 接続要求が発生した場合は、送信元 IP アドレスをブラックリストに追加します。
# エントリは 1 分後にタイムアウトします。その後、制限状態が続く場合、エントリは再度追加される可能性があります。
nft add rule ip filter input tcp flags syn tcp dport ssh meter flood size 128000 {ip saddr timeout 10s limit rate over 10 / second} add @blackhole {ip saddr timeout 1m} drop

# レート制限メーターの状態を検査します。
nft list meter ip filter flood

# ブラックホールの内容を検査:
nft list set ip filter blackhole

# 手動で 2 つのアドレスをセットに追加します:
nft add element filter blackhole { 10.2.3.4, 10.23.1.42 }

追加のコマンド

これらは nft に含まれる追加コマンドの一部です。

モニター

monitor コマンドを使用すると、オブジェクトの作成と削除に関連して nf_tables サブシステムによって生成された Netlink イベントを待ち受けできます。
イベントが発生すると nft は監視対象イベントを XML, JSON またはネイティブ nft 形式のいずれかで標準出力に出力します。

具象オブジェクトに関連するイベントをフィルタリングするには、キーワード tables , chains , sets , rules , elements , ruleset のいずれかを使用します。

具体的なアクションに関連するイベントをフィルタリングするには、キーワード new または destroy を使用します。

^ C を押して、監視操作を終了します。

# すべてのイベントを待ち受けし、ネイティブ nft 形式でレポート出力します
% nft monitor

# 追加されたテーブルを待ち受けして XML 形式でレポート出力する
% nft monitor new tables xml

# 削除されたルールを待ち受けして JSON 形式でレポート出力します
% nft monitor destroy rules json

# 新しいチェーンと破棄されたチェーンの両方をネイティブの nft 形式で待ち受ける
% nft monitor chains

# テーブル、チェーン、ルール、セット、カウンター、クォータなどのルールセットイベントをネイティブ nft 形式で待ち受けします
% nft monitor ruleset

エラー報告

エラーが検出されると nft はエラーを含む行を示し、入力ストリーム内のエラーのある部分の位置を示し、キャレット( ^ )を使用してエラーのある部分をマークアップします。
エラーが 2 つの式またはステートメントの組み合わせに起因する場合、違反している制約を課している部分は、チルダ( ~ )を使用してマークされます。

カーネルによって返されるエラーの場合 nft は入力のどの部分がエラーの原因であるかを検出できず、コマンド全体がマークされます。

1つの正しくない式が原因のエラー
<cmdline>:1:19-22: Error: Interface does not exist
filter output oif eth0
                  ^^^^
2つの式の無効な組み合わせが原因のエラー
<cmdline>:1:28-36: Error: Right hand side of relational expression (==) must be constant
filter output tcp dport == tcp dport
                        ~~ ^^^^^^^^^
カーネルから返されたエラー
<cmdline>:0:0-23: Error: Could not process rule: Operation not permitted
filter output oif wlan0
^^^^^^^^^^^^^^^^^^^^^^^

終了ステータス

成功した場合 nft はステータス 0 で終了します。
不特定のエラーが発生した場合、ステータス 1 で終了し、ステータス 2 がメモリ割り当てエラーで、Netlink ソケットを開くことができない場合はステータス 3 です。

関連項目

  • iptables(8)
  • ip6tables(8)
  • arptables(8)
  • ebtables(8)
  • ip(8)
  • tc(8)

https://wiki.nftables.org に公式の wiki があります。