man nftables 日本語訳

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

# 名前

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

# 概要

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

# 説明

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

# オプション

オプションの完全な要約を見るには、 ``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 ステートメントでは一致しません。

# 変数記号
## 変数式の定義

```bash
$variable
```

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

```bash:変数の使用例
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 プロトコルハンドラの前に呼び出され、早期のフィルタリングとポリシングに使用できます。 |

# ルールセット

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

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

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

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

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

# テーブル

```bash
{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|テーブルは評価されません(ベースチェーンは登録されていません)|

```bash:テーブルを追加、変更、削除する例
# 対話モードで 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: 指定したテーブルのすべてのチェーンとルールをフラッシュします。

# チェーン

```bash
{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`` です。

# ルール

```bash
[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: 指定したルールを削除します。

```bash: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
```

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

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

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

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

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

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

```bash
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 セットのみ)| |

# マップ

```bash
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。 ``couter`` と ``quota`` はキー名として使用できません。|
|flags|マップフラグ|文字列: constant,  interval|
|elements|マップに含まれる要素|マップデータ型|
|size|マップ内の要素の最大数|符号なし整数(64ビット)|
|policy|マップポリシー|文字列: performance [default], memory|

# フローテーブル

```bash
{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: すべてのフローテーブルを一覧表示します。

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

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

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

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

# CT

```bash
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 フック優先度で実行する必要があります。

```bash
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"
  }
}
```

# カウンター

```bash
counter [packets bytes]
```

## カウンター仕様

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

# クォータ

```bash
quota [over | until] [used]
```

## クォータ仕様

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

# 式

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

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

# DESCRIBE コマンド

```bash
describe expression
```

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

```bash
$ 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 個以上の英数字または文字と記号( ``/`` , ``-`` , ``_`` , ``.`` )が続きます。
さらに、二重引用符( " )で囲まれたものはすべて文字列として認識されます。

文字列型の指定

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

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

## リンク層アドレス型

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

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

```bash:リンク層アドレス指定
# イーサネット宛先 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 進数のいずれか、またはホスト名として指定されます。
ホスト名は、標準のシステムリゾルバーを使用して解決されます。

```bash: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 進数のハーフワードとして指定されます。
アドレスはポート番号と区別するために角括弧( ``[]`` )で囲まれる場合があります。

```bash: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 オプションヘッダーの存在を確認する。 |

```bash
# ルートが存在する場合に一致
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    |

```bash: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   |

```bash: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`` から読み込まれます。

# 一次式

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

# メタ式

```bash
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 |パケットタイプ: ユニキャスト(ローカルホスト宛て)、ブロードキャスト(全員宛て)、マルチキャスト(グループ宛て)。 |

```bash:メタ式の使用例
# 修飾されたメタ式
filter output meta oif eth0

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

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

# FIB(Forwarding Information Base) 式

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

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

## fib 式固有の型

|キーワード|説明|タイプ|
|----------|----------------------|---------------|
| oif |出力インターフェイスインデックス|integer(32ビット)|
| oifname |出力インターフェース名|string|
|type|アドレスの種類| fib_addrtype |

```bash: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 }
```

# ルーティング式

```bash
rt {classid | nexthop}
```

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

## ルーティング式の型

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

### ルーティング式固有の型

|タイプ|説明|
|-------|--------------------------|
|realm|ルーティングレルム(32 ビット番号)。数値で、または ``/etc/iproute2/rt_realms`` で定義されたシンボル名として指定できます。 |

```bash:ルーティング式の使用例
# 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
```

# ペイロード式

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

# イーサネットヘッダー式

```bash
ether [Ethernet header field]
```

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

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

# VLAN ヘッダー式

```bash
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ヘッダー式

```bash
arp [ARP header field]
```

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

# IPV4 ヘッダー式

```bash
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 ヘッダー式

```bash
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 ヘッダー式

```bash
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 |

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

```bash
ip6 nexthdr ipv6-frag counter
```

# ICMPV6 ヘッダー式

```bash
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 ヘッダー式

```bash
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 ヘッダー式

```bash
udp [UDP header field]
```

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

# 簡易 UDP ヘッダー式

```bash
udplite [UDP-Lite header field]
```

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

# SCTP ヘッダー式

```bash
sctp [SCTP header field]
```

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

# DCCP ヘッダー式

```bash
dccp [DCCP header field]
```

|キーワード|説明|タイプ|
|----------|------------------|------------|
|sport|送信元ポート| inet_service |
| dport |宛先ポート| inet_service |

# 認証ヘッダー式

```bash
ah [AH header field]
```

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

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

```bash
esp [ESP header field]
```

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

# IPCOMP ヘッダー式

```bash
comp [IPComp header field]
```

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

# RAW ペイロード式

```bash
@ [base,offset,length]
```

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

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

|ベース|説明|
|------|---------------------------|
| ll |イーサネットヘッダーなどのリンク層|
| nh |ネットワークヘッダー、たとえば IPv4 または IPv6 |
| th |トランスポートヘッダー、たとえば TCP |

```bash:
# 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 オプションのマッチング(検索)をサポートしています。

```bash
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
```

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

```bash
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 |

```bash
# 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 が指定された方向に関連付けられている場合にのみゾーンが一致します。

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

# 判定ステートメント

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

```bash
{accept | drop | queue | continue | return}
{jump | goto} chain
```

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

```bash
# 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 フローラベルを設定するために使用できます。

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

```bash
# 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 最大セグメントサイズを変更するために使用できます。

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

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

# ログステートメント

```bash
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|上記のすべてのログフラグを有効にします。 |

```bash:ログステートメントの使用例
# パケットと 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
```

# 拒否ステートメント

```bash
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`` ステートメントは、バイト数と共にパケットのヒット数を設定します。

```bash
counter [ packets number bytes number ]
```

# CONNTRACK ステートメント

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

```bash
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 ビット)|

```bash
# パケット 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``  です。

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

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

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

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

# 制限ステートメント

```bash
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 ステートメント

```bash
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 ステートメントの使用

```bash
# その他すべての例に適したテーブル / チェーン設定を作成する
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 ネットワークスタックバイパスを介して転送を高速化するフローを選択できます。
このフローをオフロードするフローテーブル名を指定する必要があります。

```bash
flow offload @flowtable
```

# キューステートメント

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

```bash
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 ステートメントはパケットを複製し、そのコピーを別の宛先に送信するために使用されます。

```bash
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|

```bash: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 ステートメントに似ています。

```bash
fwd to device
```

# set ステートメント

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

```bash
{add | update} @setname {expression [timeout timeout] [comment string]}
```

```bash:単純なブラックリストの例
# ファミリー "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`` を押して、監視操作を終了します。

```bash
# すべてのイベントを待ち受けし、ネイティブ 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 は入力のどの部分がエラーの原因であるかを検出できず、コマンド全体がマークされます。

```bash:1つの正しくない式が原因のエラー
<cmdline>:1:19-22: Error: Interface does not exist
filter output oif eth0
                  ^^^^
```

```bash:2つの式の無効な組み合わせが原因のエラー
<cmdline>:1:28-36: Error: Right hand side of relational expression (==) must be constant
filter output tcp dport == tcp dport
                        ~~ ^^^^^^^^^
```

```bash:カーネルから返されたエラー
<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 があります。