Настройка dnsdist для логирования DNS-ответов с IP-адресами доменов

    При использовании dnsdist в качестве DNS-сервера часто требуется логировать не только запросы, но и ответы с указанием IP-адресов для определённых доменов. Пользователи сталкиваются с ситуацией, когда сервер работает, логирование подключено, но в логах отсутствуют IP-адреса (например, отображается 127.0.0.1 вместо реального адреса). Разберём, как правильно настроить dnsdist для получения полной информации.

    Почему в логах dnsdist нет IP-адресов?

    По умолчанию dnsdist логирует только метаданные запроса, такие как query_name, query_type, return_code и latency. IP-адрес клиента (from_address) может быть заменён на 127.0.0.1, если сервер работает в режиме прокси или перенаправляет запросы через локальный интерфейс. Это частая ошибка при настройке логирования DNS.

    Как настроить dnsdist для логирования ответов с IP

    Чтобы логировать реальные IP-адреса в ответах на запросы к конкретным доменам, выполните следующие шаги:

    1. Включите расширенное логирование через Lua-скрипты

    В конфигурационном файле dnsdist (обычно /etc/dnsdist/dnsdist.conf) добавьте Lua-функцию для обработки ответов. Пример кода:

    function logResponse(dq)
        if dq.qname:equal("ya.ru.") then
            infolog("Response for " .. dq.qname:toString() .. " from " .. dq.remoteaddr:toString())
        end
        return DNSAction.None
    end
    addAction(AllRule(), LuaResponseAction(logResponse))
    

    Этот скрипт логирует IP-адрес клиента (remoteaddr) для домена ya.ru..

    2. Настройте формат логов для включения IP

    Используйте параметр setVerboseHealthChecks(true) и настройте setSyslogFacility() для более детального вывода. Убедитесь, что в логах присутствует поле from_address с реальным IP, а не 127.0.0.1.

    3. Проверьте сетевые настройки

    Если dnsdist слушает на 0.0.0.0 или 127.0.0.1, убедитесь, что запросы приходят напрямую, а не через локальный ресолвер. Укажите правильный интерфейс в параметре addLocal().

    Пример корректного лога с IP-адресом

    После настройки лог будет выглядеть так:

    2025-09-11 09:40:34,819 {"dns_message": "CLIENT_RESPONSE", "from_address": "192.168.1.100", "query_name": "ya.ru.", "return_code": "NOERROR", "bytes": 82}

    Вместо 127.0.0.1 будет указан реальный IP клиента, что позволяет сохранять список ip-домен для анализа.

    Сохранение списка IP-доменов в dnsdist

    Для автоматического сохранения соответствий IP-адресов и доменов используйте Lua-таблицу:

    local domainIPs = {}
    function trackDomainResponse(dq)
        local domain = dq.qname:toString()
        local ip = dq.remoteaddr:toString()
        if domainIPs[domain] == nil then
            domainIPs[domain] = ip
            infolog("New mapping: " .. domain .. " -> " .. ip)
        end
        return DNSAction.None
    end
    addAction(QTypeRule(DNSQType.A), LuaResponseAction(trackDomainResponse))
    

    Этот код логирует только A-запросы и сохраняет первое соответствие домена и IP.

    Частые ошибки при логировании DNS-ответов

    • Использование 127.0.0.1 в логах - проверьте, не перенаправляются ли запросы через локальный DNS-прокси.
    • Отсутствие поля from_address - включите детальное логирование через setVerboseHealthChecks().
    • Игнорирование типов запросов - логируйте только нужные типы (A, AAAA, CNAME) через QTypeRule.

    Следуя этим рекомендациям, вы сможете настроить dnsdist для эффективного логирования DNS-ответов с IP-адресами по заданным доменам и избежать типичных проблем.

    Часто задаваемые вопросы