Вопрос или проблема
Я пытаюсь настроить bind 9.11 (по умолчанию на CentOS 8) для журналирования запросов, на которые не было получено ответа, или для отображения клиентов, которые постоянно запрашивают сервер, но им это не разрешено.
В конечном итоге я хочу использовать этот журнал для передачи его в fail2ban и блокировки таких “идиотов”.
Сервер является основным NS и отвечает за запросы по доменам, которые он обрабатывает, но ничего более.
Сначала я пытался журналировать всё, как описано в https://kb.isc.org/docs/aa-01526, даже с полным уровнем отладки, но так и не нашёл ни одной строки в журнале, содержащей слово “отказано” или подобное, кроме случаев, когда кто-то запрашивал полные зоны (что, безусловно, разрешено только с вторичного NS), как здесь:
27-Авг-2020 11:40:47.317 клиент @0x7fd284052510 94.102.208.167#51041 (somedomain.com): передача зоны ‘somedomain.com/AXFR/IN’ запрещена
При запросе к серверу с именем, за которое он не отвечает, клиент получает:
dig @ns.mydomain.com www.disney.com Неавторитарный ответ: *** Не удается найти www.disney.com: Нет ответа
что правильно, но bind только записывает нечто подобное:
27-Авг-2020 11:43:27.741 запросы: информация: клиент @0x7fd2840bf440 1.2.3.4#34369 (www.disney.com): запрос: www.disney.com IN A + (x.x.x.x)
что не даёт мне никакой информации о том, какой ответ был отправлен клиенту.
Текущая конфигурация:
logging {
channel "my_queries" {
file "/var/log/named.queries" versions 600 size 20m;
print-time yes;
print-category yes;
print-severity yes;
severity dynamic;
};
channel "security_file" {
file "/var/log/named.security";
severity dynamic;
print-time yes;
};
category "queries" { "my_queries"; };
category client { "security_file"; };
category security { "security_file"; };
category lame-servers { null; };
};
Итак: как я могу создать записи в журнале для клиентов, которым изначально не разрешалось обращаться к серверу?
В моем случае я вижу :
27-Авг-2020 13:33:17.170 безопасность: информация: клиент @0x7f88b57bdf90 192.168.10.165#18237 (www.google.com): представление 192.168.10.0/24: запрос (кэш) 'www.google.com/AAAA/IN' запрещен
27-Авг-2020 13:33:17.170 ошибки-запроса: информация: клиент @0x7f88b57bdf90 192.168.10.165#18237 (www.google.com): представление 192.168.10.0/24: запрос не удался (ОТКАЗАНО) для www.google.com/IN/AAAA в ../../../bin/named/query.c:7144
Моя конфигурация (в /etc/bind/named.conf.options
) :
logging {
channel replace_syslog {
file "/var/log/bind/named.log" versions 5 size 2m;
severity info;
print-time yes;
print-category yes;
print-severity yes;
};
category default { replace_syslog; default_debug; default_syslog ; };
category lame-servers { null; };
channel query.log {
file "/var/log/bind/query.log" versions 2 size 2M;
severity debug 3;
print-time yes;
};
category queries { query.log; };
};
Ответ или решение
Для того чтобы включить логирование отклонённых запросов в BIND 9.11 на CentOS 8 и перенаправить эти данные в fail2ban для блокировки нежелательных запросов, необходимо внести изменения в конфигурацию BIND. Пожалуйста, следуйте следующим шагам:
-
Изменение конфигурации логирования BIND:
Вам необходимо настроить уровень логирования и категории, чтобы отслеживать отказанные запросы. Предлагаю следующую конфигурацию. Откройте файл конфигурации BIND, обычно это/etc/named.conf
, или, если у вас есть отдельный файл конфигурации, например/etc/bind/named.conf.options
, откройте его для редактирования.Добавьте или измените существующий раздел
logging
следующим образом:logging { channel "default_syslog" { file "/var/log/named/default.log"; severity info; print-time yes; print-category yes; print-severity yes; }; channel "security_file" { file "/var/log/named/security.log"; severity dynamic; print-time yes; }; channel "query_log" { file "/var/log/named/query.log"; // Лог для всех запросов severity debug 3; // Уровень отладки, можно настроить print-time yes; }; category default { default_syslog; }; category security { security_file; }; category queries { query_log; }; category query-errors { query_log; }; // Логирование ошибок запросов category lame-servers { null; }; // Отключаем логирование уязвимых серверов };
В этом конфигурационном блоке добавлена категория
query-errors
, која будет записывать ошибки в попытках запросов, упоминая, что клиент не был авторизован. Логи будут записываться в файл/var/log/named/query.log
. -
Настройка BIND для отклонения некорректных запросов:
Проверьте, чтобы ваши ACL (Access Control Lists) правильно регулировали, кто имеет право запрашивать данные. Убедитесь, что ваш разрешающий блок настроен так, чтобы отклонять запросы от нежелательных IP-адресов. Например:acl "trusted" { 192.168.0.0/24; // ваш локальный диапазон }; options { ... allow-query { trusted; }; // Разрешаем только доверенным клиентам ... };
-
Перезагрузка BIND:
После внесения изменений в конфигурацию, убедитесь, что вы перезапустили службу BIND для применения настроек:systemctl restart named
-
Настройка fail2ban:
Теперь вы можете настроить fail2ban для отслеживания и блокировки IP-адресов с неразрешёнными запросами. Создайте файл конфигурации для нового фильтра, например/etc/fail2ban/filter.d/bind.conf
:[Definition] failregex = .*query-errors: .*query failed \(REFUSED\) for <HOST>.*$ ignoreregex =
Затем создайте новую секцию в файле jail.local, например
/etc/fail2ban/jail.local
:[bind] enabled = true filter = bind action = iptables[name=bind, port=53, protocol=all] logpath = /var/log/named/query.log maxretry = 3 bantime = 3600
-
Перезапуск fail2ban:
После окончания конфигурации, перезапустите fail2ban:systemctl restart fail2ban
Теперь ваш сервер будет логировать отклонённые запросы, и failed запросы от нежелательных клиентов будут блокироваться через fail2ban. Вы сможете мониторить логи и проверять эффективность настроек на протяжении работы вашего DNS-сервера.