可利用iptables的time模块在指定时间段动态禁止访问特定端口,通过丢弃非工作时间入站请求实现逻辑屏蔽;需验证模块支持、按顺序配置accept/drop规则,并持久化保存。

可以利用 iptables 的 time 模块,在指定时间段内动态禁止访问特定端口,实现“非工作时间自动关闭端口”的效果。注意:这不是真正“关闭端口”,而是通过丢弃对应时间段的入站连接请求,达到逻辑屏蔽的效果。
确认内核和iptables支持time模块
大多数现代 Linux 发行版默认启用该功能,但需验证:
- 运行
iptables -m time --help,若显示帮助信息说明模块可用 - 检查内核是否编译了
CONFIG_IP_NF_MATCH_TIME(通常为m或y):zcat /proc/config.gz | grep CONFIG_IP_NF_MATCH_TIME(若无 config.gz,可查/boot/config-$(uname -r)) - 如模块未加载,手动加载:
modprobe xt_time
定义工作时间并设置阻断规则
假设工作时间为工作日(周一至周五)的 09:00–18:00,其余时间(含周末)禁止访问 Web 端口(如 80/443):
- 先放行工作时间的流量(可选,但推荐显式控制):
iptables -A INPUT -p tcp --dport 80 -m time --timestart 09:00 --timestop 18:00 --weekdays 1,2,3,4,5 -j ACCEPT - 再拒绝非工作时间的访问:
iptables -A INPUT -p tcp --dport 80 -m time ! --timestart 09:00 --timestop 18:00 --weekdays 1,2,3,4,5 -j DROP - 对 HTTPS 同理,替换
--dport 443即可
⚠️ 注意规则顺序:iptables 自上而下匹配,DROP 规则必须放在更宽松的规则之后(如已有默认 ACCEPT,需确保 time 规则优先)。
持久化与测试
iptables 规则重启后会丢失,需保存:
- Debian/Ubuntu:
iptables-save > /etc/iptables/rules.v4 - RHEL/CentOS 7+:
service iptables save(若使用 iptables-services)或用iptables-save配合 systemd 脚本 - 建议配合 cron 每日校准系统时间(
ntpdate或systemd-timesyncd),因xt_time依赖系统时钟 - 测试方法:临时修改系统时间(仅测试环境!),或用
iptables -L -v -n查看匹配包数量变化
补充说明与常见问题
time 模块基于本地系统时间,不支持时区切换;不能识别夏令时自动调整;也不支持“每月第 N 天”等复杂日历逻辑。
- 如需更灵活调度(如节假日豁免),建议结合外部脚本 +
cron动态增删规则 - 避免在 OUTPUT 链使用 time 模块限制本机出向——通常无意义
- 若使用 firewalld 或 ufw,需先停用它们,或通过其扩展机制间接调用 iptables time 规则











