Вопрос или проблема
У меня есть внутренний Docker-хост, который имеет множество IP-адресов, по одному для каждой из своих сетей контейнеров. Что-то вроде этого:
;; ANSWER SECTION:
host.lan.internal. 900 IN A 172.29.0.1
host.lan.internal. 900 IN A 172.29.4.1
host.lan.internal. 900 IN A 172.29.8.1
host.lan.internal. 900 IN A 172.29.12.1
host.lan.internal. 900 IN A 172.29.16.1
host.lan.internal. 900 IN A 172.29.20.1
host.lan.internal. 900 IN A 172.29.36.1
host.lan.internal. 900 IN A 10.0.3.1
host.lan.internal. 900 IN A 10.0.5.1
host.lan.internal. 900 IN A 10.0.7.1
host.lan.internal. 900 IN A 10.10.10.1
host.lan.internal. 900 IN A 172.29.24.1
Цель здесь – реализовать что-то подобное порядку маски подсети DNS от Microsoft (ссылка #1, ссылка #2), где DNS-клиент получает ответы на запросы A, которые “ближе” к нему, но предпочтительно с использованием Unbound, или, возможно, dnsmasq или bind9.
Примечание: это необходимо для DNS-запросов вне контекста/хоста Docker.
Есть ли у нас какие-либо основные реализации DNS-серверов на Linux, которые поддерживают порядок маски подсети или приоритезацию локальных подсетей?
Ответ или решение
DNS (Domain Name System) является критически важным компонентом сетевой инфраструктуры, особенно в условиях использования виртуализации и контейнеризации, таких как Docker. В данном случае, задача заключается в реализации функции, аналогичной Microsoft DNS netmask ordering, для серверов DNS на платформах, отличных от Windows. В этом ответе мы рассмотрим три основных DNS-сервера на Linux: Unbound, dnsmasq и BIND9, и как они могут помочь в решении вашей задачи.
Понимание Netmask Ordering
Netmask ordering — это метод, позволяющий DNS-серверу отдавать приоритет ответам, адресуемым клиентам, находящимся в одной сети или подсети. Этот механизм позволяет улучшить производительность и уменьшить задержки, предоставляя клиентам IP-адреса, которые наиболее близки к ним по сети. Microsoft реализует эту функцию в своих DNS-серверах, но с открытыми решениями, такими как Unbound, dnsmasq и BIND9, вы можете добиться аналогичных результатов.
Unbound
Unbound — это современный DNS-рекурсивный сервер, который обладает множеством функций, включая поддержку DNSSEC и кэширования. Однако, в отличие от встроенных решений Microsoft, Unbound не поддерживает функцию netmask ordering "из коробки". Тем не менее, можно использовать такие функции, как "client_address" и "remote_control", чтобы настроить сервер для обработки запросов от различных подсетей.
Примечание: требуется написать пользовательский скрипт для определения, к какой подсети принадлежит IP-адрес клиента, и возвращать соответствующие A-записи.
dnsmasq
Dnsmasq — это легковесный DHCP и DNS-сервер, подходящий для малых сетей. Одна из его уязвимостей заключается в отсутствии поддержки netmask ordering, однако он может быть настроен с помощью dnsmasq.conf
для назначения фиксированных адресов IP в зависимости от DHCP. Вы можете настроить dnsmasq так, чтобы он возвращал записи только для подсеты, к которой относится клиент, путем фильтрации IP-адресов в конфигурации.
BIND9
BIND9 является одним из наиболее распространенных серверов DNS в мире и предлагает наиболее гибкие возможности настройки по сравнению с другими решениями. Бинд не поддерживает netmask ordering по умолчанию, но он позволяет реализовать аналогичную логику с помощью "ACLs" (Access Control Lists) и "views". Вы можете создать разные представления (views) для различных подсетей, которые будут возвращать только тот набор A-записей, который соответствует запросу:
view "local" {
match-clients { 172.29.0.0/16; };
zone "host.lan.internal" {
type master;
file "db.host.lan.internal.local";
};
};
view "remote" {
match-clients { any; };
zone "host.lan.internal" {
type master;
file "db.host.lan.internal.remote";
};
};
В этом примере первое представление (view) будет возвращать только адреса, соответствующие подсети 172.29.x.x, тогда как второе представление будет обеспечивать доступ к другим записям для клиентов из других подсетей.
Заключение
Несмотря на то что netmask ordering не поддерживается в стандартной конфигурации открытых DNS-серверов на Linux, такие решения как BIND9 предоставляют гибкие возможности настройки, позволяющие реализовать аналогичную логику. Для достижения наилучших результатов, рекомендуется внимательно учитывать требования вашей сети и тестировать выбранное решение в рамках вашей контейнерной инфраструктуры. Исходя из ваших специфических требований, можно выбрать наиболее подходящий DNS-сервер, чтобы обеспечить оптимальное разрешение имен для ваших контейнеров Docker.
Если у вас есть дополнительные вопросы или требуется помощь в следующем шаге, не стесняйтесь обращаться за поддержкой.