nftables 的 time 表达式可实现分钟级精度的基于时间的访问控制,需内核 4.15+ 支持,通过 hour 和 week day 指定时段,结合 IP 匹配限制外包人员访问 SSH 等服务,并支持 set 管理多 IP 及持久化配置。

可以通过 nftables 的 time 表达式实现基于时间的访问控制,限制外包人员在指定时间段内才可访问特定服务(如 SSH、Web 管理后台等)。nftables 本身不依赖外部服务或 cron,其 time 模块直接由内核支持,精度为分钟级,稳定可靠。
确认内核支持并启用 time 表达式
nftables 的 time 功能自 Linux 内核 4.15+ 原生支持,无需额外加载模块。但需确保当前系统内核版本满足要求:
- 运行 uname -r 查看内核版本,若低于 4.15,需升级内核
- 执行 nft list ruleset 后无报错,且能正常添加含 time 的规则,即表示可用
- 若提示 unknown keyword 'time',说明内核或 nftables 版本过旧(如 RHEL 8.4 之前默认禁用),需更新或启用 CONFIG_NF_TABLES_INET=y 配置
定义时间窗口与访问规则
以限制外包人员仅能在工作日 9:00–18:00 访问 SSH(22端口)为例,假设其 IP 固定为 203.0.113.42:
- 先创建专用链便于管理:nft add chain inet filter outsourced_ssh '{ type filter hook input priority 0; }'
- 插入带时间条件的放行规则:nft add rule inet filter input ip saddr 203.0.113.42 tcp dport 22 time hour 09:00-18:00 week day { mon, tue, wed, thu, fri } accept
- 紧随其后加一条拒绝规则(避免匹配失败后落入默认策略):nft add rule inet filter input ip saddr 203.0.113.42 tcp dport 22 drop
注意:time 表达式必须写在匹配条件末尾;hour 支持 HH:MM 格式(24小时制),week day 支持英文全称或缩写(mon–fri 也可);多时段可用逗号分隔,如 hour 09:00-12:00,13:30-17:45。
扩展场景:按 IP 集合 + 时间统一管控
若外包团队有多个 IP,推荐使用 set 提升可维护性:
- 创建带超时的动态地址集:nft add set inet filter outsourced_ips { type ipv4_addr; flags timeout; }
- 添加成员并设置存活期(例如 24 小时):nft add element inet filter outsourced_ips { 203.0.113.42 timeout 24h, 203.0.113.43 timeout 24h }
- 在规则中复用该集合:nft add rule inet filter input ip saddr @outsourced_ips tcp dport 22 time hour 08:30-17:30 accept
这种方式便于批量增删 IP,也支持自动过期,避免长期残留无效授权。
持久化与验证要点
临时规则重启即失效,务必保存并配置开机加载:
- 导出当前规则:nft list ruleset > /etc/nftables.conf
- 启用 systemd 服务:systemctl enable --now nftables(Debian/Ubuntu 默认使用此方式)
- 验证时间规则是否生效:在非授权时段尝试连接,用 nft monitor trace 实时观察数据包是否被 time 条件拦截
- 注意系统时钟必须准确(建议启用 chrony 或 systemd-timesyncd),否则 time 匹配将失效

















