iptables本身不支持原生时间匹配,必须依赖内核xt_time模块;该模块在CentOS 7+/Ubuntu 18.04+等主流发行版中已编译进内核,需用-m time显式调用,并注意使用本地时间、24小时制及正确规则顺序。

iptables 本身不支持原生时间匹配,必须用 xt_time 模块
iptables 默认规则链无法识别“上午9点到下午6点”这类条件。真要按时间控制端口开放,得依赖内核模块 xt_time —— 它不是默认启用的,但现代主流发行版(CentOS 7+/RHEL 7+、Ubuntu 18.04+)内核都已编译进该模块,只需在规则中显式调用。
验证是否可用:modprobe xt_time && echo "ok" || echo "missing"
如果报错 “Module not found”,说明内核没编译它(极少见),需换内核或改用其他方案。
添加带时间限制的端口规则:语法和关键参数
比如只允许开发人员在工作日 9:00–18:00 访问测试环境的 8080 端口:
iptables -I INPUT -p tcp --dport 8080 -m time --timestart 09:00 --timestop 18:00 --weekdays Mon,Tue,Wed,Thu,Fri -j ACCEPT
注意几个易错点:
-
--timestart和--timestop是本地系统时间(非 UTC),且必须用 24 小时制,不能写9:00或9am -
--weekdays只接受缩写:Mon/Tue/Wed/Thu/Fri/Sat/Sun,不支持中文或全拼 - 规则必须插在 INPUT 链靠前位置(用
-I而非-A),否则可能被前面的REJECT或DROP截断 - 该规则只控制“新连接”,已建立的连接不受时间影响(这是预期行为)
保存规则后,时间策略仍不生效?检查这三件事
即使规则加对了,也常因以下原因失效:
- 系统时间不准:
timedatectl status查看是否同步,误差超过 5 分钟会导致xt_time判定失败 - 规则未持久化:CentOS/RHEL 执行
service iptables save;Ubuntu/Debian 用netfilter-persistent save。漏掉这步,重启就清空 - 规则顺序冲突:运行
iptables -L INPUT -n --line-numbers,确认你的 time 规则行号比拒绝规则小(即位置更靠前)
想临时关闭时间策略?别删规则,用 -C + -D 更安全
调试阶段频繁启停,直接删规则容易误操作。推荐先查是否存在:
iptables -C INPUT -p tcp --dport 8080 -m time --timestart 09:00 --timestop 18:00 --weekdays Mon,Tue,Wed,Thu,Fri -j ACCEPT
返回 0 表示存在,此时再删:
iptables -D INPUT -p tcp --dport 8080 -m time --timestart 09:00 --timestop 18:00 --weekdays Mon,Tue,Wed,Thu,Fri -j ACCEPT
这种“先查后删”方式避免因规则微小差异(比如多空格)导致 -D 失败却无提示,是线上环境最稳妥的操作习惯。


















