在声明链以使用 (netdev) 入口钩子时如何使用设备名称变量?

在声明链以使用 (netdev) 入口钩子时如何使用设备名称变量?

对于netdev过滤器表的ingress挂钩,我想将设备名称存储在变量中,但我不知何故无法找出正确的语法。

其工作原理如下:

table netdev filter {
    chain ingress {
        type filter hook ingress device ens33 priority -500;

        # ...
    }
}

...但我想使用一个变量来代替ens33

type filter hook ingress device ens33 priority -500;

当我使用以下命令时,出现错误:

define extif = ens33

table netdev filter {
    chain ingress {
        type filter hook ingress device $extif priority -500;

        # ...
    }
}

错误如下:

Error: syntax error, unexpected '$', expecting string or quoted string or string with a trailing asterisk

现在我也尝试希望它与inens*类似,但随后错误更改为我在提供无效设备名称时也遇到的错误:ens+iptables

Error: Could not process rule: No such file or directory
        chain ingress {
              ^^^^^^^

同样的引用对我来说也不起作用。文档也没有提供可以使其发挥作用的线索。

如何将外部接口的名称(或多个名称)放入变量中,以便将它们用作节device上的参数type filter hook ...


内核是5.8,系统是Ubuntu 20.04。nftables报告为v0.9.3 (Topsy).

答案1

唉,这个功能被添加了这次提交仅从那时起可用nftables 0.9.7。当使用 nftables 0.9.8 进行测试时,您的规则集按原样工作。

src:允许在flowtable和chain设备中使用变量

该补丁增加了对使用链中设备的变量 和可流动的定义,例如。

define if_main = lo

table netdev filter1 {
   chain Main_Ingress1 {
       type filter hook ingress device $if_main priority -500; policy accept;
   }
}

签字人:巴勃罗·内拉·阿尤索[电子邮件受保护]


netdev 家族链注册到一个或多种的从内核 5.5 和 nftables 0.9.3 开始) 接口,它们必须全部存在于链定义之前。不能使用通配符。

多设备链语法略有不同:

table netdev filter {
    chain ingress {
        type filter hook ingress devices = { ens33, ens34 } priority -500;

        # ...
    }
}

或者与nftables>= 0.9.7:

define extifs = { ens33, ens34 }

table netdev filter {
    chain ingress {
        type filter hook ingress devices = $extifs priority -500;

        # ...
    }
}

只有一个接口(例如:{ ens33 })会使用先前的现有语法显示回来。

相关内容