服务器访问黑白名单批量管理脚本:从零开始自动化

核心答案:批量管理访问黑白名单的自动化脚本怎么做?

服务器访问黑白名单批量管理脚本,就是通过一段可重复执行的脚本,一次性为防火墙(如 iptables)或 Web 服务器(如 Nginx)添加、删除或更新多个 IP 的放行或拒绝规则。
常见做法是将要管理的 IP 列表放入文本文件,再用脚本循环读取并执行对应命令。
本文会给出 iptables 和 Nginx 两种环境下的完整脚本示例,并说明 ipset 等优化方法,确保新增规则不影响现有连接,同时提供验证步骤和常见错误处理。

什么时候需要批量黑白名单脚本?

如果你遇到以下场景,手动一条条加规则既不现实也容易出错:

  • 攻防演练时需临时封禁大量境外或特定 IP 段;
  • 企业内网只允许指定办公出口 IP 访问管理端口;
  • CDN 回源 IP 列表经常更新,需要批量同步到源站 Nginx 白名单;
  • 从第三方威胁情报获取一批恶意 IP,需要快速统一封禁。

准备工作:确认环境与权限

  1. 登录服务器(建议用 root 或具有 sudo 权限的用户)。
  2. 确认已安装 iptables(大部分 Linux 发行版自带)或已配置 Nginx。
  3. 准备一份纯文本格式的 IP 列表文件,每行一个 IP(或 CIDR 网段),例如 /root/whitelist.txt
  4. 如果使用 ipset 优化,先安装 ipset 工具(apt install ipsetyum 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 的 denyallow 顺序也类似,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 两种典型方案,实际使用时根据你的服务器角色选择即可。
如果在实际操作中遇到报错或策略不生效,先回看避坑部分检查顺序和文件格式,很多时候都是小细节导致的。

分享到:
上一篇
Nginx反向代理配置多个独立外贸站点完整教程
下一篇
数据库误删数据从定时备份紧急恢复:数据库误删数据快速恢复
1
系统公告

机房迁移升级通知

尊敬的用户: IP 段 103.23.148.x、156.224.29.x 原香港一区线路波动、攻击频繁,平台定于 7 月 5 日凌晨分批迁移至香港 GIA 机房,硬件升级 AMD 铂金机型。 迁移均在凌晨操作,最大程度降低业务影响,迁移期间服务器临时关机; 升级后配置不降低、费用不涨价,数据默认同步迁移; 迁移后 IP 全部更换,请及时修改域名解析、防火墙白名单; 建议提前备份重要数据,有问题可联系在线客服。 感谢理解与支持! 泽御云科技 2026.06.30
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意