所以我有两个输入链,input
并且dyn
是动态生成的。
然而,由于 的原因,规则dyn
不起作用input
。我尝试过设置input
to的优先级1
,甚至设置todyn
的优先级。依然没有。0
-200
当我刷新input
规则时,然后就dyn
可以了。
我在这里做错了什么?
sudo nft list ruleset
table inet filter {
chain input {
type filter hook input priority filter + 1; policy accept;
iif "lo" accept
ct state established,related accept
tcp dport 299 ip saddr 3x.xx.xx.xx accept
icmpv6 type { destination-unreachable, packet-too-big, time-exceeded, parameter-problem, echo-request, echo-reply, nd-router-solicit, nd-router-advert, nd-neighbor-solicit, nd-neighbor-advert, 148, 149 } accept
ip6 saddr fe80::/10 icmpv6 type { mld-listener-query, mld-listener-report, mld-listener-done, mld2-listener-report, 151, 152, 153 } accept
counter packets 10 bytes 5255 drop
}
chain dyn {
type filter hook input priority filter; policy accept;
iif "lo" accept
ct state established,related accept
ip saddr 2x.xx.xx.xx udp dport 8999 log prefix "dyn" accept
ip6 saddr xxx:xxxx:xxxx:xxxx::9999 udp dport 8999 log prefix "dyn" accept
ip saddr 2x.xx.xx.xx tcp dport 7999 log prefix "dyn" accept
ip6 saddr xxx:xxxx:xxxx:xxxx::9999 tcp dport 7999 log prefix "dyn" accept
ip saddr 2x.xx.xx.xx icmp type echo-request log prefix "dyn" accept
ip6 saddr xxx:xxxx:xxxx:xxxx::9999 icmp type echo-request log prefix "dyn"
ip saddr 2x.xx.xx.xx tcp dport 6999 log prefix "dyn" accept
ip6 saddr xxx:xxxx:xxxx:xxxx::aaaa tcp dport 6999 log prefix "dyn" accept
}
}
每个链都挂钩到Netfilter:只要有数据包存在,Netfilter就会调用当前阶段(例如:输入)的所有链挂钩。
这意味着每个链都提供了丢弃数据包的机会。一旦数据包被丢弃,它就不再存在:剩余的链不会被调用进行遍历,因为没有任何东西可用于遍历:数据包已经消失了。
因此,无论两个链的优先级顺序如何,当每个链都有自己的规则来接受或丢弃数据包,独立于另一个链时,最终结果是每个结果之间的逻辑“与”,其中drop表示false,accept 表示true:
nft(8)
这在以下部分中有所提醒VERDICT STATEMENT
:如果想避免这种情况,那么评估就一定不能是独立的。例如,您可以使用防火墙标记在第一条链和第二条链之间传递消息(按照钩子和钩子的优先级顺序),将其解释为“已做出决定,接受此数据包”。这需要双方的合作,因此不能使用不知情的工具(例如:无论作为消息创建者还是作为消息消费者,如果不修改firewalld来解决此问题,都无法将其添加到firewalld处理的规则集中。
对于您的情况,您可以将规则集替换为以下内容:
这是一个没有任何简化的例子,我相信可以做得更好。
因此,每当动态链认为数据包应该保持被接受时,数据包就会被标记(在内部,仅在当前网络堆栈中)。更改后的输入链中的第一个测试是检查此标记:如果存在,则立即接受数据包,无需进一步处理:第一个链中所做的决定将在第二个链中得到遵守。