文档首页/ 云防火墙 CFW/ 最佳实践/ 自动导入基于威胁情报源的IP黑名单
更新时间:2026-07-03 GMT+08:00
分享

自动导入基于威胁情报源的IP黑名单

应用场景

在企业网络安全防护中,及时阻断来自已知恶意源、僵尸网络、攻击者的IP访问是构建纵深防御体系的重要环节。传统的人工维护IP黑名单方式存在以下痛点:

  • 威胁情报更新频繁,人工维护成本高且易遗漏;
  • 开源威胁情报源分散,难以统一管理和导入;
  • 海量IP数据手动导入防火墙处理速度较慢;
  • 缺乏自动化机制,无法实现实时或周期性防护更新。

云防火墙提供了一键式流量封堵功能,您只需将恶意IP地址整理后上传至防火墙,则可实现对所有恶意访问的拦截,显著提升拦截效率。

本文介绍如何通过调用云防火墙的“导入IP黑名单用于流量过滤”API接口导入IP黑名单,实现从威胁情报源自动获取恶意IP并批量导入云防火墙黑名单的场景化方案,帮助企业快速建立自动化的IP黑名单防护能力。

方案优势

  • 自动化程度高:可结合定时任务触发,无需人工干预即可定期更新黑名单。
  • 支持多情报源:可同时配置多个威胁情报URL,综合多个来源的IP数据。
  • 高效批量处理:流式逐行读取大文件,按批次导入,避免内存溢出和API超时。
  • 智能去重:全局去重机制,避免重复导入相同IP。
  • 灵活部署:代码可运行于任意支持Python的环境,如云服务器、容器或函数计算。

系统影响

  • 将IP地址添加到流量封堵列表后,访问该IP地址的流量以及从该IP地址发起的访问流量都将被直接拦截。
  • 配置流量封堵的IP地址时,如果涉及地址转换或者存在代理的场景,需要谨慎评估拦截IP的影响。

约束与限制

基础版不支持使用流量封堵功能。

前提条件

  • 已获取威胁情报IP列表的下载URL(可使用开源或商业情报源),并获取最新恶意IP列表。
  • 使用IAM用户操作时,已授予该IAM用户CFW FullAccess权限,详细操作请参见通过IAM授予使用CFW的权限

场景一:自动从开源威胁情报源导入IP黑名单

定期从威胁情报源(如Spamhaus、AbuseIPDB、USOM等)获取最新恶意IP列表,通过云防火墙API自动导入IP黑名单到流量封堵对象中,实现对已知恶意源的自动拦截。

