iptables本身不支持定时开关,但通过xt_time内核模块可基于系统时间动态匹配数据包;规则常驻,仅当时间条件满足时生效,需加载模块、正确选择链(INPUT/OUTPUT/FORWARD)、设置本地时区参数并确保规则顺序合理。

iptables 本身不带定时开关功能,但借助 xt_time 内核模块,可以实现按时间动态匹配数据包的效果——规则始终存在,是否生效取决于当前系统时间是否落在设定范围内。
确认并加载 time 模块
xt_time 是内核模块,不是 iptables 自带命令。未启用就直接用 --timestart 会报错 “No chain/target/match by that name”。
- 检查是否已加载:
lsmod | grep xt_time,有输出说明正常 - 若无输出,临时启用:
sudo modprobe xt_time - 要开机自动加载:Debian/Ubuntu 加
xt_time到/etc/modules;RHEL/CentOS 写入/etc/sysconfig/modules/iptables.modules并设可执行权限
写对规则链和匹配方向
控制谁、访问什么,决定了该用哪条链:
-
限制本机主动连外网(如学生机禁用晚上上网)→ 必须用
OUTPUT链,目标地址加-d ! 10.0.0.0/8(排除内网) -
限制外部访问本机服务(如只在工作日开放 Web)→ 用
INPUT链,匹配协议和端口,例如-p tcp --dport 80 -
限制内网设备访问外网(如实验室按教室限时段)→ 用
FORWARD链,并加上源 IP 或网段,例如-s 10.1.26.0/24
设置准确的时间与星期参数
time 模块默认使用 UTC 时间,但可用 --kerneltz 强制读取系统本地时区(推荐),避免手动换算出错。
- 每日时段:
--timestart 09:00 --timestop 17:59(注意:不能写18:00,因为 24 小时制不含 24:00) - 跨零点需拆成两条,如 22:00–06:00 →
--timestart 22:00 --timestop 23:59和--timestart 00:00 --timestop 06:00 - 指定工作日:
--weekdays Mon,Tue,Wed,Thu,Fri(逗号分隔,支持缩写) - 日期范围(可选):
--datestart 2026-06-01 --datestop 2026-08-31
注意规则顺序与持久化
iptables 按序匹配,一旦某条 ACCEPT 规则提前放行,后续 DROP 就无效。
- 查当前 OUTPUT 链顺序:
sudo iptables -L OUTPUT --line-numbers - 确保 time 规则插在所有宽泛 ACCEPT 规则之前(建议用
-I OUTPUT 1插入首行) - 保存规则:Ubuntu 22.04+ 默认走 nftables 后端,用
sudo netfilter-persistent save;旧版 Debian/Ubuntu 可sudo iptables-save > /etc/iptables/rules.v4;CentOS/RHEL 用sudo service iptables save

















