nftables 规则的默认判决是什么?

nftables 规则的默认判决是什么?

例如:

#!/usr/sbin/nft -f

add table ip filter_4

add chain ip filter_4 input {
    type filter hook input priority filter; policy drop;
}

add chain ip filter_4 new_in_4 {
    comment "New input IPv4 traffic"
}

# Note it's goto not jump! (thus no way out of new_in_4 chain)
add rule ip filter_4 input ct state new goto new_in_4

# Is this block drop or accept rule?
add rule ip filter_4 new_in_4 log prefix "some comment: "

该规则没有明确的规定acceptdrop裁决,那么哪一个是默认值?

答案1

该规则没有明确的规定acceptdrop裁决,那么哪一个是默认值?

无。规则不需要有最终裁决 - 如果您不指定,则规则没有最终裁决。数据包处理将继续执行下一个规则。

如果数据包到达您所执行的链的末尾goto,那么结果就像它到达了父链的末尾一样 - 在这种情况下,“输入”链具有policy drop,因此将应用。

(换句话说,一条退出新链的方法,就像一条退出“输入”链的方法一样——链策略可以被认为是在调用堆栈的开头,也是您将“返回”的最终位置。使用“jump”时堆栈将是policy > chain input > chain new_in_4,使用“goto”时堆栈将是policy > chain new_in_4。)

上述内容并非 nftables 所独有;它与 iptables 大致相同(它也具有“JUMP”和“GOTO”、链式策略和没有最终裁决的规则)。


nftables 让您逐条查看数据包处理 - 将规则应用nftrace set 1到您的数据包(最好尽早)并运行nft monitor trace

编写规则集的更易读的方法是:

#!/usr/bin/nft -f

table ip filter4 {
    chain input {
        type filter hook input priority filter; policy drop;
        ct state new goto new_in_4
    }

    chain new_in_4 {
        comment "New input IPv4 traffic"
        log prefix "some comment: "
    }
}

通常的做法是相反的chain new——输入链会有一个单一的规则来全面接受已确立的数据包,那么其他一切都将是“新的”,你根本不需要第二条链。

table ip filter4 {
    chain input {
        type filter hook input priority filter; policy drop;
        ct state established,related accept

        comment "New input IPv4 traffic"
        log prefix "some comment: "
    }
}

相关内容