nftables 的 timeout 特性通过带超时的命名集合实现“自我消亡”白名单:先创建 timeout 集合(如 nft add set inet filter temp_whitelist { type ipv4_addr; timeout 15m; }),再在规则中引用(如 nft add rule inet filter input ip saddr @temp_whitelist accept),IP 元素独立倒计时到期自动移除,规则长期有效;支持单/批量添加、实时查看与手动清理,并建议叠加端口限制、连接状态过滤及操作审计提升安全性。

用 nftables 的 timeout 特性配置“自我消亡”的白名单,关键在于把临时允许的 IP 或端口放进带超时的命名集合(named set),而不是写死在规则里。集合里的每个元素独立倒计时,到期自动消失,规则本身保持长期有效——这样就实现了无需人工干预的自动清理。
创建支持超时的命名集合
timeout 只对显式声明的命名集合生效,不能直接加在普通规则上。必须先建一个带 timeout 属性的 set:
- 命令示例:nft add set inet filter temp_whitelist { type ipv4_addr; timeout 15m; }
- 推荐使用 inet 协议族,兼容 IPv4/IPv6;若只用 IPv4,可用 ip,但扩展性差
- timeout 单位支持 s(秒)、m(分)、h(小时)、d(天),如 30s、2h
在规则中引用该集合实现动态放行
建好集合后,在 INPUT 或 FORWARD 链中加一条规则,匹配集合内地址即放行:
- 命令示例:nft add rule inet filter input ip saddr @temp_whitelist accept
- 这条规则永不消失,但其中的 @temp_whitelist 每个 IP 元素都按各自 timeout 独立计时
- IP 加入后,15 分钟内所有来自它的新连接和已有连接都会被允许;超时后自动移出,后续包走默认策略(如 drop)
按需添加与实时验证白名单条目
运维或授权人员只需执行一条命令添加自己的 IP,系统自动回收:
- 单个添加:nft add element inet filter temp_whitelist { 203.0.113.99 timeout 10m }
- 批量添加(不同超时):nft add element inet filter temp_whitelist { 203.0.113.99 timeout 10m, 2001:db8::2 timeout 30m }
- 查看当前有效条目及剩余时间:nft list set inet filter temp_whitelist
- 可提前清理:nft delete element inet filter temp_whitelist { 203.0.113.99 }
增强白名单安全性的实用建议
仅靠 timeout 不足以满足生产环境要求,建议叠加以下控制:
- 限制可访问的服务端口,避免全端口开放:tcp dport { 22, 8080 } 加在 accept 规则末尾
- 搭配连接状态过滤,只放行新连接中的合法目标:ct state new 可防止利用已建立连接绕过
- 记录每次添加操作:用 shell 脚本封装命令,同时写入 syslog,包含操作人、IP、时效、时间戳
- 如用于 SSH 管理,建议额外绑定 key 认证或二次验证,避免仅靠 IP 白名单造成误放

















