Ubuntu防火墙(UFW)定时任务设置指南
在Ubuntu系统中,UFW(Uncomplicated Firewall)是基于iptables的前端防火墙工具,用于简化防火墙规则的管理。若需要让UFW规则随时间动态调整(如定期开关、备份或切换策略),可通过cron定时任务实现。以下是具体操作步骤及示例:
确保cron服务运行
cron是Ubuntu默认的定时任务调度器,需先确认其已安装并启动:
sudo apt update && sudo apt install cron # 安装cron(若未安装)
sudo systemctl start cron # 启动cron服务
sudo systemctl enable cron # 设置开机自启动
掌握cron时间格式
cron任务的执行时间由5个时间字段和命令组成,格式为:
分 时 日 月 周 命令
示例:
0 2 * * *:每天凌晨2点执行;*/10 * * * *:每10分钟执行一次;0 8-17 * * 1-5:周一至周五8:00-17:00每小时执行(工作时间)。定时任务通常通过Shell脚本调用UFW命令实现,脚本需具备可执行权限。以下是常见场景的脚本示例:
定期备份UFW规则可防止规则丢失,便于恢复:
#!/bin/bash
# 脚本路径:/usr/local/scripts/ufw_backup.sh
BACKUP_DIR="/path/to/ufw_backups" # 备份目录(需提前创建)
DATE=$(date +%Y-%m-%d_%H-%M-%S) # 当前时间(用于文件名)
# 创建备份目录(若不存在)
sudo mkdir -p "$BACKUP_DIR"
# 导出UFW规则到备份文件
sudo ufw show rules > "$BACKUP_DIR/ufw_rules_$DATE.txt"
sudo ufw status verbose > "$BACKUP_DIR/ufw_status_$DATE.txt"
echo "[$(date)] UFW规则备份完成:$BACKUP_DIR/ufw_rules_$DATE.txt" >> /var/log/ufw_backup.log
赋予权限:
sudo chmod +x /usr/local/scripts/ufw_backup.sh
测试期间,为避免误操作导致无法连接,可设置定时开关:
#!/bin/bash
# 脚本路径:/usr/local/scripts/ufw_toggle.sh
LOG_FILE="/var/log/ufw_toggle.log"
# 检查UFW当前状态(1表示启用,0表示禁用)
STATUS=$(sudo ufw status | grep -c "Status: active")
if [ "$STATUS" -eq 1 ]; then
sudo ufw disable
echo "$(date):UFW已禁用" >> "$LOG_FILE"
else
sudo ufw enable
echo "$(date):UFW已启用" >> "$LOG_FILE"
fi
赋予权限:
sudo chmod +x /usr/local/scripts/ufw_toggle.sh
通过crontab命令编辑当前用户的定时任务(若需root权限,使用sudo crontab -e):
crontab -e
在文件末尾添加以下行:
0 2 * * * /usr/local/scripts/ufw_backup.sh
保存并退出(vi编辑器按Esc→:wq;nano编辑器按Ctrl+X→Y→Enter)。
crontab -e
添加以下行:
*/10 * * * * /usr/local/scripts/ufw_toggle.sh
注意:此任务仅用于测试,生产环境不建议频繁开关防火墙!
查看任务列表:
crontab -l # 查看当前用户的cron任务
sudo crontab -l # 查看root用户的cron任务(若有)
查看执行日志:
journalctl查看cron服务日志:sudo journalctl -u cron -f # 实时查看cron日志
/var/log/ufw_backup.log或/var/log/ufw_toggle.log):tail -f /var/log/ufw_backup.log
若需实现“工作时间允许HTTP/HTTPS流量,非工作时间禁止”的策略,可编写更复杂的脚本:
#!/bin/bash
# 脚本路径:/usr/local/scripts/ufw_time_based.sh
HOUR=$(date +%H) # 当前小时(0-23)
# 工作时间:8:00-17:00(允许80/443端口)
if [ "$HOUR" -ge 8 ] && [ "$HOUR" -lt 17 ]; then
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw delete deny 80/tcp # 删除之前的拒绝规则(若有)
sudo ufw delete deny 443/tcp
echo "$(date):工作时间,已开启HTTP/HTTPS" >> /var/log/ufw_time_based.log
else
sudo ufw deny 80/tcp
sudo ufw deny 443/tcp
echo "$(date):非工作时间,已关闭HTTP/HTTPS" >> /var/log/ufw_time_based.log
fi
添加cron任务(每30分钟检查一次):
crontab -e
添加:
*/30 * * * * /usr/local/scripts/ufw_time_based.sh
sudo(cron任务默认以当前用户身份运行,若需root权限,需用sudo crontab -e编辑)。通过以上步骤,可实现UFW规则的定时自动化管理,提升系统安全性与运维效率。