Налаштування моніторингу DNS (зміни, TTL, DNSSEC)

Наша компанія займається розробкою, підтримкою та обслуговуванням сайтів будь-якої складності. Від простих односторінкових сайтів до масштабних кластерних систем, побудованих на мікро сервісах. Досвід розробників підтверджено сертифікатами від вендорів.

Розробка та обслуговування будь-яких видів сайтів:

Інформаційні сайти або веб-програми
Сайти візитки, landing page, корпоративні сайти, онлайн каталоги, квіз, промо-сайти, блоги, ресурси новин, інформаційні портали, форуми, агрегатори
Сайти або веб-програми електронної комерції
Інтернет-магазини, B2B-портали, маркетплейси, онлайн-обмінники, кешбек-сайти, біржі, дропшиппінг-платформи, парсери товарів
Веб-програми для управління бізнес-процесами
CRM-системи, ERP-системи, корпоративні портали, системи управління виробництвом, парсери інформації
Сайти або веб-програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, конструктори сайтів, портали надання електронних послуг, відеохостинги, тематичні портали

Це лише деякі з технічних типів сайтів, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Пропоновані послуги
Показано 1 з 1 послугУсі 2065 послуг
Налаштування моніторингу DNS (зміни, TTL, DNSSEC)
Середня
від 1 робочого дня до 3 робочих днів
Часті питання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1171
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    874
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1094
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    831
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851

Налаштування моніторингу 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 дня