Тема
Войти Регистрация

Проверка подсети (CHECK-BLOCK)

GET https://api.abuseipdb.ru/api/v2/check-block — сводка по подсети в CIDR-нотации: параметры сети и список адресов внутри неё, на которые уже есть жалобы.

Раздел «API v2»: Обзор · Проверка IP (CHECK) · Жалобы по IP (REPORTS) · Отправить жалобу (REPORT) · Чёрный список (BLACKLIST) · Проверка подсети (CHECK-BLOCK) · Массовые жалобы (BULK-REPORT) · Удаление жалоб (CLEAR-ADDRESS) · Лимиты · Ошибки · Fail2Ban, CSF, Suricata · FAQ

Запрос

# -G превращает -d в query-параметры: CHECK-BLOCK — это GET-запрос.
curl -G https://api.abuseipdb.ru/api/v2/check-block \
  --data-urlencode "network=127.0.0.1/24" \
  -d maxAgeInDays=15 \
  -H "Key: YOUR_OWN_API_KEY" \
  -H "Accept: application/json"

Параметры

ПараметрОбязателенПо умолчаниюДопустимоОписание
networkда—IPv4 /16…/24, IPv6 /48…/64подсеть в CIDR-нотации; network содержит /, поэтому значение нужно URL-кодировать
maxAgeInDaysнет301…365учитывать только жалобы не старше N дней

Маска вне разрешённого диапазона — 422 с source.parameter=network. На abuseipdb.com превышение тарифа подсети отдаёт 402 Payment Required; в AbuseIPDB.RU такого кода нет: допустимые маски принимаются на любом тарифе, недопустимые — 422.

Ответ

{
  "data": {
    "networkAddress": "127.0.0.0",
    "netmask": "255.255.255.0",
    "minAddress": "127.0.0.1",
    "maxAddress": "127.0.0.254",
    "numPossibleHosts": 254,
    "addressSpaceDesc": "Loopback",
    "reportedAddress": [
      {
        "ipAddress": "127.0.0.1",
        "numReports": 631,
        "mostRecentReport": "2019-03-21T16:35:16+00:00",
        "abuseConfidenceScore": 0,
        "countryCode": null
      },
      {
        "ipAddress": "127.0.0.2",
        "numReports": 16,
        "mostRecentReport": "2019-03-12T20:31:17+00:00",
        "abuseConfidenceScore": 0,
        "countryCode": null
      }
    ]
  }
}

Расшифровка полей

ПолеТипЧто означает
networkAddressстрокаадрес сети (замаскированный): для 127.0.0.1/24 это 127.0.0.0
netmaskстрокамаска сети: для IPv4 — точечная (255.255.255.0), для IPv6 — сжатая шестнадцатеричная (ffff:ffff:ffff::)
minAddressстрокапервый используемый адрес диапазона. Для IPv4 это networkAddress + 1 (адрес сети не используется); для IPv6 — начальный адрес диапазона
maxAddressстрокапоследний используемый адрес. Для IPv4 — broadcast - 1 (broadcast не используется); для IPv6 — последний адрес диапазона
numPossibleHostsцелоечисло возможных хостов: для IPv4 2^(32-prefix) - 2, для IPv6 2^(128-prefix) без вычитания (broadcast в IPv6 нет)
addressSpaceDescстрокаописание адресного пространства по реестру IANA (см. список ниже); для обычных публичных сетей — Public (IPv4) или Global Unicast (IPv6)
reportedAddressмассивадреса внутри диапазона, на которые есть жалобы в окне maxAgeInDays; пустой массив, если жалоб нет

Поля элемента reportedAddress[]:

ПолеТипЧто означает
ipAddressстрокаадрес внутри подсети
numReportsцелоечисло жалоб на него внутри окна
mostRecentReportстрокавремя последней жалобы, ISO 8601 UTC
abuseConfidenceScoreцелое 0…100оценка адреса по локальной формуле
countryCodeстрока или nullкод страны; null, если геоданных нет (например, для приватных диапазонов)

reportedAddress сортируется по свежести последней жалобы (новые первыми) и ограничен 10 000 адресами; для /16 этого достаточно на практике, но если адресов больше — сужайте окно maxAgeInDays или проверяйте более мелкие подсети.

