脚本怎样批量管理IP黑名单

wen 实用脚本 30

脚本怎样批量管理IP黑名单:从手动封禁到自动化运维的完整指南

目录导读

脚本怎样批量管理IP黑名单

  • 为什么需要批量管理IP黑名单?
  • 核心原理:脚本与黑名单数据库的协同机制
  • 实战脚本方案:Shell、Python、自动化工具对比
  • 集成防火墙与CDN:Nginx、iptables、Cloudflare联动
  • 问答环节:常见脚本错误与性能陷阱
  • 扩展应用:基于日志分析的动态黑名单生成
  • 最佳实践:从10个IP到10万级黑名单的优化策略

为什么需要批量管理IP黑名单?

对于运行Web服务的运维人员来说,IP黑名单是抵御恶意爬虫、暴力破解、CC攻击的第一道防线,手动封禁单个IP效率低下,当IP量级突破1000个后,手动操作几乎不可行。脚本化批量管理能实现以下目标:

  • 自动化读取攻击IP列表,批量写入防火墙规则
  • 定时刷新黑名单,防止误封恢复或新增攻击源
  • 统一管理多台服务器(负载均衡、CDN、云端节点)

核心痛点:不同环境(Linux/Windows、云原生/物理机)的黑名单管理接口差异大,如何用一套脚本覆盖90%场景?


核心原理:脚本与黑名单数据库的协同机制

批量管理IP黑名单的典型流程是:

  1. 数据源:从日志(Nginx access log、Fail2ban、WAF日志)或第三方威胁情报API提取恶意IP
  2. 脚本引擎:Shell(简单快速)、Python(复杂逻辑与API调用)、Ansible(多机分发)
  3. 执行接口:防火墙(iptables/nftables)、服务配置(Nginx deny、Apache .htaccess)、云厂商API(安全组、ACL)

关键数据格式

  • 纯IP列表(每行一个IP)
  • CIDR子网(如192.168.1.0/24)
  • JSON结构(含时间戳、来源、封禁原因)

实战脚本方案:Shell、Python、自动化工具对比

方案1:Shell脚本 + iptables(适合单机快速封禁)

#!/bin/bash  
BLACKLIST_FILE="/path/to/blacklist.txt"  
# 读取每行IP,添加至iptables黑名单链  
while IFS= read -r ip; do  
    if [[ $ip =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then  
        iptables -A INPUT -s "$ip" -j DROP  
    fi  
done < "$BLACKLIST_FILE"  

优点:无需依赖,执行快
缺点:单机态,不支持云安全组,重启规则丢失

方案2:Python脚本支持多平台(重点推荐)

import subprocess  
import re  
def ban_ip(ip):  
    # 支持iptables、云API、Nginx配置  
    subprocess.run(["iptables", "-A", "INPUT", "-s", ip, "-j", "DROP"])  
    # 兼容Cloudflare API(需配置Token)  
    # requests.post("https://api.cloudflare.com/client/v4/zones/{zone_id}/firewall/access_rules/rules")  

优势:可集成日志分析,动态生成黑名单,支持IO复用

方案3:Ansible批量分发(多服务器场景)

- name: 批量添加IP至iptables  
  hosts: all  
  tasks:  
    - name: 读取本地黑名单文件  
      set_fact:  
        ban_ips: "{{ lookup('file', '/etc/blacklist.txt').split('\n') }}"  
    - name: 添加防火墙规则  
      iptables:  
        chain: INPUT  
        source: "{{ item }}"  
        jump: DROP  
      loop: "{{ ban_ips }}"  

集成防火墙与CDN:Nginx、iptables、Cloudflare联动

单一黑名单管理工具不够——攻击往往来自全球,需要多层防御:

  • Nginx黑名单:在http/server块加入

    include /etc/nginx/blacklist.conf;  # 内容:deny 192.168.1.1; deny 10.0.0.0/24;  

    脚本定期通过sedawk更新.conf文件,然后nginx -s reload

  • Cloudflare防火墙规则:利用API批量创建IP规则,覆盖DDoS和爬虫

    import requests  
    url = "https://api.cloudflare.com/client/v4/zones/{zone_id}/firewall/access_rules/rules"  
    payload = {  
        "mode": "block",  
        "configuration": {"target": "ip", "value": "1.2.3.4"},  
        "notes": "manual block via script"  
    }  

问答环节:常见脚本错误与性能陷阱

Q1:脚本运行后,新加入的黑名单IP未被封禁?
A:检查两点:

  • 脚本是否成功写入防火墙规则(iptables -L INPUT -n | grep <IP>
  • 云安全组是否覆盖了最新规则(云API需要确认apply操作)

Q2:黑名单文件太大(超过1万条),脚本卡死怎么办?
A:采用分批策略:每500个IP为一组,用xargs -P并发执行;或者用iptablesipset(内存哈希表,性能提升100倍):

ipset create blacklist hash:ip maxelem 100000  
ipset add blacklist 1.1.1.1  
iptables -A INPUT -m set --match-set blacklist src -j DROP  

Q3:如何避免误封白名单IP(如搜索引擎爬虫)?
A:脚本中集成白名单过滤:

whitelist = ['66.249.66.1', '5.9.98.0/24']  # Googlebot  
if ip not in whitelist:  
    ban_ip(ip)  

扩展应用:基于日志分析的动态黑名单生成

被动封禁IP是落后策略——主动分析日志流量,实时生成黑名单才是高级运维:

  • 工具组合tail -f access.log | awk '{print $1}' | sort | uniq -c | sort -rn 统计高频IP
  • 阈值触发:如果某IP在10分钟内请求超过200次,自动加入黑名单
  • 示例脚本
    # 日志分析+自动封禁(每5分钟运行)  
    awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -50 | awk '$1>500 {print $2}' > /tmp/black.tmp  
    cat /tmp/black.tmp >> /etc/blacklist.txt  

最佳实践:从10个IP到10万级黑名单的优化策略

  1. 结构优化:将黑名单拆分为“临时封禁”(24h自动过期)和“永久封禁”
  2. 存储迁移:从文本文件改为Redis Sorted Set(支持TTL和IP去重)
  3. 定时任务:每15分钟用crontab执行脚本,并记录日志以便回溯
  4. 灰度机制:先通知封禁(如Nginx返回403),确认无误后再硬性阻断
  5. 备份与回滚:每次修改前备份当前iptables规则:iptables-save > /backup/rules.$(date +%Y%m%d%H%M%S)

批量管理IP黑名单的核心不是“写脚本”,而是建立数据获取-规则校验-执行封禁-监控反馈的闭环,从单机Shell到分布式安全组,脚本只是导管,真正的价值在于自动化编排与安全策略的实时对齐。

抱歉,评论功能暂时关闭!