Фильтрация AAAA-записей для домена в Bind 9
Последнее время чудит IPv6 на одном из серверов, а к некоторым сервисам очень хочется иметь доступ если есть хоть какой интернет. Но почему-то все клиенты очень старательно предпочитают брать AAAA-записи из DNS, даже если этот самый IPv6 явно лежит и всё что от него есть это адрес на интерфейсе.
В общем встал вопрос “а как бы убрать AAAA-запись вот для этого домена?” У Bind есть опция filter-aaaa-on-v4
, которая заставляет Bind выдавать пустоту на запросы AAAA-записей от IPv4-клиентов (и аналогичная ей filter-aaaa-on-v6
, которая делает то же самое для IPv6-клиентов)
Однако эту опцию нельзя применить к домену. Собственно она работает только в блоках options
и view
. Но можно применить грязный хак. Подробности под катом.
Ясно, что если нужно фильтровать AAAA-записи только для конкретного домена, то добавлять filter-aaaa-*
в блок options
бессмысленно – это включит фильтрацию глобально. Однако интересным кажется блок view
, который позволяет серверу вести себя по-разному в зависимости от адреса клиента и сервера (поскольку сервер может висеть на нескольких адресах).
Можно создать view
на любом локальном адресе. Например:
view "loopback" in {
match-destinations { 127.0.0.1; };
filter-aaaa-on-v4 yes;
zone "." in {
type hint;
file "/var/bind/root.cache";
}
};
Отлично, теперь при запросах на 127.0.0.1, Bind не будет выдавать AAAA-записи.
Но переопределять DNS-сервер в клиентах прямо скажем сомнительно, да и непонятно как добраться до localhost удалённого хоста. Тут на помощь приходит возможность определить зоны, запросы к которым просто передают запрос на другой DNS-сервер. В данном случае “другим сервером” сможет выступить 127.0.0.1
:
zone "the.domain.i.want.to.filter.aaaa.on.com." in {
type forward;
forward only;
forwarders { 127.0.0.1; };
};
Так, запросы для домена the.domain.i.want.to.filter.aaaa.on.com
будут перенаправлены на 127.0.0.1
, а там установлен флаг filter-aaaa-on-v4
.
Почему заодно не filter-aaaa-on-v6
? Потому что запросы на 127.0.0.1
очевидно по протоколу IPv6 не ходят. Но с тем же успехом можно было бы привязать всё на ::1
. Другой вопрос что странно использовать IPv6, когда стоит задача не использовать IPv6.