操作步骤

  1. 已购买云防火墙,防火墙实例处于开启状态,且已开启流量封堵功能。
    1. 参见购买云防火墙选购标准版或专业版防火墙。
    2. 开启流量封堵。
      1. 云防火墙控制台的左侧导航栏中,选择访问控制 > 流量过滤,进入流量封堵页面。
      2. 单击按钮,并在弹出的确认框中,单击“确定”,开启流量封堵功能。
  2. 获取必要的认证和参数信息。
    • 访问密钥(AK/SK):获取方式请参见获取AK/SK
    • 项目ID(PROJECT_ID):
      1. 登录华为云控制台,鼠标移动至右上方的用户名,在下拉列表中选择“我的凭证”
      2. “API凭证”页面的“项目列表”中,获取“项目ID”
    • 防火墙实例ID(FW_INSTANCE_ID):
      1. 登录云防火墙控制台
      2. 单击管理控制台左上角的,选择区域。
      3. (可选)切换防火墙实例:如果有多个防火墙实例,可以在页面左上角的下拉框中进行切换。
      4. “总览”页面中,单击右上角的“防火墙列表”,并在弹出的防火墙列表页面中获取目标防火墙实例的实例ID。
  3. 使用自动导入基于威胁情报源的IP黑名单接口,批量导入IP黑名单。

    调用代码示例如下:

    # 依赖安装: pip install requests huaweicloudsdkcfw huaweicloudsdkcore
    import requests
    import re
    # 配置参数(AK/SK等信息建议通过环境变量读取)
    AK = "your-access-key"
    SK = "your-secret-key"
    PROJECT_ID = "your-project-id"
    FW_INSTANCE_ID = "your-fw-id"
    REGION = "cn-south-1"
    EFFECT_SCOPE = [1]              # 生效范围:[1]互联网边界, [2]VPC边界
    URL = "https://{your-threat-source}/blacklist.txt"   # 威胁情报URL
    BATCH_SIZE = 2000               # 每批导入的IP数量
    # 初始化认证和客户端
    credentials = BasicCredentials(AK, SK, PROJECT_ID)
    client = CfwClient.new_builder() \
        .with_credentials(credentials) \
        .with_region(CfwRegion.value_of(REGION)) \
        .build()
    def import_ip_batch(client, fw_instance_id, ip_set, effect_scope, add_type=0):
        """批量导入IP到CFW黑名单"""
        if not ip_set:
            return 0
        ip_list_str = "\n".join(ip_set)
        request = ImportIpBlacklistRequest()
        request.fw_instance_id = fw_instance_id
        body = ImportIpBlacklistRequestBody()
        body.add_type = add_type  # 0=增量导入, 1=全量覆盖
        body.ip_blacklist = ip_list_str
        body.effect_scope = effect_scope  # [1]互联网边界, [2]VPC边界, [1,2]同时生效
        request.body = body
        try:
            response = client.import_ip_blacklist(request)
            return len(ip_set)
        except exceptions.ClientRequestException as e:
            print(f"Error: status={e.status_code}, msg={e.error_msg}")
            return 0
    # 下载并提取IP
    batch_ips = set()
    all_unique_ips = set()
    IP_PATTERN = re.compile(
        r'\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}'
        r'(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(?:/(?:[12]?[0-9]|3[0-2]))?\b'
    )
    with requests.get(URL, timeout=60, stream=True) as response:
        response.raise_for_status()
        for line in response.iter_lines(decode_unicode=True):
            if not line:
                continue
            line = line.strip().lstrip('#')
            if not line:
                continue
            for ip in IP_PATTERN.findall(line):
                if ip not in all_unique_ips:
                    all_unique_ips.add(ip)
                    batch_ips.add(ip)
            if len(batch_ips) >= BATCH_SIZE:
                import_ip_batch(client, FW_INSTANCE_ID, batch_ips, EFFECT_SCOPE)
                batch_ips.clear()
    # 处理剩余IP
    if batch_ips:
        import_ip_batch(client, FW_INSTANCE_ID, batch_ips, EFFECT_SCOPE)
    print(f"Total imported: {len(all_unique_ips)} unique IPs")

操作验证

  1. 确认执行输出中导入的IP数量符合预期。
  2. 检查新增的IP黑名单条目是否添加成功。
    1. 登录云防火墙控制台
    2. 单击管理控制台左上角的,选择区域。
    3. (可选)切换防火墙实例:如果有多个防火墙实例,可以在页面左上角的下拉框中进行切换。
    4. 在左侧导航栏选择访问控制 > 流量过滤,进入流量封堵页面。
    5. 检查新增的黑名单信息是否添加成功。

场景二:通过API调用查询和管理黑名单

除导入黑名单外,还可通过云防火墙API实现流量封堵对象中的IP黑名单的查询、删除等管理操作。

API查询示例

以下示例展示如何调用云防火墙API查询当前IP黑名单列表:

from huaweicloudsdkcore.auth.credentials import BasicCredentials
from huaweicloudsdkcfw.v1.region.cfw_region import CfwRegion
from huaweicloudsdkcfw.v1 import *
from huaweicloudsdkcfw.v1.model import *

# 初始化认证和客户端
credentials = BasicCredentials(AK, SK, PROJECT_ID)
client = CfwClient.new_builder() \
    .with_credentials(credentials) \
    .with_region(CfwRegion.value_of(REGION)) \
    .build()

# 查询IP黑名单列表
request = ListIpBlacklistRequest()
request.fw_instance_id = FW_INSTANCE_ID
request.offset = 0
request.limit = 100

try:
    response = client.list_ip_blacklist(request)
    print(f"Total blacklisted IPs: {response.data.total}")
    for item in response.data.records:
        print(f"  IP: {item.ip}, Type: {item.type}, Created: {item.create_time}")
except Exception as e:
    print(f"Query failed: {str(e)}")

API调用关键接口说明

表1 API调用关键接口说明

接口名称

功能描述

请求方法

ImportIpBlacklist

批量导入IP黑名单

POST

ListIpBlacklist

查询IP黑名单列表

GET

DeleteIpBlacklist

删除IP黑名单条目

DELETE

相关文档