Ubuntu服务器下使用UFW配置IP白名单访问网站并通过Cron刷新列表的问题咨询
Ubuntu服务器下使用UFW配置IP白名单访问网站并通过Cron刷新列表的问题咨询
嘿,你的思路有可取之处,但UFW的应用配置文件(app profile)本身只能定义端口/协议集合,没法直接引用外部IP列表文件。不过我们可以把应用配置和脚本结合起来,完美实现你要的“白名单+定时刷新”需求,具体步骤如下:
一、先确认你的应用配置文件没问题
你已经写的[My App]配置是有效的,先把它放到UFW的应用配置目录里:
- 把内容保存到
/etc/ufw/applications.d/my-web文件里 - 执行
sudo ufw app update My Web让UFW识别这个应用
这样之后,我们就可以直接用My Web这个名称来指代80/tcp和443/tcp端口,不用重复写端口号了。
二、准备IP白名单文件
创建你说的/var/www/allowed_ips.txt,每个IP(或CIDR网段)单独一行,支持注释行(以#开头),比如:
# 办公室IP段 192.168.1.0/24 # 个人办公电脑IP 10.0.0.5 # 云监控服务器IP 45.xx.xx.xx
三、编写自动更新UFW规则的脚本
我们需要一个脚本,先清理旧的白名单规则,再批量添加新的IP规则。创建/usr/local/bin/update_ufw_whitelist.sh,内容如下:
#!/bin/bash # 定义我们要允许的应用名称(和之前的app profile对应) TARGET_APP="My Web" # IP白名单文件路径 IP_FILE="/var/www/allowed_ips.txt" # 1. 删除所有带WHITELIST标记的旧规则 # 用numbered状态输出找到对应规则,倒序删除避免编号混乱 ufw status numbered | grep -E "ALLOW.*WHITELIST" | awk '{print $1}' | sort -rn | while read -r rule_num; do ufw --force delete "$rule_num" done # 2. 遍历IP列表,添加新的允许规则 while IFS= read -r ip_addr; do # 跳过空行和注释行 [[ -z "$ip_addr" || "$ip_addr" =~ ^# ]] && continue # 给这个IP添加访问My Web应用的权限,加WHITELIST注释方便后续识别 ufw allow from "$ip_addr" app "$TARGET_APP" comment "WHITELIST" done < "$IP_FILE" # 3. 重新加载UFW确保规则生效 ufw reload
给脚本添加执行权限:
sudo chmod +x /usr/local/bin/update_ufw_whitelist.sh
四、测试脚本是否正常工作
执行脚本:
sudo /usr/local/bin/update_ufw_whitelist.sh
然后运行sudo ufw status verbose,你应该能看到所有白名单IP对应的规则,并且都带有WHITELIST注释。
五、设置Cron定时自动刷新
现在让脚本定时运行,比如每天凌晨3点刷新一次:
- 编辑root的crontab:
sudo crontab -e
- 在末尾添加一行:
0 3 * * * /usr/local/bin/update_ufw_whitelist.sh >> /var/log/ufw_whitelist_update.log 2>&1
这行的意思是每天凌晨3点执行脚本,把输出和错误信息写到/var/log/ufw_whitelist_update.log里,方便后续排查问题。
额外提醒
- 确保UFW是启用状态:
sudo ufw enable - 如果之前你直接添加过允许80/443端口的规则(比如
ufw allow 80/tcp),记得删掉这些规则,否则非白名单IP也能访问:sudo ufw delete allow 80/tcp、sudo ufw delete allow 443/tcp - 可以根据自己的需求调整Cron的执行频率,比如每小时刷新一次就写成
0 * * * * ...
备注:内容来源于stack exchange,提问作者Will
相关产品推荐
相关产品推荐

