iptables-mtime模块仅支持按时间匹配规则,不能自动启用防御模式;需结合cron定时切换规则集或在规则中嵌入-m time条件实现凌晨低峰期动态加载严格策略。

iptables-mtime 模块本身不提供“自动启用安全扫描防御模式”的功能,它只是一个匹配时间的扩展模块,用于根据系统时间决定是否匹配某条规则。所谓“凌晨低峰期自动启用防御模式”,本质是:在指定时间段(如 02:00–05:00)动态加载一组更严格的 iptables 规则(例如限速、封禁高频扫描 IP、关闭非必要端口),其余时间恢复宽松策略。
一、确认系统支持 mtime 模块
运行以下命令检查内核是否已编译 mtime 支持:
iptables -m time --help
若显示帮助信息且含 --timestart、--timestop、--weekdays 等参数,说明可用。若提示 iptables: No chain/target/match by that name,需安装或编译带 xt_time 模块的内核/iptables(常见于 CentOS 7+/Ubuntu 18.04+ 默认支持)。
二、设计两套规则集:日常模式 & 扫描防御模式
建议将规则保存为独立脚本,便于切换:
- /etc/iptables/iptables-day.rules:常规策略(开放 HTTP/HTTPS/SSH,基础连接限制)
-
/etc/iptables/iptables-night.rules:防御模式(额外添加):
- 对 22/80/443 端口启用 per-IP 连接速率限制(如 --limit 3/min)
- DROP 匹配 nmap 特征指纹的 TCP 包(需配合 string 模块)
- 用 recent 模块临时封禁 5 分钟内尝试 >10 次连接的源 IP
- 关闭测试端口(如 8080、9200)或仅允许内网访问
三、用 mtime 实现“按时间自动匹配”防御规则
mtime 不是开关,而是条件匹配器。典型用法是在一条规则中嵌入时间判断,例如:
iptables -I INPUT -p tcp --dport 22 -m time --timestart 02:00 --timestop 05:00 --weekdays 1,2,3,4,5,6,7 -m connlimit --connlimit-above 3 --connlimit-mask 32 -j DROP
这条规则表示:每天凌晨 2–5 点,对 SSH 端口启用单 IP 连接数限制(超过 3 个并发即丢弃),其他时段该规则不生效(因不匹配时间条件)。
关键点:
- 所有防御规则都加 -m time --timestart 02:00 --timestop 05:00,确保只在低峰期触发
- 规则插入顺序很重要:应放在通用 ACCEPT 规则之前,否则会被提前放行
- 避免使用 --datestart/--datestop(依赖系统时区与硬件时钟,易出错)
四、配合 cron 实现“规则热切换”(更推荐)
如果防御逻辑复杂(如需清空 recent 表、加载多条链、调用外部脚本),纯 mtime 难以覆盖。此时用 cron 更灵活可靠:
编辑 root 的 crontab:crontab -e
添加两行:
0 2 * * * /usr/local/bin/enable-scan-defense.sh
0 5 * * * /usr/local/bin/disable-scan-defense.sh
其中脚本内容示例(/usr/local/bin/enable-scan-defense.sh):
#!/bin/bash
iptables-restore
echo "$(date): Night defense mode activated" >> /var/log/iptables-switch.log
注意:确保脚本有执行权限(chmod +x),并预先用 iptables-save 备份当前规则。
不复杂但容易忽略:系统时间必须准确(建议启用 chrony/ntpd),且防火墙服务(如 firewalld)不能与 iptables 冲突——运行前停用 firewalld(systemctl stop firewalld && systemctl disable firewalld)。











