在 nftables 中声明并使用一组命名的 ICMP 类型

在 nftables 中声明并使用一组命名的 ICMP 类型

unamed set以下是我当前如何使用包含 ICMP 类型的工作示例:

#!/usr/sbin/nft -f

add table filter_4

add chain filter_4 icmp_out_4 {
    comment "Output ICMPv4 traffic"
}

define response_icmp_4 = {
    0, # Echo Reply
    3, # Destination Unreachable
    10, # Router Solicitation
    11, # Time Exceeded
    12, # Parameter Problem
    14 # Timestamp Reply
}

# Block ICMP response from localhost
add rule filter_4 icmp_out_4 icmp type $response_icmp_4 drop

我想要做的是将其转换unamed setresponse_icmp_4命名集。
这是我不成功的尝试:

# Declare named set
add set filter_4 response_icmp_4 { type inet_service }

# Add ICMP type elements
add element filter_4 response_icmp_4 {
    0, # Echo Reply
    3, # Destination Unreachable
    10, # Router Solicitation
    11, # Time Exceeded
    12, # Parameter Problem
    14 # Timestamp Reply
}

创建集合可以工作,但在规则处理过程中被拒绝:

# Block ICMP response from localhost
add rule filter_4 icmp_out_4 icmp type @response_icmp_4 drop

具有以下错误输出:

错误:数据类型不匹配,预期的 ICMP 类型,表达式的类型为 Internet 网络服务

该错误是不言自明的,但问题是type我应该指定什么?因为type inet_service不起作用。

根据文档有效的type表达式是ipv4_addr, ipv6_addr, ether_addr, inet_proto, inet_service, mark

也可以指定typeof自动派生数据类型,但这效果不佳,例如:

add set filter_4 response_icmp_4 { typeof vlan id }

哪些错误与类似错误:

错误:数据类型不匹配,预期的 ICMP 类型,表达式的类型为整数

这是一个奇怪的错误,因为ICMP type它是一个整数。

如果您还可以链接到解释这一点的文档,那将会很有帮助,因为我找不到它。

答案1

命名集声明必须与要比较的类型相匹配。 ICMP 类型不是 inet 服务:

# nft describe inet_service
datatype inet_service (internet network service) (basetype integer), 16 bits

这意味着一个端口。例如兼容:

# nft describe udp dport
payload expression, datatype inet_service (internet network service) (basetype integer), 16 bits

所以当添加规则时nftables抱怨:

Error: datatype mismatch, expected ICMP type, expression has type internet network service

至于找出 ICMP 类型,从规则 (payload expression/typeof) 中icmp type

# nft describe icmp type
payload expression, datatype icmp_type (ICMP type) (basetype integer), 8 bits

pre-defined symbolic constants (in decimal):
    echo-reply                                         0
    destination-unreachable                            3
[...]

导致(数据类型/类型)icmp_type

# nft describe icmp_type
datatype icmp_type (ICMP type) (basetype integer), 8 bits

pre-defined symbolic constants (in decimal):
    echo-reply                                         0
    destination-unreachable                            3
[...]

这:

add set filter_4 response_icmp_4 { type inet_service }

必须替换为:

add set filter_4 response_icmp_4 { type icmp_type; }

或者,而不是type使用typeof(它通常与规则集中使用的内容匹配,因此更容易弄清楚,并且也可以像上面一样直接使用来nft describe找出等效项type):

add set filter_4 response_icmp_4 { typeof icmp type; }

相关内容