我有以下 nftables 规则:
log prefix "[nftables] output denied1: " ip daddr 34.117.59.81 reject
在系统日志中我可以看到以下消息:
[nftables] output denied1: IN= OUT=br0 SRC=10.10.10.1 DST=10.10.10.4 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=540 PROTO=ICMP TYPE=0 CODE=0 ID=2 SEQ=60848
现在我想知道这是怎么可能的?系统日志消息中有DST=10.10.10.4
,但该规则不应用于该目标地址。
如果有人能解释这种行为,那就太酷了。
答案1
顺序很重要。在单个规则中,每个表达式/(非终端)语句按顺序进行评估:
- 如果为真,则继续评估规则中的下一个表达式/语句
- 如果为假,则评估结束
大多数非终结语句都是正确的(即:规则评估继续)。无论如何,语句的情况就是这样log
:它总是允许规则中的评估继续。
log
作为规则第一部分的语句将发挥其作用:生成日志。没有过滤器在其之前(或不在从具有此类过滤器的上一个规则调用的常规(又称用户)链中)一切将被记录。然后评估将继续到实际过滤器:ip daddr 34.117.59.81
。如果此评估结果为真,reject
则将完成,否则此规则中不会发生任何其他事情(如果有下一条规则则进行评估)。
解决方法是始终将log
语句后它应该记录的条件在终端语句之前(不允许进一步的表达式/语句):
ip daddr 34.117.59.81 log prefix "[nftables] output denied1: " reject