Nftables
如何在 nftables 中按名稱創建一組命名介面?
在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_addr、ipv6_addr、ether_addr、inet_proto、inet_service和mark。但是,它似乎不適用於按名稱或簡單的原始類型(如字元串)的介面。我有下面的方法,但這不適用於給出的錯誤:
- 省略類型:
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
(egiifname "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
集合。