iptables可通过xt_time模块实现非工作时间端口关闭:先用--timestart/--timestop和--weekdays配合--localtz按本地时区放行工作时间流量,再用取反逻辑显式拒绝非工作时间连接,并记录日志、发送rst。

iptables 本身不直接支持“工作时间”或“非工作时间”的逻辑,但可以通过 time 模块(属于 xt_time 扩展)匹配数据包到达的时间戳,从而在指定时间段内允许或拒绝流量。要实现“非工作时间端口关闭”,本质是:在非工作时间段,拒绝目标端口的入站连接请求(如 TCP SYN),而工作时间则放行。
确认内核和iptables支持 time 模块
多数现代 Linux 发行版默认启用 xt_time 模块,但仍需验证:
- 运行
lsmod | grep xt_time,有输出表示模块已加载;若无,可执行modprobe xt_time临时加载 - 检查 iptables 是否能识别 time 匹配:
iptables -m time --help不报错即支持 - 注意:time 模块依赖系统实时时钟(RTC),且默认使用 UTC 时间 —— 若系统时区为 CST(东八区),需用
--utc或--localtz明确指定时区,否则规则可能错位
定义“工作时间”并配置放行规则
推荐采用“白名单思维”:先放行工作时间的端口访问,再默认拒绝(或仅对非工作时间加拒绝规则)。例如,开放工作日 9:00–18:00 的 TCP 80 端口:
iptables -A INPUT -p tcp --dport 80 \ -m time --timestart 09:00 --timestop 18:00 \ --weekdays Mon,Tue,Wed,Thu,Fri --localtz \ -j ACCEPT
-
--localtz表示按系统本地时间(如 CST)判断;若省略,默认按 UTC,易导致规则生效时间偏移 8 小时 -
--weekdays支持缩写(Mon~Sun),多个用逗号分隔;也可用--monthdays 1,15,31匹配特定日期 - 该规则必须放在更宽泛的拒绝规则之前(iptables 规则顺序执行),否则会被提前拦截
补充非工作时间的显式拒绝(可选但推荐)
若策略要求明确阻断非工作时间访问(如记录日志或返回 RST),可添加一条带日志的拒绝规则:
iptables -A INPUT -p tcp --dport 80 \ -m time ! --timestart 09:00 --timestop 18:00 \ ! --weekdays Mon,Tue,Wed,Thu,Fri --localtz \ -j LOG --log-prefix "BLOCKED_OFFHOURS_HTTP: "
iptables -A INPUT -p tcp --dport 80 \ -m time ! --timestart 09:00 --timestop 18:00 \ ! --weekdays Mon,Tue,Wed,Thu,Fri --localtz \ -j REJECT --reject-with tcp-reset
- 注意:两次取反(
!)逻辑需严谨;也可改用--datestart/--datestop控制节假日等特殊时段 -
--reject-with tcp-reset对 TCP 连接发送 RST 包,比 DROP 更友好(客户端立即得知连接失败) - LOG 规则建议放在 REJECT 前,确保被拒绝的包也能记录
持久化与测试要点
iptables 规则重启后丢失,需保存:
- Debian/Ubuntu:运行
iptables-save > /etc/iptables/rules.v4 - RHEL/CentOS:使用
service iptables save(旧版)或iptables-save > /etc/sysconfig/iptables - 务必先在测试环境验证时间逻辑:手动修改系统时间(
date -s "2024-06-15 10:00:00"),观察 telnet/curl 是否按预期通断 - 注意 NTP 同步可能自动校正时间,影响测试;临时停用
systemctl stop chronyd或ntpd











