ufw不支持原生时间段访问控制,需通过cron或systemd timer调用ufw命令动态启停规则;推荐用规则编号删除、检查重复添加,并确保时间同步与开机自启。

UFW 本身不支持原生的时间段(如“每天 9:00–17:00”)访问控制,它是一个基于 iptables 的静态防火墙前端,规则在加载时即生效,不具备内置定时调度能力。但可通过系统级协作实现“按时间段开启网络访问”的效果。
核心思路:用 cron + ufw 命令动态启停规则
本质是将 UFW 规则的启用/禁用操作封装为脚本,并通过系统定时任务(cron)在指定时间自动执行。例如:工作日早 8 点放行某端口,晚 6 点封锁。
- 编写两个简单脚本:
allow-service.sh(添加规则并启用)和deny-service.sh(删除或拒绝对应规则) - 确保脚本有执行权限:
chmod +x /path/to/allow-service.sh - 使用
sudo crontab -e添加定时任务(注意:必须用 root 的 crontab,因 ufw 需要 root 权限) - 示例(周一至周五 8:00 开放 TCP 8080 给 192.168.1.0/24):
0 8 * * 1-5 root /usr/sbin/ufw allow from 192.168.1.0/24 to any port 8080 proto tcp >/dev/null 2>&1 - 对应地,在 18:00 删除该规则:
0 18 * * 1-5 root /usr/sbin/ufw delete allow from 192.168.1.0/24 to any port 8080 proto tcp >/dev/null 2>&1
更稳健的做法:预定义规则编号 + delete by number
直接用 ufw delete allow ... 可能因规则微小差异(如空格、顺序)导致失败。推荐先查编号再删:
- 运行
sudo ufw status numbered查看当前规则编号 - 在脚本中用
ufw --force delete确保精准移除 - 可把规则编号写入临时文件(如
/var/run/ufw-temp-rule-id),便于后续调用 - 避免规则重复添加:执行前先检查是否已存在,例如用
ufw status | grep -q "8080.*192\.168\.1\.0"
替代方案:结合 systemd timer(适合较新系统)
相比 cron,systemd timer 更可靠,支持日志追踪、依赖管理与精确秒级调度:
- 创建 service 文件(
/etc/systemd/system/ufw-allow-worktime.service),内容包含ExecStart=/usr/sbin/ufw allow ... - 创建对应 timer 文件(
ufw-allow-worktime.timer),设置OnCalendar=Mon..Fri *:08:00 - 启用 timer:
sudo systemctl daemon-reload && sudo systemctl enable --now ufw-allow-worktime.timer - 查看状态:
systemctl list-timers | grep ufw
注意事项与常见坑
实际部署时需留意以下几点,否则策略可能失效或引发连接中断:
-
默认策略优先级高于具体规则:若默认是
ufw default deny incoming,则只需添加 allow;若默认是 allow,则必须显式 deny 才能限制 -
规则顺序影响匹配结果:UFW 按添加顺序匹配,越靠前越先生效。建议定期用
ufw status verbose检查顺序 -
时间同步必须准确:cron 和 systemd timer 都依赖系统时间,务必启用 NTP(如
systemd-timesyncd或chrony) - 重启后规则仍存在,但定时任务不会自动恢复:确保 cron 或 systemd timer 已设为开机启动










