Исходная диспозиция
В локальной сети используется локальный named для того, чтобы задать имена для локальных серверов. Все остальные запросы форвардятся на DNS-сервер провайдера и на сервер Гугля.
Ну, можно сказать, стандартная ситуация.
Но несколько дней назад внезапно некоторые внешние DNS-имена перестали ресолвится, вообще. При этом DNS-сервер от Гугля вообще перестал быть доступен.
Однако точно такой же named на удаленном сервере продолжал работать как обычно.
Простое сопоставление A и B как бы намекает, что у местного провайдера что-то сломалось.
-- Это ж-ж-ж неспроста! - сказала паранойя - надо что-то делать!
Если сервер у провайдера ломается, а сервер Гугля внезапно устаревает - надо решать проблему иначе.
Разделение
Итак, у нас три категории доменных имен:
-- локальные
-- те, которые вряд ли будут ломаться
-- все остальные
Первые, как и раньше, можем определять на локальном named, вторые - отдаем провайдеру, а третьи придется разбирать на удаленном сервере, через резервный канал связи.
Для этого используем балансировщик DNS-запросов dnsdist:
sudo apt install dnsdist
Устанавливаем его на локальном DNS-сервере в дополнение к имеющемуся named.
Разумеется, он не запускается, т.к. 53 порт уже занят - поэтому переносим named на другой порт и отключаем там всё лишнее:
vim /etc/bind/named.conf.options
options {
directory "/var/cache/bind";
listen-on port 5300 { 127.0.0.1; };
allow-query { any; };
recursion no;
forwarders { };
dnssec-validation no;
};
Затем настраиваем dnsdist:
vim /etc/dnsdist/dnsdist.conf
setSecurityPollSuffix("")
setLocal("0.0.0.0:53")
newServer({address="127.0.0.1:5300", pool="local_pool"})
newServer({address="provider_ip:53", pool="ru_pool"})
newServer({address="remote_ip:53", pool="world_pool"})
addAction(makeRule("dbase.local."), PoolAction("local_pool"))
addAction(makeRule("ru."), PoolAction("ru_pool"))
addAction(AllRule(), PoolAction("world_pool"))
И всё это перезапускаем. Для начала можно перезапустить только named:
/etc/init.d/named restart
Он уходит на порт 5300, и по порту 53 больше недоступен. Можно проверить его работу там:
dig @127.0.0.1 -p 5300 dbase.local
Должен вернуть локальный IP, определенный в named для этого сервера (предполагается что он там уже был раньше настроен, см. исходную диспозицию)
Теперь можно запустить dnsdist в отладке:
dnsdist -v
И попытаться что-то поискать:
dig ya.ru
dig microsoft.com
dig dbase.local
В консольном выводе dnsdist должно быть видно, куда распределяются разные запросы.
Локальное имя - на локальный сервер, *.ru - к провайдеру, остальное - на удаленный named.
Остается перезапустить и его:
/etc/init.d/dnsdist start
В общем, задача вроде бы решена. Теперь сломанный сервер провайдера не будет мешать работе, и заодно мы избавим его от лишней нагрузки.
Остается проблема работоспособности резервного канала связи к удаленному серверу, но у нее много своих, отдельных решений...