Я пытаюсь создать простой каскадный алгоритм разрешения DNS для моего ноутбука:
- Запрос серверов, предоставленных DHCP
- Не найдено / не удалось? Запрос 8.8.8.8 и его друзей
- Не найдено / не удалось? Запросите локальный dnsmasq на 127.ABC
В настоящее время, по-видимому, следующий сервер запрашивается только в том случае, если предыдущий сервер по той или иной причине дал сбой, но если он ответил пустым ответом, процесс разрешения останавливается.
Можно ли заставить машину на базе Linux сделать это каскадным способом, описанным выше, либо через механизмы ядра, либо через systemd-resolved? Конечно, это возможно, если направлять запросы через dnsmasq (установив systemd-resolved в первой server=
директиве для пересылки запросов на серверы, предоставляемые DHCP), но я бы предпочел менее запутанный способ, который сохранил бы как можно большую часть моего дистрибутива нетронутой.
решение1
К сожалению, DNS работает не так. Единственный случай, когда будут запрошены другие серверы, — это когда предыдущий определенный сервер не отвечает. ЛЮБОЙ ответ, даже если это ответ NXDOMAIN, является ответом. Даже ответ Query Denied является ответом ...
решение2
Как оказалось, вполне похожую вещь, удовлетворяющую моим потребностям, можно сделать наоборот (просто потому, что домены не пересекаются). Необходимый функционал есть в самом dnsmasq, и я могу добиться желаемого следующим образом:
Запустите systemd-resolved на 127.0.0.53
Добавьте необходимые правила в dnsmasq.conf
address = /banana.services/127.0.0.1 address = /mango.services/127.0.0.1
Завершите dnsmasq.conf с резервными серверами systemd-resolved и глобальными DNS
server = 127.0.0.53 server = 8.8.8.8 server = 8.8.4.4 server = 1.1.1.1
Вуаля — теперь* dnsmasq сначала обслужит локальные переопределения, затем проверит локальный DNS и, наконец, если он также ничего не вернет, запросит список известных DNS-серверов.
* nsswitch.conf также может потребовать изменения порядка разрешения.