对于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 进行测试时,您的规则集按原样工作。
该补丁增加了对使用链中设备的变量 和可流动的定义,例如。
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 }
)会使用先前的现有语法显示回来。