Налаштування моніторингу DNS (зміни, TTL, DNSSEC)
DNS-моніторинг часто игнорується — і напрасно. Неавторизоване змінення DNS-запису, закінчення домену або поломка DNSSEC можуть зробити сайт недоступним так само ефективно, як падіння сервера. При цьому DNS-проблеми часто не видні в серверному моніторингу.
Що моніторити в DNS
A/AAAA записи. Неочікувана зміна IP вказує на: DNS hijacking, помилкову зміну в панелі, атаку на акаунт реєстратора.
MX записи. Зміна MX — можлива атака з метою перехоплення пошти.
NS записи. Зміна NS-серверів — серйозна ознака компрометації.
TTL. Аномально низький TTL (< 60 секунд) може вказувати на підготовку до зміни запису.
DNSSEC. Broken DNSSEC signature = повна недоступність домену для resolver'ів з DNSSEC validation.
Строк закінчення домену. Закінчений домен — втрата всієї DNS-конфігурації.
Моніторинг змін записів
import dns.resolver
import dns.dnssec
import hashlib
import json
from datetime import datetime
def get_dns_records(domain: str, record_types: list = None) -> dict:
if record_types is None:
record_types = ['A', 'AAAA', 'MX', 'NS', 'TXT', 'CNAME']
records = {}
resolver = dns.resolver.Resolver()
resolver.nameservers = ['8.8.8.8', '1.1.1.1'] # Перевіряти через різні resolver'и
for rtype in record_types:
try:
answers = resolver.resolve(domain, rtype)
records[rtype] = sorted([str(r) for r in answers])
except (dns.resolver.NXDOMAIN, dns.resolver.NoAnswer):
records[rtype] = []
except Exception as e:
records[rtype] = [f'ERROR: {e}']
return records
def check_dns_changes(domain: str, stored_snapshot: dict) -> list:
current = get_dns_records(domain)
changes = []
for rtype, current_values in current.items():
stored_values = stored_snapshot.get(rtype, [])
if set(current_values) != set(stored_values):
changes.append({
'record_type': rtype,
'previous': stored_values,
'current': current_values,
'detected_at': datetime.utcnow().isoformat()
})
return changes
Запускати кожні 5-15 хвилин. При виявленні змін — негайний алерт.
Моніторинг через кілька resolver'ів
DNS-отруєння або неправильна зона може розповсюджуватися нерівномірно. Перевіряти через:
- Google (8.8.8.8)
- Cloudflare (1.1.1.1)
- OpenDNS (208.67.222.222)
- Регіональні resolver'и (для uk-домену — важливо)
Якщо результати різні у різних resolver'ів — ознака DNS hijacking або проблем з propagation.
Prometheus Blackbox Exporter для DNS
# blackbox.yml
modules:
dns_check:
prober: dns
timeout: 5s
dns:
query_name: "example.com"
query_type: "A"
valid_rcodes:
- NOERROR
validate_answer_rrs:
fail_if_not_matches_regexp:
- "example.com.\t.*\tIN\tA\t1.2.3.4"
# Алерт: DNS не повертає очікуваний IP
- alert: DNSRecordChanged
expr: probe_success{job="dns_check"} == 0
for: 2m
labels:
severity: critical
annotations:
summary: "DNS check failed for {{ $labels.instance }}"
DNSSEC валідація
def check_dnssec(domain: str) -> dict:
resolver = dns.resolver.Resolver()
resolver.use_dnssec = True
resolver.nameservers = ['8.8.8.8']
try:
# Запит з DO bit (DNSSEC OK)
answers = resolver.resolve(domain, 'A', raise_on_no_answer=False)
# Перевірити наявність RRSIG
try:
rrsig = resolver.resolve(domain, 'RRSIG')
has_rrsig = len(rrsig) > 0
except:
has_rrsig = False
return {
'dnssec_valid': True,
'has_rrsig': has_rrsig,
'domain': domain
}
except dns.dnssec.ValidationFailure as e:
return {
'dnssec_valid': False,
'error': str(e),
'domain': domain
}
Інструмент для ручної перевірки: dig +dnssec example.com або https://dnsviz.net/.
Моніторинг строку закінчення домену
import whois
def get_domain_expiry(domain: str) -> int:
"""Повертає кількість днів до закінчення"""
w = whois.whois(domain)
expiry = w.expiration_date
if isinstance(expiry, list):
expiry = expiry[0]
days = (expiry.replace(tzinfo=None) - datetime.now()).days
return days
# Алерт при < 30 днів до закінчення
WHOIS не завжди надійний — деякі реєстратори приховують дату. Альтернатива: моніторинг через Domainr API або сповіщення реєстратора.
Інструменти
- DNSCheck.tools — веб-інтерфейс для ручної перевірки
- Pingdom — включає DNS моніторинг в базовий план
- Zabbix з DNS-шаблонами — для on-premise моніторингу
- AWS Route 53 Health Checks — моніторинг власних DNS-записів
Строки налаштування
- Скрипт моніторингу змін + cron — 1-2 дня
- Blackbox Exporter + Prometheus алерти — 1 день
- DNSSEC валідація — 0.5 дня
- Моніторинг закінчення домену — 0.5 дня







