Nftables 防火墙规则十六进制值 0x1fff 更改为十进制 8191

Nftables 防火墙规则十六进制值 0x1fff 更改为十进制 8191

我开始迁移到 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

相关内容