Настройка 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-адресами по заданным доменам и избежать типичных проблем.