Проверка подсети (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 | нет | 30 | 1…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: возможные значения
| Значение | Что означает |
|---|---|
Public | IPv4: обычное публичное адресное пространство |
Global Unicast | IPv6: обычное глобальное адресное пространство |
Private-Use | приватные диапазоны: 10/8, 172.16/12, 192.168/16 |
Loopback | петлевые адреса 127/8 и ::1 |
Link Local | link-local: 169.254/16, fe80::/10 |
Shared Address Space | 100.64/10 (CGNAT) |
This Network | 0.0.0.0/8 |
Multicast | multicast: 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 |
Benchmarking | 198.18/15, 2001:2::/48 |
IETF Protocol Assignments | 192.0.0/24 |
IPv4-Mapped, IPv4-IPv6 Translation | ::ffff:0:0/96, 64:ff9b::/96 |
Unique Local | fc00::/7 |
Teredo, 6to4 | 2001::/32, 2002::/16 |
Discard-Only | 100::/64 |
Unspecified | ::/128 |
Limited Broadcast | 255.255.255.255/32 |
6to4 Relay Anycast | 192.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 | не указан network | network |
422 | network не CIDR, маска вне /16…/24 (v4) или /48…/64 (v6) | network |
422 | maxAgeInDays вне 1…365 | maxAgeInDays |
429 | дневной лимит | — |
Дальше: Массовые жалобы (BULK-REPORT) и Обработка ошибок.
Версия 2.2.0 · AbuseIPDB.RU · webmaster@abuseipdb.ru · source: docs/ABUSE-API-check-block.md