iptables 通过 xt_time 模块实现时间控制,需确认模块加载(lsmod | grep xt_time 或 modprobe xt_time),支持工作日、跨天及日期范围匹配,规则须置于 drop 前并保存持久化。

iptables 本身不直接支持时间条件匹配,但可以通过 xt_time 模块实现基于时间段的访问控制。该模块是内核扩展,需确认系统已启用且规则语法正确。
确认 xt_time 模块是否可用
运行以下命令检查模块是否加载:
lsmod | grep xt_time
若无输出,尝试手动加载:
modprobe xt_time
大多数现代发行版(如 CentOS 7+/Ubuntu 18.04+)默认编译进内核或作为模块存在。若提示“Module not found”,说明内核未启用该功能,需重新编译或更换内核。
设置每天固定时段放行某 IP 访问 SSH
例如:只允许 192.168.1.100 在工作日 9:00–18:00 访问本机 SSH(端口 22):
- 先拒绝所有 SSH 连接:iptables -A INPUT -p tcp --dport 22 -j DROP
- 再插入一条带时间限制的允许规则(必须放在 DROP 规则之前):iptables -I INPUT -p tcp --dport 22 -s 192.168.1.100 -m time --timestart 09:00 --timestop 18:00 --weekdays Mon,Tue,Wed,Thu,Fri -j ACCEPT
注意:-I INPUT 表示插入到链首,确保优先匹配;--weekdays 支持缩写(Mon-Sun),也可用数字(1-7,1=Monday);--timestart/--timestop 使用本地系统时间(非 UTC),需确保系统时区和时间准确。
处理跨天与日期范围
xt_time 支持跨天(如 22:00–06:00)和指定日期范围(--datestart/--datestop):
- 夜间允许访问(22:00 至次日 06:00):iptables -I INPUT -p tcp --dport 80 -m time --timestart 22:00 --timestop 06:00 -j ACCEPT
- 仅在国庆假期开放某服务(2024-10-01 至 2024-10-07):iptables -I INPUT -p tcp --dport 3306 -m time --datestart 2024-10-01 --datestop 2024-10-07 -j ACCEPT
跨天时段会自动按“当日 22:00 到次日 06:00”解释;日期范围需格式为 YYYY-MM-DD,且仅匹配起止日期之间的每一天(含首尾)。
保存与持久化规则
iptables 规则重启后丢失,需显式保存:
- Debian/Ubuntu:iptables-save > /etc/iptables/rules.v4
- CentOS/RHEL 7:service iptables save(需安装 iptables-services)
- 通用方法(推荐):iptables-save | tee /etc/iptables.conf,再通过 systemd 或网络脚本加载
务必验证保存后的规则是否包含 xt_time 条目——部分保存工具可能忽略扩展模块参数,建议 reload 后用 iptables -L INPUT -v -n 检查匹配计数是否更新。











