服务器访问黑白名单批量管理脚本:从零开始自动化
核心答案:批量管理访问黑白名单的自动化脚本怎么做?
服务器访问黑白名单批量管理脚本,就是通过一段可重复执行的脚本,一次性为防火墙(如 iptables)或 Web 服务器(如 Nginx)添加、删除或更新多个 IP 的放行或拒绝规则。
常见做法是将要管理的 IP 列表放入文本文件,再用脚本循环读取并执行对应命令。
本文会给出 iptables 和 Nginx 两种环境下的完整脚本示例,并说明 ipset 等优化方法,确保新增规则不影响现有连接,同时提供验证步骤和常见错误处理。
什么时候需要批量黑白名单脚本?
如果你遇到以下场景,手动一条条加规则既不现实也容易出错:
- 攻防演练时需临时封禁大量境外或特定 IP 段;
- 企业内网只允许指定办公出口 IP 访问管理端口;
- CDN 回源 IP 列表经常更新,需要批量同步到源站 Nginx 白名单;
- 从第三方威胁情报获取一批恶意 IP,需要快速统一封禁。
准备工作:确认环境与权限
- 登录服务器(建议用 root 或具有 sudo 权限的用户)。
- 确认已安装 iptables(大部分 Linux 发行版自带)或已配置 Nginx。
- 准备一份纯文本格式的 IP 列表文件,每行一个 IP(或 CIDR 网段),例如
/root/whitelist.txt。 - 如果使用 ipset 优化,先安装
ipset工具(apt install ipset或yum install ipset)。
脚本实现:iptables 批量白名单(推荐 ipset)
直接对 iptables 循环添加规则会导致规则链过长,影响性能。
标准做法是先用 ipset 创建集合,再将集合引用到 iptables 规则中。
第一步:创建 ipset 集合
ipset create whitelist hash:net maxelem 65536
第二步:从文件批量添加 IP
#!/bin/bash
# batch_whitelist.sh
IP_FILE="/root/whitelist.txt"
IPSET_NAME="whitelist"
while read ip; do
if [ -n "$ip" ]; then
ipset add $IPSET_NAME $ip 2>/dev/null
echo "已添加: $ip"
fi
done < "$IP_FILE"
给脚本执行权限后运行:chmod +x batch_whitelist.sh && ./batch_whitelist.sh
第三步:引用到 iptables 规则
iptables -A INPUT -m set --match-set whitelist src -j ACCEPT
iptables -A INPUT -j DROP # 非白名单 IP 全部拒绝(谨慎使用)
如果只想将白名单放在某些端口,可结合 -p tcp --dport 22 等条件。
脚本实现:Nginx 批量黑名单
对于 Nginx,可以在 http 块或 server 块里使用 include 指令引入独立的拒绝 IP 文件。
准备拒绝 IP 文件(例如 /etc/nginx/blacklist.conf):
deny 103.235.46.0/24;
deny 45.33.32.0/19;
# ... 更多 IP
批量生成该文件的脚本:
#!/bin/bash
# generate_nginx_blacklist.sh
IP_FILE="/root/blacklist.txt"
OUTPUT="/etc/nginx/blacklist.conf"
> "$OUTPUT" # 清空旧文件
while read ip; do
if [ -n "$ip" ]; then
echo "deny $ip;" >> "$OUTPUT"
echo "已写入: $ip"
fi
done < "$IP_FILE"
echo "include $OUTPUT;" # 提示在主配置中加入此 include
运行后,
手动在 Nginx 主配置合适位置添加 include /etc/nginx/blacklist.conf;,
然后执行 nginx -t 测试配置、nginx -s reload 重载。
避坑指南
- 不要直接用 iptables 循环添加大量规则,规则数量多会导致处理延迟,一定要结合 ipset 或 nftables。
- 白名单与黑名单顺序:iptables 匹配规则是从上到下,白名单规则要放在拒绝规则之前;Nginx 的
deny和allow顺序也类似,allow要先于deny。 - 文件格式:IP 列表文件末尾不要有多余空行或注释,否则可能被脚本错误添加空行导致命令失败。建议用
grep -v '^#' | grep -v '^$'过滤。 - Nginx 重载前务必测试配置,避免语法错误导致服务中断。
- IPv6 支持:如果管理 IPv6 地址,iptables 对应
ip6tables,ipset 需要family inet6,Nginx 使用deny同样支持。
效果验证
- 对于 iptables:使用
ipset list whitelist查看集合中的 IP;使用iptables -L INPUT -n -v查看规则匹配次数。 - 对于 Nginx:从白名单外 IP 访问端口应返回 403(黑名单)或连接超时(未放行);白名单内 IP 正常访问。
- 建议从另一台非受信服务器测试:
curl -I http://你的服务器IP,观察返回状态码。
常见问题
Q1:脚本添加 IP 时提示“ipset add: 元素已存在”是否正常?
A:正常。ipset 默认不允许重复添加,加上 -exist 参数可忽略已存在项:ipset -exist add whitelist $ip。
Q2:重启服务器后 ipset 集合和 iptables 规则会丢失吗?
A:会。需要将 ipset 和 iptables 规则持久化。Debian/Ubuntu 可安装 iptables-persistent 并保存;ipset 可通过 ipset save > /etc/ipset.rules 配合开机自启脚本恢复。
Q3:Nginx 黑白名单可以同时用吗?
A:可以。在 server 块先 include 白名单文件(里面用 allow 指令),再 include 黑名单文件(deny),达到白名单优先,不在白名单的即被拒绝。
Q4:脚本需要考虑性能影响吗?
A:如果 IP 列表不超过几百个,直接用循环命令即可。若管理上万 IP,强烈推荐 ipset 或 nftables,Nginx 侧则考虑用 geo 模块或动态模块。
小结
批量管理服务器访问黑白名单并不复杂,核心思路是把 IP 列表存为文件,用循环脚本配合相应工具添加规则。
本文给出了 iptables + ipset 和 Nginx 两种典型方案,实际使用时根据你的服务器角色选择即可。
如果在实际操作中遇到报错或策略不生效,先回看避坑部分检查顺序和文件格式,很多时候都是小细节导致的。