Як налаштувати systemd та systemd-networkd для використання локального DNS-сервера для вирішення локальних доменів та віддаленого DNS-сервера для віддалених доменів?


26

Я підключений до локальної мережі з доступом до Інтернету через шлюз. У локальній мережі є DNS-сервер, який здатний вирішувати імена хостів комп'ютерів з локальної мережі.

Я хотів би налаштувати systemd та systemd-networkd, щоб запити пошуку локальних імен хостів були спрямовані (направлялися) виключно на локальний DNS-сервер, а запити пошуку для всіх інших імен хостів будуть спрямовані виключно на інший віддалений сервер DNS.

Припустимо, я не знаю, де знаходяться файли конфігурації, чи потрібно додати більше файлів і вимагати, щоб їх відповідні маршрути були вказані у відповіді.

Відповіді:


28

У файлі конфігурації інтерфейсу локальної мережі нам потрібно вказати, чи хочемо ми отримати адресу локального сервера DNS від сервера DHCP, використовуючи DHCP=опцію :

[Network]
DHCP=yes

або явно вкажіть його адресу, скориставшись DNS=опцією :

[Network]
DNS=10.0.0.1

Крім того, нам потрібно вказати (у тому ж розділі) локальні домени за допомогою Domains=параметра

Domains=domainA.example domainB.example ~example

Ми визначаємо локальні домени, domainA.example domainB.exampleщоб отримати таку поведінку (із системи systemd-разрешил.сервис, man-page, вирішена системою ):

Шукання імені хоста, що закінчується в одному з інтерфейсних доменів, експлуатуються виключно на відповідні інтерфейси.

Цей спосіб hostX.domainA.exampleвирішиться виключно нашим локальним сервером DNS.

Ми вказуємо, ~exampleщо всі домени, що закінчуються example, повинні розглядатись як домени, що містять лише маршрути, для отримання такої поведінки (з опису цього зобов’язання):

DNS-сервери, які мають лише маршрутні домени, повинні використовуватися лише для вказаних доменів.

Цей спосіб hostY.on.the.internetвирішиться виключно нашим глобальним віддаленим сервером DNS.

Примітка

В ідеалі, при використанні протоколу DHCP, локальні доменні імена повинні бути отримані від сервера DHCP, а не чітко вказані у файлі конфігурації мережевого інтерфейсу вище. Дивіться UseDomains=варіант . Однак все ще існують неполадки з цією функцією - див . Проблему з опцією пошуку доменів DHCP із системними мережами .

Нам потрібно вказати віддалений DNS-сервер як наш глобальний, загальносистемний DNS-сервер. Це можна зробити у /etc/systemd/resolved.confфайлі:

[Resolve]
DNS=8.8.8.8 8.8.4.4 2001:4860:4860::8888 2001:4860:4860::8844

Не забудьте перезавантажити конфігурацію та перезапустити послуги:

$ sudo systemctl daemon-reload
$ sudo systemctl restart systemd-networkd
$ sudo systemctl restart systemd-resolved

Обережно!

Вище гарантії застосовуються тільки тоді , коли імена вирішуються шляхом Systemd-дозволений - см довідкової сторінки для NSS-Resolve, libnss_resolve.so.2 і сторінку для systemd- дозволеної systemd .

Дивись також:

Список літератури:


6
Чи розглядали ви не використовувати .localв цьому прикладі? Безумовно, з avahi, це повинно було бути зарезервовано для MDNS, а неправильне використання - це велике "ні-ні". Мені було б зрозуміліше використовувати example.comабо .example .
sourcejedi

1
@sourcejedi Для довідки .localвизначається як спеціальний домен у RFC 6762 - Multicast DNS у розділі DNS-імена багатоадресної передачі . Спасибі, виправлено.
Пьотр Доброгост

Непов’язана примітка: ви також можете самостійно приймати відповіді.
intelfx

