iptables 可通过内核 time 模块实现基于时间的规则,需确认模块可用(iptables -m time --help)、使用本地时间、配合持久化与注释提升可维护性,或用 cron 脚本作为替代方案。

确认 time 模块是否可用
执行以下命令检查内核是否支持:
iptables -m time --help
若显示帮助信息(含 --timestart、--timestop、--weekdays 等参数),说明模块就绪;若报错 iptables: No chain/target/match by that name,需确认:
- 当前内核已启用
CONFIG_IP_NF_MATCH_TIME(通常默认开启) - 使用的是标准 iptables(非 nftables 混合模式);如系统已默认启用 nftables(如 RHEL 9/CentOS 9),需切换回 legacy 模式或改用 nftables 的 time 功能
开放测试端口并限制生效时间段
例如:仅在工作日(周一至周五)的 09:00–18:00 允许外部访问开发端口 8080(TCP)
iptables -I INPUT -p tcp --dport 8080 -m time \ --timestart 09:00 --timestop 18:00 \ --weekdays Mon,Tue,Wed,Thu,Fri \ -j ACCEPT
注意要点:
-
-I INPUT插入规则到链首,确保早于可能存在的 DROP/REJECT 规则 -
--timestart/--timestop使用 24 小时制,不带秒,且为系统本地时间(非 UTC) -
--weekdays支持缩写:Mon/Tue/Wed/Thu/Fri/Sat/Sun,逗号分隔,不空格 - 该规则只控制“允许”,仍需确保已有基础策略(如 ESTABLISHED 连接放行)和最终拒绝策略
配套建议:提升稳定性和可维护性
纯 iptables 命令易丢失(重启失效),需持久化;同时避免时间规则被覆盖或冲突:
-
保存规则:CentOS/RHEL 执行
service iptables save或iptables-save > /etc/sysconfig/iptables;Ubuntu/Debian 推荐用iptables-persistent工具 -
添加注释说明(需 iptables ≥ 1.4.21):
-m comment --comment "dev-env-8080-workhours",便于后续排查 - 设置 fallback 安全策略:默认禁止该端口,仅靠 time 规则临时放行;不要依赖“先开后关”的脚本逻辑,避免时间窗口外残留开放
-
验证时间有效性:用
date确认系统时间准确(建议启用 chronyd/ntpd 同步),否则规则会失准
替代思路:轻量级定时触发(适合简单场景)
若 time 模块不可用,或需更灵活控制(如按 Git 分支、CI 状态动态开关),可用 cron 配合脚本:
- 每日 9:00 执行:
iptables -I INPUT -p tcp --dport 8080 -j ACCEPT 2>/dev/null || true - 每日 18:00 执行:
iptables -D INPUT -p tcp --dport 8080 -j ACCEPT 2>/dev/null || true - 注意:需加
2>/dev/null || true避免失败报错中断;且必须确保规则插入位置一致(推荐用-C先检查是否存在再操作)











