man nftables 日本語訳
man nftables
で表示されるマニュアルの日本語訳。
名前
nft - パケットのフィルタリングと分類を目的とする nftables フレームワークの管理ツール
概要
nft [ -nNscae ] [ -I directory ] [ -f filename | -i | cmd ...]
nft -h
nft -v
説明
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 ステートメントでは一致しません。
変数記号
変数式の定義
$variable
$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
{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
{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
{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
[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 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
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 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 |
フローテーブル
{add | create} flowtable [family] table flowtable { hook hook priority priority ; devices = { device[,...] } ; }
{delete | list} flowtable [family] table flowtable
{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
{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 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]
カウンター仕様
counter [packets bytes]
キーワード | 説明 | タイプ |
---|---|---|
packets | パケットの初期数 | 符号なし整数(64ビット) |
bytes | バイトの初期数 | 符号なし整数(64ビット) |
クォータ
quota [over | until] [used]
クォータ仕様
quota [over | until] [used]
キーワード | 説明 | タイプ |
---|---|---|
quota | クォータ制限。クォータ名として使用されます。 | 符号なし整数(64ビット)と文字列(bytes, kbytes, mbytes)の 2 つの引数を指定する。 over と until はこれらの引数の前にあります |
used | 使用済みクォータの初期値 | 符号なし整数(64ビット)と文字列(bytes, kbytes, mbytes)の 2 つの引数を指定する。 |
式
式は、ネットワークアドレス、ポート番号などの定数、またはルールセットの評価中にパケットから収集されたデータのいずれかの値を表します。
バイナリ式、論理式、リレーショナル式、およびその他のタイプの式を使用して式を組み合わせて、複雑な式またはリレーショナル(一致)式を形成できます。
これらは NAT、パケットマーキングなど、特定のタイプの操作の引数としても使用されます。
各式にはデータ型があり、これにより、シンボリック値のサイズ、解析、表現、および他の式との型の互換性が決まります。
DESCRIBE コマンド
describe expression
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 進数のいずれか、またはホスト名として指定されます。
ホスト名は、標準のシステムリゾルバーを使用して解決されます。
# ドット 10 進表記
filter output ip daddr 127.0.0.1
# ホスト名
filter output ip daddr localhost
IPV6 アドレス型
名前 | キーワード | サイズ | ベースタイプ |
---|---|---|---|
IPv6 address | ipv6_addr | 128ビット | integer |
IPv6 アドレスには IPv6 アドレスタイプが使用されます。
アドレスはホスト名として、またはコロンで区切られた 16 進数のハーフワードとして指定されます。
アドレスはポート番号と区別するために角括弧( []
)で囲まれる場合があります。
# 省略されたループバックアドレス
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 |
# 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 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}
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 {saddr | daddr | {mark | iif | oif}} {oif | oifname | type}
fib 式は、 fib(転送情報ベース)に照会して、特定のアドレスが使用する出力インターフェイスインデックスなどの情報を取得します。
入力は、 fib 検索関数への入力として使用される要素のタプルです。
fib 式固有の型
キーワード | 説明 | タイプ |
---|---|---|
oif | 出力インターフェイスインデックス | integer(32ビット) |
oifname | 出力インターフェース名 | string |
type | アドレスの種類 | fib_addrtype |
# リバースパスなしでパケットをドロップ
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}
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]
イーサネットヘッダー式の型
ether [Ethernet header field]
キーワード | 説明 | タイプ |
---|---|---|
daddr | 宛先 MAC アドレス | ether_addr |
saddr | 送信元 MAC アドレス | ether_addr |
type | EtherType | ether_type |
VLAN ヘッダー式
vlan [VLAN header field]
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]
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]
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]
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]
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]
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]
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]
udp [UDP header field]
キーワード | 説明 | タイプ |
---|---|---|
sport | 送信元ポート | inet_service |
dport | 宛先ポート | inet_service |
length | 総パケット長 | integer(16 ビット) |
checksum | チェックサム | integer(16 ビット) |
簡易 UDP ヘッダー式
udplite [UDP-Lite header field]
udplite [UDP-Lite header field]
キーワード | 説明 | タイプ |
---|---|---|
sport | 送信元ポート | inet_service |
dport | 宛先ポート | inet_service |
checksum | チェックサム | integer(16 ビット) |
SCTP ヘッダー式
sctp [SCTP header field]
sctp [SCTP header field]
キーワード | 説明 | タイプ |
---|---|---|
sport | 送信元ポート | inet_service |
dport | 宛先ポート | inet_service |
vtag | 検証タグ | integer(32 ビット) |
checksum | チェックサム | integer(32 ビット) |
DCCP ヘッダー式
dccp [DCCP header field]
dccp [DCCP header field]
キーワード | 説明 | タイプ |
---|---|---|
sport | 送信元ポート | inet_service |
dport | 宛先ポート | inet_service |
認証ヘッダー式
ah [AH header field]
ah [AH header field]
キーワード | 説明 | タイプ |
---|---|---|
nexthdr | 次のヘッダープロトコル | inet_proto |
hdrlength | AH ヘッダーの長さ | integer(8 ビット) |
reserved | 予約エリア | integer(16 ビット) |
spi | セキュリティパラメータインデックス | integer(32 ビット) |
sequence | シーケンス番号 | integer(32 ビット) |
暗号化されたセキュリティペイロードのヘッダー式
esp [ESP header field]
esp [ESP header field]
キーワード | 説明 | タイプ |
---|---|---|
spi | セキュリティパラメータインデックス | integer(32 ビット) |
sequence | シーケンス番号 | integer(32 ビット) |
IPCOMP ヘッダー式
comp [IPComp header field]
comp [IPComp header field]
キーワード | 説明 | タイプ |
---|---|---|
nexthdr | 次のヘッダープロトコル | inet_proto |
flags | フラグ | bitmask |
cpi | 圧縮パラメータインデックス | integer(16 ビット) |
RAW ペイロード式
@ [base,offset,length]
@ [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 [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 [ 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 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]
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 |
# 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 は入力のどの部分がエラーの原因であるかを検出できず、コマンド全体がマークされます。
<cmdline>:1:19-22: Error: Interface does not exist
filter output oif eth0
^^^^
<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 があります。
Author And Source
この問題について(man nftables 日本語訳), 我々は、より多くの情報をここで見つけました https://qiita.com/JhonnyBravo/items/a79d39dfd8543c1e95d8著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .