我有
table ip nat {
chain Redirect_to_local {
limit rate 3/minute burst 10 packets log prefix "[nft.ip.dnat.8080]: "
redirect to :8080
}
chain PREROUTING {
type nat hook prerouting priority dstnat; policy accept;
iifname != { "lo", "ISP*" } fib daddr type != { local, multicast, broadcast } udp dport == 8000 counter jump Redirect_to_local
}
}
这是不正确的,因为transport protocol mapping is only valid after transport protocol match
. 但为什么?它确实匹配,但不是直接匹配。
如果我udp dport == 8000
在重定向之前添加,它将被认为是正确的,尽管规则重复(这很烦人)。
有办法克服这个问题吗?还是我误解了这一点?
ip protocol udp
(来自数据包的内容)或meta l4proto udp
(来自测量的数据包的属性。通常这在编写时自动暗示,例如udp dport 8000
)是无需再次指定端口即可判断它是 UDP 的方法。如果没有这条仅在单规则范围内的信息,NAT 语句将接受仅更改第 3 层(此处:IPv4),而保留第 4 层:它将接受更改地址,但不更改端口。通常redirect
意味着更改端口(但不是必需的。仅包含的单个规则行redirect
是有效的),然后通常必须完成协议的说明。所以你可以替换:
与以下任一:
或者:
注意:对于 IPv6,使用
meta l4proto udp
是唯一正确的选择,因为ip6 nexthdr udp
(相当于ip protocol udp
)在存在 IPv6 选项的情况下会失败,因为 IPv6 固定标头不提供最终的传输标头协议,而只提供下一个标头,这可能是一个选项标头,因此有所不同。