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
它是一个整数。
如果您还可以链接到解释这一点的文档,那将会很有帮助,因为我找不到它。
答案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; }