Nftables

如何在 nftables 中按名稱創建一組命名介面?

  • January 12, 2022

在nftables中使用集合真的很酷。我目前在我的nftables.conf規則集中使用了很多這樣的語句:

iifname {clients0, dockernet} oifname wan0 accept \
   comment "Allow clients and Docker containers to reach the internet"

在上面的規則{clients0, dockernet}中是一組匿名(內聯)介面。我不想一遍又一遍地重複規則,我想在文件頂部定義一組介面,在 nftables 中稱為命名集。手冊頁 (Debian Buster)顯示瞭如何為幾種類型的集合執行此操作:ipv4_addripv6_addrether_addrinet_protoinet_servicemark。但是,它似乎不適用於按名稱或簡單的原始類型(如字元串)的介面。

我有下面的方法,但這不適用於給出的錯誤:

  1. 省略類型:
table inet filter {
 set myset {
   elements = {
     clients0,
     dockernet,           
   }
 }
 [...]
}

結果:Error: set definition does not specify key。 2. 使用string類型:

table inet filter {
 type string;
 set myset {
   elements = {
     clients0,
     dockernet,           
   }
 }
 [...]
}

結果:Error: unqualified key type string specified in set definition

真的沒有辦法命名我在頂部顯示的匿名集嗎?

通過在原始碼中搜尋 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(eg: iif lo) 和ifname(eg iifname "lo"),即使(在撰寫此答案時)它nft’s man page中沒有記錄。

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

請注意,萬用字元似乎不適用於ifname集合。

引用自:https://unix.stackexchange.com/questions/517205