我创建了一个网络过滤表。我在脚本中有它。我不能让这个脚本总是加载。如果我刷新/删除表,那么如果表不存在,它就不起作用。如果我不刷新/删除,那么它将合并旧规则和新规则。
如果表存在,我如何刷新/删除?
#!/usr/sbin/nft -f
flush table my_table
table ip my_table {
chain output {
type filter hook output priority 0; policy accept;
ip daddr 8.8.8.8 counter
ip daddr 1.1.1.1 counter
skuid "other" jump restrict_chain
skuid "d" jump d_chain
}
chain accept_chain {
nftrace set 1 counter accept
}
chain reject_chain {
nftrace set 1 counter reject
}
chain restrict_chain {
#type filter priority 0; policy drop;
counter
ip daddr 1.1.1.1 counter
oifname "lo" jump accept_chain
oifname != "lo" jump reject_chain
}
chain d_chain {
counter
}
}
首先声明一个空表。如果表已经存在,它不会抛出错误也不会改变它的内容:什么都不会发生。如果它不存在,则只是创建了空表。现在它在所有情况下都存在,可以将其删除。所有这些都可以在同一个规则集中完成。
因此,声明没有链或规则的表,然后将其删除(手册页告诉刷新它将刷新链和规则,但这不会删除链本身,它们只会被清空,这将留下旧的重命名链或如果它们的属性被更改,则设置到位或与它们发生冲突。nftables wiki 有更多关于删除和刷新行为的信息。)。现在您可以真正创建它,仍然在相同且唯一的规则集文件中。同一个规则集现在可以幂等地加载多次,即使是第一次也不抛出错误。
您可以选择使用
include
语句将所有此类准备行放在单独的文件中,以防万一有很多并且您不希望它们污染规则集。您可以在链级别执行相同的操作,即无需更改同一个表中的其他链,也不假设或要求该表及其链之前存在。这是一个
reject_chain
停用nftrace的示例,它不会删除其他表或my_table
' 链。这个例子并没有真正的用处,只是举个例子。兼容性说明:内核 < 3.18 需要刷新 + 删除才能正常工作,如wiki 中所述。这(以及链的等价物)甚至可以在任何内核版本上工作: