例如:
#!/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: "
该规则没有明确的规定accept
或drop
裁决,那么哪一个是默认值?
答案1
该规则没有明确的规定
accept
或drop
裁决,那么哪一个是默认值?
无。规则不需要有最终裁决 - 如果您不指定,则规则没有最终裁决。数据包处理将继续执行下一个规则。
如果数据包到达您所执行的链的末尾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: "
}
}