コレクションの使用nftables本当に素晴らしい。私は現在私のルールセットで次の文をたくさん使いますnftables.conf
。
iifname {clients0, dockernet} oifname wan0 accept \
comment "Allow clients and Docker containers to reach the internet"
上記のルールの{clients0, dockernet}
一つ匿名(インライン)インターフェイスセット。ルールを繰り返し繰り返すのではなく、ファイルの上部に次のようなインタフェースセットを定義したいと思います。名前付きセットnftablesから。これマンページ(Debianバスター)さまざまな種類のコレクションに対してこれを行う方法を示します。ipv4_アドレス、ipv6_アドレス、エーテルの住所、inet_proto、inet_serviceそして表示。しかし、名前や文字列などの単純な基本型で、インターフェイスでは機能しないようです。
次の方法がありますが、与えられたエラーでは機能しません。
タイプ省略:
table inet filter { set myset { elements = { clients0, dockernet, } } [...] }
結果:
Error: set definition does not specify key
。使用法
string
のタイプ:table inet filter { type string; set myset { elements = { clients0, dockernet, } } [...] }
結果:
Error: unqualified key type string specified in set definition
。
上部に表示される匿名性セットの名前を指定する方法は本当にありませんか?
答え1
検索してバージョン0.9.0のソースコード:
static const struct datatype *datatypes[TYPE_MAX + 1] = {
[...]
[TYPE_IFINDEX] = &ifindex_type,
[...]
[TYPE_IFNAME] = &ifname_type, };
それから彼らがどこにいるのかを調べてくださいはい 限られた:
const struct datatype ifindex_type = { .type = TYPE_IFINDEX, .name = "iface_index", .desc = "network interface index",
[...]
const struct datatype ifname_type = { .type = TYPE_IFNAME, .name = "ifname", .desc = "network interface name",
(この回答を書くとき)、必須タイプはiface_index
(例:)iif lo
とifname
(例:)です。iifname "lo"
nft
マニュアルページには文書化されていません。。
nft add set inet filter if-index-set '{ type iface_index; }'
nft add set inet filter if-name-set '{ type ifname; }'
nft add element inet filter if-index-set '{ lo }'
nft add element inet filter if-name-set '{ lo }'
nft add chain inet filter input '{ type filter hook input priority 0; }'
nft add rule inet filter input iif @if-index-set counter
nft add rule inet filter input iifname @if-name-set counter
気づく名前があれば2022年5月31日に、コレクションにワイルドカードサポートが追加されました。nftables 1.0.3。名前付きセットを使用する必要があり、flags intervals
最後のワイルドカードは*
(+
iptables)。
答え2
nft
要素データ型は、以下を使用して簡単に見つけることができます。
$ nft describe iifname
meta expression, datatype ifname (network interface name) (basetype string), 16 characters
% nft describe iif
meta expression, datatype iface_index (network interface index) (basetype integer), 32 bits
それを見た方ifname
もiface_index
可能なタイプだから宣言できます:
set myset {
type ifname
elements = {
"clients0",
"dockernet"
}
}
上記の例で型がわからない場合は、代わりにtypeof iifname
書くこともできます(v0.9.4以降が必要です)。type ifname
nft