我有一个实用程序需要一个空闲的 TCP 端口。由于我不想更改现有的配置文件,因此我需要能够向 nftables 动态添加规则。
有一个名为filter的inet表,其中包含输入规则:
table inet filter {
chain input {
type filter hook input priority 0; policy drop;
# existing rules
}
}
添加规则很容易,例如:
nft add rule inet filter input tcp dport { 4848 } ct state new,established counter accept
这里的问题是如何以幂等的方式做到这一点?
- 如果我运行相同的命令两次,两次完全相同的规则已生成。
nft delete rule inet filter input handle ##
需要一个会变化的句柄号,并且使用它nft -n -a list ruleset | grep ...
来解析句柄号感觉不对- 添加新链
nft -f
并每次刷新它也不起作用,因为如上所述这里:
这是不是一条链可以提供比具有拒绝(或丢弃)规则的链更广泛的访问权限(以接受规则的形式)。
答案1
使用集合来管理会更容易:
table inet filter {
set myport_tcp {
type inet_service
elements = { 4848 }
}
chain input {
type filter hook input priority 0; policy drop;
# existing rules
tcp dport @myport_tcp ct state new,established counter accept
# more existing rules
}
}
您可以通过以下方式清空集合:
nft flush set inet filter myport_tcp
您可以通过以下方式将新端口添加到集合中:
nft add element inet filter myport_tcp elements = { 4949 }
或者通过以下方式将多个端口添加到集合中:
nft add element inet filter myport_tcp elements = { 14949, 9494 }