Как стать автором
Поиск
Написать публикацию
Обновить

Разделяем DNS-запросы

Время на прочтение2 мин
Количество просмотров6.4K

Исходная диспозиция

В локальной сети используется локальный 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

В общем, задача вроде бы решена. Теперь сломанный сервер провайдера не будет мешать работе, и заодно мы избавим его от лишней нагрузки.

Остается проблема работоспособности резервного канала связи к удаленному серверу, но у нее много своих, отдельных решений...

Теги:
Хабы:
+12
Комментарии22

Публикации

Ближайшие события