可利用iptables time模块在非工作时段自动阻断外部对数据库端口(如3306、5432)的访问,无需停服务;需验证模块支持、设置本地放行与非工作时间DROP规则、处理跨天及周末场景,并持久化保存规则。

可以利用 iptables 的 time 模块,在非工作时段自动阻断对特定数据库端口(如 MySQL 的 3306、PostgreSQL 的 5432)的外部访问,无需停服务,也不依赖应用层逻辑。
确认内核和iptables支持time模块
多数现代 Linux 发行版默认启用该模块,但需验证:
- 运行
iptables -m time --help,若显示帮助信息说明已就绪 - 检查内核是否加载:执行
zcat /proc/config.gz | grep CONFIG_IP_NF_MATCH_TIME(若存在 config.gz),或查看/lib/modules/$(uname -r)/kernel/net/ipv4/netfilter/ipt_time.ko* - 若缺失,需重新编译内核或安装对应 kernel-modules-extra 包(如 CentOS/RHEL 执行
yum install kernel-modules-extra)
定义工作时段并设置DROP规则
假设工作时间为工作日 09:00–18:00,目标端口为 3306(MySQL),仅限制来自外网(非本地)的连接:
- 先放行本地访问(避免影响本机应用):
iptables -A INPUT -s 127.0.0.1 -p tcp --dport 3306 -j ACCEPT - 再匹配非工作时间并丢弃远程连接:
iptables -A INPUT -p tcp --dport 3306 ! -s 127.0.0.1 -m time ! --timestart 09:00 --timestop 18:00 --weekdays Mon,Tue,Wed,Thu,Fri -j DROP - 注意:
!表示“非”,--weekdays列出工作日,! --timestart ... --timestop ...组合即表示“不在该时间段内”
处理跨天与周末场景
若需支持 24 小时值班系统(如仅闭合周末+夜间),可拆分规则或使用多条件:
- 例:周末全天 + 工作日 18:00–次日 09:00 闭合
iptables -A INPUT -p tcp --dport 3306 ! -s 127.0.0.1 -m time --weekdays Sat,Sun -j DROPiptables -A INPUT -p tcp --dport 3306 ! -s 127.0.0.1 -m time --timestart 18:00 --timestop 09:00 --weekdays Mon,Tue,Wed,Thu,Fri -j DROP - 注意:跨天时间段(如 18:00–09:00)iptables 默认按“当日内”解析,因此需配合
--weekdays明确范围,避免误判 - 系统时间必须准确(建议启用
chronyd或ntpd同步)
持久化与安全提醒
iptables 规则重启后失效,需保存并开机加载:
- Debian/Ubuntu:
iptables-save > /etc/iptables/rules.v4 - RHEL/CentOS 7+:
iptables-save > /etc/sysconfig/iptables,并确保iptables-services已启用 - 务必测试规则逻辑:用
iptables -L INPUT -v -n查看匹配计数;模拟非工作时间用date -s "Sat 20:00:00"(测试后记得恢复系统时间) - 切勿直接在生产环境执行无备份的规则变更;建议先加
-C检查是否存在重复规则,或用-I插入到链首便于快速回滚











