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 set
为response_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
它是一个整数。
如果您还可以链接到解释这一点的文档,那将会很有帮助,因为我找不到它。
命名集声明必须与要比较的类型相匹配。ICMP 类型不是 inet 服务:
这意味着一个端口。例如兼容:
因此,当添加规则nftables时会抱怨:
至于找出 ICMP 类型,从规则 (payload expression/typeof) 中
icmp type
:导致(数据类型/类型)
icmp_type
:这:
必须替换为:
或者,而不是
type
使用typeof
(它通常与规则集中使用的内容相匹配,因此更容易弄清楚,并且也可以像上面一样直接使用来nft describe
找出等效项type
):