2
Я думаю, було б корисно додати розташування файлу конфігурації для інтерфейсу локальної мережі . Не впевнений, що правильно /etc/systemd/network/*.network? Знайдено тут superuser.com/a/1365864
Pierre Cordier

1
Я зауважую, що ця відповідь "У файлі конфігурації ..." не відповідає "ОП" Припустимо, я не знаю, де знаходяться файли конфігурації ... "Як хтось, хто прибув сюди в такому ж стані невігластва щодо розташування певних файлів конфігурації, ця відповідь неповна.
Ерік Тауерс

1

Просто для розширення на відмінну відповідь @piotrDobrogost не забудьте налаштувати /etc/nsswitch.confвикористання systemd-resolvedв якості джерела роздільної здатності DNS. Вашаhosts директива повинна виглядати наступним чином для вашого конкретного випадку використання:

/etc/nsswitch.conf

hosts:  files resolve dns

Отже, якщо ви обмежуєте роздільну здатність лише тими доменами, які вказані в Domainsдирективі, /etc/systemd/resolved.confяк описані вище деталі Piotr, далі слід звернутися до DNS у порядку джерел роздільної здатності імен, вказаних, /etc/nsswitch.confколи домени НЕ знайдені вDomains директиві:

Наступне посилання посилається на вимогу вказати вирішення в /etc/nsswitch.confтакsystemd-resolved консультуються при вирішенні імен:

https://github.com/systemd/systemd/isissue/940

Документація на SystemD, яку я визнав жахливою. Мені довелося зібрати розуміння з кількох посилань, включаючи відповідь Пьотра вище ;-)


При використанні рекомендованого режиму роботи з системним дозволом, де /etc/resolve.confє символьне посилання на /run/systemd/resolve/stub-resolv.confфайл, який, в свою чергу, містить адресу DNS-розв'язувача заглушки DNS systemd-рішення , немає необхідності розміщувати resolveдирективу у /etc/nsswitch.confфайл, оскільки запити DNS будуть спрямовані (через стандартну nss-dnsдирективу) на заглушка заглушки, яка діє згідно з правилами системного рішення .
Пьотр Доброгост

@PiotrDobrogost Як ви могли керувати джерелами замовлення роздільної здатності DNS, не використовуючи /etc/nsswitch.conf``? In the specimen config above, / etc / hosts` (" файли "), перевірятимуться на статичну IP-адресу: відображення імен, і якщо їх не знайдеться, далі вирішуватимуть вирішену системою заглушку. . Я не бачу, як було б можливо встановити джерела роздільної здатності DNS без використання /etc/nsswitch.conf. Чи пропускаю я тут хитрість?
F1Linux

Я не кажу, що /etc/nsswitch.confце не потрібно. Я кажу, що коли використовується DNS -розв'язувач stub -разрешеного systemd, тоді достатньо, щоб dnsдиректива була вказана в hosts:рядку (імовірно, після fileдирективи). Тут немає ніякої необхідності в resolveдирективі, оскільки саме розв'язувач заглушки є точкою входу до логіки вирішеної системою, а не nss-resolveмодуля підключення ...
Piotr Dobrogost

... Іншими словами, ви можете дійти до логіки системи-вирішеної системи або через resolveдирективу ➟ nss-разрешений модуль модуля NSS d системно- вирішено, або через dnsдирективу ➟ nss-dns модуль модуля NSS ➟ системний -вирішено ' заглушок DNS-розв’язникасистемно-вирішено
Пьотр Доброгост

@PiotrDobrogost Я думаю , що я приїхав на filesте resolveштуковина в /etc/nsswitch.confз 2 - й частини вашого запитання. Перечитавши його, схоже, ви просто говорили про перевірку локального кешу на IP: відображення імен, а потім звернення до експедитора, якщо його не знайдено. Я, як правило, встановив filesперше джерело DNS-дозволу, щоб обійти DNS, щоб дозволити мені протестувати та не потрапити на виробничі
хости
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.