Фильтрация AAAA-записей для домена в Bind 9

Опубликовано 29 Января, 2018 под тегами dns, bind, aaaa, ipv6

Последнее время чудит 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.