我开始迁移到 nftables 的过程,只是注意到当我添加此规则时
add rule netdev filter INGRESS ip frag-off & 0x1fff != 0 counter drop
在 nftables.conf 中应该看起来像这样
ip frag-off & 0x1fff != 0 counter packets 0 bytes 0 drop
看起来像这样
ip frag-off & 8191 != 0 counter packets 0 bytes 0 drop
我知道它是十六进制值 0x1fff 的十进制等值,只是想知道为什么会发生这种情况,并且它会以任何方式影响规则本身吗?
答案1
手册页定义:
整数类型
整数类型用于数值。它可以指定为十进制、十六进制或八进制数。整数类型没有固定的大小,其大小由其使用的表达式决定。
您可以以十进制、十六进制或八进制输入值,但值仍然相同。
软件选择将整数值显示为十进制,没有其他含义。
答案2
谢谢,这似乎是对的,我也发现了这一点,虽然它没有特别回答这个问题,但也给出了一些线索
> nft: Fix add_bitwise_u16() on Big Endian Type used for 'mask' and
> 'xor' parameters was wrong, 'int' is four bytes on 32 or 64 bit
> architectures. After casting a uint16_t to int, on Big Endian the
> first two bytes of data are (the leading) zero which libnftnl then
> copies instead of the actual value.
This problem was noticed when using '--fragment' option:
| # iptables-nft -A FORWARD --fragment -j ACCEPT
| # nft list ruleset | grep frag-off
| ip frag-off & 0 != 0 counter packets 0 bytes 0 accept
With this fix in place, the resulting nft rule is correct:
| ip frag-off & 8191 != 0 counter packets 0 bytes 0 accept <<<<<<<<<<<<<<<<
> Fixes: 2f1fbab671576 ("iptables: nft: add -f support") Signed-off-by:
> Phil Sutter <[email protected]> Acked-by: Pablo Neira Ayuso
> <[email protected]>
来源补丁应用于 netfilter,解决 iptables 转换错误的问题,但就像我说的,它为我关于 0x1fff = 8191 的问题提供了线索
此外,如果有人在添加规则时遇到这样的错误
nft 添加规则 netdev 过滤器 INGRESS ip frag-off & 0x1fff != 0 计数器丢弃
-su: 8191: command not found
root@serv:/etc# Error: syntax error, unexpected newline
add rule netdev filter INGRESS ip frag-off
^
[1]+ Exit 1 nft add rule netdev filter INGRESS ip frag-off
这是由于 shell 解释器造成的,解决方案是使用 nft -i 或使用转义特殊字符“&”或使用“and”
nft add rule netdev filter INGRESS ip frag-off and 0x1fff != 0 counter drop
nft add rule netdev filter INGRESS ip frag-off \& 0x1fff != 0 counter drop