Моніторинг чорних списків: скрипти, API та сповіщення через вебхуки
Моніторинг чорних списків — це регулярні за розкладом запити до кількох DNS-списків блокування (DNSBL) щодо ваших IP-адрес і доменів відправника зі сповіщенням лише тоді, коли результат змінюється. Якщо помітити запис у списку одразу, а не тоді, коли клієнти скаржаться на повернені листи, у вас буде час знайти причину й подати запит на видалення, перш ніж шкода пошириться.
Практичних способів два: самому запускати невеликий скрипт на dig і cron або передати перевірки сервісу через API та вебхуки. У будь-якому разі дві деталі визначають, чи казатиме монітор правду: запити, надіслані через публічні резолвери, такі списки, як Spamhaus, відхиляють, і відповіді вводять в оману, а коди помилок ніколи не можна вважати записами в списку.
Наведені тут правила операторів списків ґрунтуються на їхніх офіційних сторінках станом на листопад 2026 року. Правила змінюються, тому перевірте їх, перш ніж покладатися на своє налаштування. Основи роботи DNSBL див. у статті що таке DNSBL (RBL).
Визначте, за чим стежити і які списки запитувати
Почніть із того, що запишіть об’єкти, за якими вам справді потрібно стежити.
- IP-адреси відправника. Це адреси, з яких насправді надсилає пошту ваш поштовий сервер або поштовий провайдер. Сайт і пошта часто виходять з різних машин, тож перевірте адресу в заголовках Received надісланого вами листа. Якщо ви надсилаєте пошту через IPv6, стежте й за цими адресами.
- Домени. Домен в адресі From і будь-які домени, що трапляються в посиланнях у ваших листах. Домени перевіряють за доменними списками блокування, які існують окремо від списків IP.
Формат запиту визначено в RFC 5782. Для IPv4 октети записують у зворотному порядку й додають зону списку, тож 192.0.2.99 у списку перетворюється на 99.2.0.192, за яким іде ім’я зони. Для IPv6 адресу записують як 32 шістнадцяткові nibble у зворотному порядку. Домен просто ставлять перед зоною. Для внесеного до списку елемента повертається запис A, за домовленістю з діапазону 127.0.0.0/8; для відсутнього — NXDOMAIN. RFC також зазначає, що списки мають публікувати запис TXT із поясненням причини внесення.
Стежте за кількома списками, а не за одним, бо одержувачі використовують не однакові. Значення кожного коду відповіді залежить від оператора; поширені коди описано в нашому посібнику про коди відповідей DNSBL.
Чому публічні резолвери дають неправильні відповіді
Поширена помилка саморобного моніторингу — надсилати запити через публічний резолвер, як-от Google Public DNS (8.8.8.8) або Cloudflare (1.1.1.1). Офіційний FAQ Spamhaus щодо використання DNSBL пояснює, що відбувається:
- Безкоштовне використання DNSBL Spamhaus вимагає, щоб використання було некомерційним і щоб запити не надходили з публічного чи відкритого резолвера або з IP-адреси з типовим (generic) зворотним DNS.
- Через безкоштовні відкриті резолвери, як-от Google Public DNS, запити в більшості випадків отримують відповідь «немає в списку» (NXDOMAIN). Інакше кажучи, IP-адреса зі списку може виглядати чистою.
- Запити через публічний резолвер можуть також отримати 127.255.255.254. Це код помилки, а не запис у списку. Так само 127.255.255.252 означає помилку в імені DNSBL, а 127.255.255.255 — надмірну кількість запитів. Spamhaus наголошує, що ці коди не можна вважати ознакою того, що запитаний об’єкт є в списку.
- Резолвери, які переписують відповіді NXDOMAIN, повертають замість цього IP-адресу, тож правильного NXDOMAIN ви не побачите ніколи.
Головна рекомендація FAQ — використовувати власний DNS-резолвер. Тим, хто змушений залишатися на публічному резолвері, Spamhaus пропонує свій Data Query Service (DQS); що в ньому безкоштовне, дивіться в його умовах. Щоб побачити, яким резолвером ви насправді користуєтеся, FAQ пропонує команду dig txt whoami.fastly.net.
RFC 5782 передбачає вбудовану перевірку справності: список IPv4 повинен містити запис для 127.0.0.2 і не повинен містити 127.0.0.1, а клієнтам слід періодично перевіряти ці тестові записи, щоб переконатися, що список працює. У прикладі Spamhaus 2.0.0.127.zen.spamhaus.org повертає 127.0.0.10, 127.0.0.4 і 127.0.0.2, а 1.0.0.127.zen.spamhaus.org — NXDOMAIN. Монітор має спершу перевіряти це й відкидати запуск, якщо перевірка не пройшла.
Варіант 1: скрипт на dig і cron
Ось мінімальний скрипт, який перевіряє одну адресу IPv4 за Spamhaus ZEN і SpamCop (bl.spamcop.net; за документацією SpamCop, для IP-адреси зі списку він відповідає 127.0.0.2). Замініть адресу та зони на власні.
#!/bin/sh
# Надсилайте запити до власного рекурсивного резолвера (наприклад, unbound на тому самому хості), ніколи не до публічного
RESOLVER=127.0.0.1
IP=192.0.2.10
ZONES="zen.spamhaus.org bl.spamcop.net"
REV=$(echo "$IP" | awk -F. '{print $4"."$3"."$2"."$1}')
q() {
out=$(dig +time=3 +tries=1 @"$RESOLVER" "$1" A) || { echo ERR; return; }
case "$out" in
*"status: NOERROR"*) a=$(printf '%s\n' "$out" | awk '$4=="A"{print $5}'); echo "${a:-NX}" ;;
*"status: NXDOMAIN"*) echo NX ;;
*) echo ERR ;;
esac
}
for Z in $ZONES; do
# Якщо тестовий запис 127.0.0.2 не повертає код внесення до списку, цьому запуску не довіряйте
case "$(q "2.0.0.127.$Z")" in
127.255.255.*|NX|ERR) echo "$Z ERROR test-entry"; continue ;;
127.*) ;;
*) echo "$Z ERROR test-entry"; continue ;;
esac
A=$(q "$REV.$Z")
case "$A" in
NX) echo "$Z CLEAN" ;;
ERR) echo "$Z ERROR no-answer" ;;
127.255.255.*) echo "$Z ERROR $A" ;;
127.*) echo "$Z LISTED $A" ;;
*) echo "$Z ERROR unexpected $A" ;;
esac
doneЩо робить скрипт:
- Чистим вважається лише статус NXDOMAIN, 127.255.255.x — помилка, а будь-яке інше 127.x — запис у списку. Усе, що поза 127.0.0.0/8, вважається аномалією, наприклад ознакою резолвера, який переписує відповіді.
- Через тайм-аут dig завершується з ненульовим кодом, а за SERVFAIL і REFUSED — з кодом 0. Жоден із цих випадків не вважається чистим; скрипт фіксує помилку.
- Коди відповідей залежать від списку. Деякі списки, наприклад, використовують 127.0.0.1 на позначення відхиленого запиту, тож читайте документацію кожного списку, який додаєте, і за потреби розширюйте конструкцію case.
Далі нехай cron порівнює кожен запуск із попереднім і надсилає лист лише тоді, коли щось змінилося:
# Приклад: запуск щогодини, лист надсилається лише тоді, коли вивід відрізняється від попереднього запуску
0 * * * * /usr/local/bin/dnsbl-watch.sh > /var/tmp/dnsbl.now 2>&1; cmp -s /var/tmp/dnsbl.now /var/tmp/dnsbl.prev || mail -s "DNSBL status changed" you@example.com < /var/tmp/dnsbl.now; mv /var/tmp/dnsbl.now /var/tmp/dnsbl.prevІнтервал в одну годину — лише приклад. Spamhaus надає безкоштовний доступ для некомерційного використання з невеликим обсягом запитів, а клієнтам, що перевищують його поріг обсягу запитів, потрібен платний варіант; зі зростанням кількості IP-адрес під моніторингом перевіряйте умови кожного списку. FAQ також радить виконати команди кілька разів, щоб переконатися, що результати не змінюються.
Варіант 2: пакетний API DNSBL Checker і вебхуки
Якщо ви не хочете підтримувати резолвер і правила розбору для кожного списку, перевірки можна доручити сервісу. Нижче описано API v1 цього сайту — лише те, що справді робить серверна реалізація. Довідка розміщена за адресою /en/api-docs, а ключі видаються на сторінці учасника /account. Для реєстрації потрібна лише адреса електронної пошти, а вхід виконується за посиланням, надісланим поштою.
Автентифікація та ліміти
- Ключі починаються з
dnsbl_і показуються один раз, одразу після видачі; зберігається лише хеш. Повторна видача ключа робить попередній недійсним. - Передавайте ключ у заголовку
X-API-Keyу кожному запиті. Лише HTTPS; запити через звичайний http:// перенаправляються на https://, тож звертайтеся через https:// від початку. - Ліміти: 1 000 перевірок на день (одна ціль рахується як одна), 100 цілей у пакеті та 50 зареєстрованих моніторів. У разі перевищення денного ліміту ви отримаєте
429зdaily_limit_exceededі позначкою часуresets_at.
Пакетні перевірки
Надішліть масив targets з доменними іменами або IP-адресами на POST /api/v1/batch:
curl -X POST https://dnsblchecker.com/api/v1/batch \
-H "X-API-Key: $DNSBL_API_KEY" -H "Content-Type: application/json" \
-d '{"targets":["example.com"]}'Якщо якусь ціль ще треба перевірити, відповідь буде 202 з batch_id. Опитуйте GET /api/v1/batch/{batch_id} кожні кілька секунд, доки status не стане done (скорочений приклад; числа й назва списку наведені для ілюстрації, це не справжній результат):
{
"batch_id": 1, "status": "done", "created": "2026-11-03 09:10:41", "count": 1, "pending": 0,
"results": [
{
"target": "example.com", "type": "domain",
"status": "done", "verdict": "listed",
"checked_at": "2026-11-03 09:12",
"lists_checked": 80, "listed_count": 1, "error_count": 4,
"listed_on": [
{ "list": "ZapBL RHSBL", "zone": "rhsbl.zapbl.net", "response": "127.0.0.2" }
]
}
]
}verdictмає значенняlisted, якщо принаймні один список повідомляє про внесення, інакше —clean. Списки, що не відповіли вчасно або повернули код помилки, як-от 127.255.255.x, враховуються вerror_countі ніколи не вважаються записами в списку.- Пакет повертає збережений результат, якщо такий є за останні 30 днів. Для моніторингу за розкладом завжди дивіться на
checked_at. - Цілі в неправильному форматі повертаються в
rejectedіз зазначенням причини й не враховуються. Якщо передати URL, використовується лише ім’я хоста. Діапазони, призначені лише для документації, як-от 192.0.2.0/24, відхиляються, тож тестуйте зі справжньою IP-адресою відправника.
Моніторинг через вебхуки
Зареєструйте target і callback_url через POST /api/v1/monitors. Після цього кожна зареєстрована ціль перевіряється раз на день без використання кешу (перша перевірка відбувається приблизно протягом доби після реєстрації), а JSON-запит POST надсилається на ваш URL лише під час першої перевірки (monitor.initial) і коли вердикт змінюється між listed і clean (monitor.status_changed).
curl -X POST https://dnsblchecker.com/api/v1/monitors \
-H "X-API-Key: $DNSBL_API_KEY" -H "Content-Type: application/json" \
-d '{"target":"example.com","callback_url":"https://your-app.example/hooks/dnsbl"}'signing_secretу відповіді показується лише один раз. Кожне надсилання містить заголовокX-DNSBL-Signature: sha256=...— HMAC-SHA256 від необробленого тіла запиту з цим секретом як ключем. Перевіряйте його на своєму боці.callback_urlмає використовувати https на порту 443 і вказувати на публічну IP-адресу; перенаправлення не виконуються, а тайм-аут становить 10 секунд, тож ставте важку обробку в чергу й відповідайте швидко.- Якщо ваш endpoint повертає будь-що, крім
2xx, або з’єднання не вдається, надсилання повторюється під час наступної щоденної перевірки. Причину показано в поліlast_delivery_errorуGET /api/v1/monitors, аDELETE /api/v1/monitors/{monitor_id}видаляє монітор.
import hmac, hashlib
expected = "sha256=" + hmac.new(secret.encode(), raw_body, hashlib.sha256).hexdigest()
ok = hmac.compare_digest(expected, request.headers.get("X-DNSBL-Signature", ""))Налаштування сповіщень: частота, кілька списків і хибні тривоги
Монітор корисний лише тоді, коли його сповіщення читають і через кілька місяців. Той, що спрацьовує постійно, швидко починають ігнорувати.
Частота
- Розділяйте, як часто ви надсилаєте запити і як часто сповіщаєте. Запитуйте за розкладом, але сповіщайте лише про зміну стану. Щоденне повідомлення «усе гаразд» ховає те єдине сповіщення, яке справді важливе.
- RFC 5782 каже, що TTL списку має відображати швидкість його змін і що списки джерел спаму можуть використовувати TTL у кілька хвилин. Обираючи інтервал, пам’ятайте, що деякі записи з’являються і зникають швидко.
- Надто часті запити можуть порушити умови використання списку або призвести до отримання 127.255.255.255 (надмірна кількість запитів) замість справжніх відповідей.
Кілька списків
- Зазначайте назву списку в кожному сповіщенні. Списки різняться тим, скільки одержувачів ними користується, тож можна сповіщати негайно про списки, найважливіші для ваших одержувачів, а решту збирати в зведення.
- Описаний вище вебхук спрацьовує лише тоді, коли вердикт змінюється між listed і clean. Якщо ціль уже в списку, а потім з’являється ще в одному списку, подія не надсилається. Щоб помітити такий випадок, стежте за
last_listed_countуGET /api/v1/monitorsабо запускайте пакет і читайтеlisted_on.
Хибні спрацювання та тимчасові відповіді
- Фіксуйте помилки окремо від записів у списках. Spamhaus застерігає операторів від відхилення чи фільтрування пошти за його кодами помилок; та сама логіка стосується й моніторингу. Тайм-аут або відповідь 127.255.255.x ніколи не мають запускати сповіщення про внесення до списку.
- Щоб не реагувати на один дивний результат, сповіщайте лише після двох однакових результатів поспіль або повторіть запит через кілька хвилин, перш ніж щось надсилати.
- Якщо помилки не зникають, підозрюйте зміну резолвера або зміни на боці списку й насамперед подивіться на результат перевірки тестового запису.
- Домашня IP-адреса в Spamhaus PBL — це запис за політикою, а не звинувачення: він означає, що з цієї адреси не слід надсилати пошту напряму. Для кожного списку окремо вирішіть, що вважати приводом для сповіщення (див. видалення зі Spamhaus).
Що робити, коли виявлено запис у списку
- Підтвердьте його. Перевірте на власній сторінці перевірки оператора й запишіть назву списку, час і вказану причину, якщо вона є.
- Спершу усуньте причину. Шукайте зламані акаунти, зловживання вебформами, заражені машини, погану гігієну списків розсилання та невідповідність зворотного DNS (PTR) чи імен HELO. Запит на видалення, поки причина залишається, зазвичай призводить до нового внесення.
- Дотримуйтеся процедури видалення відповідного списку. Рішення про видалення ухвалює оператор кожного списку, і подання запиту не гарантує, що запис знімуть. Якщо ви не керуєте IP-адресою, як на віртуальному хостингу, зверніться до хостинг-провайдера або ISP.
- Нехай монітор підтвердить результат. Одержувачі також застосовують власні фільтри, тож стежте за доставленням і після того, як вердикт знову стане clean.
Для разової перевірки IP-адреси чи домену скористайтеся сервісом перевірки чорних списків. Якщо пошук причини або робота із запитами вам не під силу, ви можете звернутися до нас по допомогу. Повний порядок діагностики, коли листи повертаються, див. у статті листи, заблоковані через чорні списки.
Ми рекомендуємо підрядників, які беруться за запити на видалення зі списків, консультації та поради (від JPY 50,000). Рішення про видалення ухвалює оператор кожного списку, тому гарантувати його неможливо.
Отримати допомогуЦей сайт може отримувати винагороду за рекомендацію від зазначених підрядників. About
Поширені запитання
Я перевірив через 8.8.8.8 і запису не знайшов. Мене немає в списках?
Не обов’язково. У FAQ Spamhaus сказано, що запити через безкоштовні відкриті резолвери, як-от Google Public DNS, у більшості випадків отримують відповідь «немає в списку» (NXDOMAIN), тож IP-адреса зі списку може виглядати чистою. Надсилайте запити з власного резолвера або скористайтеся сторінкою перевірки оператора.
Я отримав 127.255.255.254. Це означає, що я в списку?
Ні. Це код помилки, який повертається на запити через публічний або відкритий резолвер, і Spamhaus наголошує, що він не означає наявності об’єкта в списку. Зафіксуйте його як помилку й не надсилайте сповіщення про внесення.
Чи можна просто щодня викликати пакетний API як монітор?
Пакет може повернути збережений результат давністю до 30 днів, тож це не завжди сьогоднішній стан. Перевіряйте checked_at або скористайтеся моніторингом через вебхуки (POST /api/v1/monitors), який щодня виконує нову перевірку.
Чи варто подавати запит на видалення, щойно спрацювало сповіщення?
Спершу усуньте причину. Запит, поданий, поки проблема залишається, зазвичай закінчується новим внесенням. Рішення завжди за оператором списку.
Використані офіційні сторінки
Факти в цій статті на момент публікації звірено з наведеними нижче офіційними сторінками. Правила й поведінка сервісів можуть змінюватися без попередження, тож перш ніж покладатися на щось важливе, перевірте офіційні сторінки.
- RFC 5782: DNS Blacklists and Whitelists
- Spamhaus FAQ: DNSBL Usage
- Spamhaus: Using our public mirrors? Check your return codes now
- SpamCop FAQ: How do I configure my mailserver to reject mail based on the blocklist?
Схожі посібники
Як читати коди відповідей DNSBL: що означає 127.0.0.2 за RFC 5782, коди Spamhaus, SpamCop і UCEPROTECT, коди помилок, різниця між NXDOMAIN і SERVFAIL.
Потрапили до Spamhaus? З’ясуйте, у якому ви списку (ZEN, PBL, XBL, CSS, SBL, DBL), що означають коди відповіді та як вийти з кожного списку.
Листи блокує чорний список? Прочитайте код повернення, перевірте причини по черзі, з’ясуйте, які списки важливі, і правильно подайте запит на видалення.