nftables 原生 time 匹配支持基于连接时间的动态访问控制,2026 年主流发行版已内置,需内核 ≥5.15、nftables ≥1.0.4,依赖准确的系统时间与时区配置。

用 nftables 实现基于连接时间的动态访问授权,核心是把“时间”作为匹配条件嵌入规则链,而不是靠外部脚本轮询或定时刷新。2026 年主流发行版(如 RHEL 9、Debian 12、Ubuntu 22.04+、OpenWrt ≥23.05)已原生支持 time 关键字,无需额外模块,也规避了旧式 xt_time 的秒级漂移和夏令时陷阱。
确认环境是否支持原生 time 匹配
运行以下命令验证内核与 nftables 版本:
-
uname -r—— 应 ≥ 5.15(推荐 ≥ 6.1) -
nft --version—— 应 ≥ 1.0.4 -
nft list ruleset 2>/dev/null | grep -q 'time' && echo "支持"—— 快速检测语法可用性
若不满足,需升级系统或退而使用兼容层(meta time),但会牺牲精度与可维护性。
按工作时段开放 SSH 管理端口(白名单+时段双控)
典型场景:仅允许运维人员在工作日 08:30–18:00 通过指定 IP 段登录 SSH,其余时间自动封锁。
- 先创建带默认拒绝策略的 input 链:
nft add chain inet filter input { type filter hook input priority 0 \; policy drop \; } - 添加精准放行规则(注意:时间范围包含起止时刻,且使用 24 小时制):
nft add rule inet filter input tcp dport 22 ip saddr 192.168.10.0/24 time hour @ 08:30-18:00 time day @ mon-fri accept - 该规则同时校验源 IP、端口、小时段与星期,任意一项不满足即跳过,继续匹配后续规则(如日志或 drop)
对非关键服务实施“夜间休眠”策略
例如 Home Assistant 或 BT 下载服务,白天开放,凌晨 00:00–06:00 完全关闭监听:
- 为服务绑定独立链便于管理:
nft add chain inet filter ha-service { type filter hook input priority 10 \; } - 插入时段限制规则:
nft add rule inet filter ha-service tcp dport 8123 time hour @ 00:00-06:00 dropnft add rule inet filter ha-service tcp dport 8123 accept - 注意顺序:drop 规则必须在 accept 之前,否则会被绕过;也可将 accept 放在主 input 链中,用 jump 跳转到子链做细化控制
处理跨日与夏令时等边界情况
原生 time 关键字依赖系统本地时间(CLOCK_REALTIME),因此务必确保:
-
timedatectl status显示 “NTP enabled: yes” 且 “System clock synchronized: yes” - 时区设置准确:
timedatectl set-timezone Asia/Shanghai(按实际调整) - 避免使用模糊写法如
hour @ 23:00-01:00(跨日不被支持),应拆为两段:hour @ 23:00-23:59和hour @ 00:00-01:00 - 夏令时切换由系统自动处理,无需手动干预规则
不复杂但容易忽略。

