addressSpaceDesc: возможные значения

ЗначениеЧто означает
PublicIPv4: обычное публичное адресное пространство
Global UnicastIPv6: обычное глобальное адресное пространство
Private-Useприватные диапазоны: 10/8, 172.16/12, 192.168/16
Loopbackпетлевые адреса 127/8 и ::1
Link Locallink-local: 169.254/16, fe80::/10
Shared Address Space100.64/10 (CGNAT)
This Network0.0.0.0/8
Multicastmulticast: 224/4, ff00::/8
Reservedзарезервированные диапазоны 240/4
Documentation (TEST-NET-1/2/3)документационные сети 192.0.2/24, 198.51.100/24, 203.0.113/24
Benchmarking198.18/15, 2001:2::/48
IETF Protocol Assignments192.0.0/24
IPv4-Mapped, IPv4-IPv6 Translation::ffff:0:0/96, 64:ff9b::/96
Unique Localfc00::/7
Teredo, 6to42001::/32, 2002::/16
Discard-Only100::/64
Unspecified::/128
Limited Broadcast255.255.255.255/32
6to4 Relay Anycast192.88.99/24

Арифметика масок

  • IPv4: маски от /16 до /24. /24 — это 254 хоста, типичная сеть провайдера или офиса; /20 — крупная сеть; /16 — очень крупный блок (65 534 хоста), такой запрос самый дорогой.
  • IPv6: маски от /48 до /64. /64 — стандартная подсеть, /48 — типичный блок организации.
  • Адрес сети и broadcast (IPv4) в minAddress/maxAddress не включаются, в numPossibleHosts не считаются.
  • Маска 0 или адрес без / — 422.

Когда использовать CHECK-BLOCK

ЗадачаКак
Проверить, не заражена ли вся подсеть клиента/24 с maxAgeInDays=30
Оценить, откуда идут атаки в диапазоне/20…/16, затем детально проверить найденные адреса через CHECK
Построить отчёт по ASN/провайдерунесколько сетей провайдера отдельными запросами
Проверить IPv6-подсеть/64, при необходимости /48

Примеры

Python — пройти по подсети и найти худшие адреса:

import requests

API_KEY = "YOUR_OWN_API_KEY"
BASE = "https://api.abuseipdb.ru/api/v2"

def check_block(network: str, max_age_days: int = 30) -> dict:
    response = requests.get(
        f"{BASE}/check-block",
        params={"network": network, "maxAgeInDays": max_age_days},
        headers={"Key": API_KEY, "Accept": "application/json"},
        timeout=60,
    )
    response.raise_for_status()
    return response.json()["data"]

data = check_block("203.0.113.0/24")
print(f"{data['networkAddress']}/{data['netmask']}: {data['addressSpaceDesc']}")
for row in sorted(data["reportedAddress"], key=lambda item: item["abuseConfidenceScore"], reverse=True)[:10]:
    print(row["ipAddress"], row["abuseConfidenceScore"], row["numReports"])

PHP:

<?php
$query = http_build_query(['network' => '203.0.113.0/24', 'maxAgeInDays' => 30]);
$ch = curl_init('https://api.abuseipdb.ru/api/v2/check-block?' . $query);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Key: ' . getenv('ABUSEIPDB_KEY'), 'Accept: application/json'],
    CURLOPT_TIMEOUT => 60,
]);
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
curl_close($ch);
if ($status !== 200) {
    throw new RuntimeException("API v2 HTTP $status: $body");
}
$data = json_decode($body, true)['data'];
foreach ($data['reportedAddress'] as $row) {
    printf("%s: %d%% (жалоб: %d)\n", $row['ipAddress'], $row['abuseConfidenceScore'], $row['numReports']);
}

Ошибки CHECK-BLOCK

КодПричинаsource.parameter
401ключ отсутствует/неверен/отозван—
422не указан networknetwork
422network не CIDR, маска вне /16…/24 (v4) или /48…/64 (v6)network
422maxAgeInDays вне 1…365maxAgeInDays
429дневной лимит—

Дальше: Массовые жалобы (BULK-REPORT) и Обработка ошибок.

Версия 2.2.0 · AbuseIPDB.RU · webmaster@abuseipdb.ru · source: docs/ABUSE-API-check-block.md