109.4 Урок 1
Сертифікат: |
LPIC-1 |
---|---|
Версія: |
5.0 |
Розділ: |
109 Основи мереж |
Тема: |
109.4 Налаштування DNS на стороні клієнта |
Урок: |
1 з 1 |
Вступ
Цей урок охоплює налаштування розпізнавання імен на стороні клієнта та використання кількох інструментів командного рядка для розпізнавання імен.
Запам’ятати та підтримувати IP-адреси, UID, GID та інші номери для всього неможливо. Служби розпізнавання імен перетворюють імена, які легко запам’ятати, на числа та навпаки. У цьому уроці розглянуто розпізнавання імен хостів, але подібний процес відбувається для імен користувачів, імен груп, номерів портів та деяких інших.
Процес розпізнавання імен
Програми, які перетворюють імена в числа, майже завжди використовують функції стандартної бібліотеки C, яка в системах Linux представлена GNU-проєктом glibc. Перше, що роблять ці функції, це читають файл /etc/nsswitch.conf
, щоб отримати інструкції щодо того, як розпізнати цей тип імені. Цей урок зосереджений на розпізнаванні імен хостів, але той самий процес стосується й інших типів розпізнавання імен. Коли процес читає /etc/nsswitch.conf
, він шукає ім’я у вказаний спосіб. Оскільки /etc/nsswitch.conf
підтримує плагіни, далі може бути що завгодно. Після того, як функція завершить пошук імені чи номера, вона повертає результат до процесу виклику.
DNS класи
DNS має три класи записів: IN, HS і CH. У цьому уроці всі DNS-запити будуть типу IN. Клас IN призначений для інтернет-адрес, що використовують стек TCP/IP. CH призначений для ChaosNet, яка є мережною технологією, що існувала недовго і більше не використовується. Клас HS для Hesiod. Hesiod — це спосіб зберігати такі речі, як passwd і записи груп у DNS. Hesiod виходить за рамки цього уроку.
Розуміння /etc/nsswitch.conf
Найкращий спосіб дізнатися про цей файл — прочитати man-сторінку, яка є частиною проекту man-сторінок Linux. Ця сторінка доступна у більшості систем. Доступ до неї можна отримати за допомогою команди man nsswitch.conf
. Крім того, її можна знайти за адресою https://man7.org/linux/man-pages/dir_section_5.html
Нижче наведено простий приклад /etc/nsswitch.conf
з man-сторінки:
passwd: compat group: compat shadow: compat hosts: dns [!UNAVAIL=return] files networks: nis [NOTFOUND=return] files ethers: nis [NOTFOUND=return] files protocols: nis [NOTFOUND=return] files rpc: nis [NOTFOUND=return] files services: nis [NOTFOUND=return] files # This is a comment. It is ignored by the resolution functions.
Файл організований у стовпці. Крайній лівий стовпець – це тип бази даних імен. Решта стовпців — це методи, які функції розв’язання мають використовувати для пошуку імені. За методами йдуть функції зліва направо. Стовпці з []
використовуються для надання деякої обмеженої умовної логіки стовпцю безпосередньо ліворуч від нього.
Припустимо, що процес намагається розпізнати ім’я хоста learning.lpi.org
. Це зробить відповідний виклик бібліотеки C (швидше за все, gethostbyname
). Потім ця функція читатиме /etc/nsswitch.conf
. Оскільки процес шукає ім’я хоста, він знайде рядок, що починається з hosts
. Потім він спробує використати DNS для визначення імені. Наступний стовпець [!UNAVAIL=return]
означає, що якщо служба доступна, не намагайтеся використовувати наступне джерело, тобто якщо DNS доступний, припиніть спроби розпізнати ім’я хоста, навіть якщо сервери імен не змогли цього зробити. Якщо DNS недоступний, перейдіть до наступного джерела. У цьому випадку наступним джерелом є files
.
Коли ви бачите стовпець у форматі [result=action]
, це означає, що коли пошуком резольвера стовпця ліворуч від нього є result
, тоді виконується action
. Якщо перед result
стоїть !
, це означає, що якщо результат не є result
, виконайте action
. Описи можливих результатів і дій дивись на man-сторінці.
Тепер припустимо, що процес намагається знайти номер порту відповідно до імені служби. Він читатиме рядок services
. Першим джерелом у списку є NIS. NIS розшифровується як Network Information Service (її іноді називають жовтими сторінками). Це стара служба, яка дозволяла централізовано керувати такими речами, як користувачі. Її вже рідко використовують через слабкий захист. Наступний стовпець [NOTFOUND=return]
означає, що якщо пошук вдався, але службу не знайдено, потрібно припинити пошук. Якщо вищезазначена умова не виконується, використовуйте локальні файли.
Все, що праворуч від #
, є коментарем і ігнорується.
Файл /etc/resolv.conf
Файл /etc/resolv.conf
використовується для налаштування пошукової здатності хоста через DNS. Деякі дистрибутиви мають сценарії запуску, демони та інші інструменти, які записують у цей файл. Майте це на увазі під час редагування цього файлу вручну. Перевірте свій дистрибутив і будь-яку документацію інструментів налаштування мережі у такому випадку. Деякі інструменти, наприклад, Network Manager, залишать коментар у файлі, повідомляючи, що внесені вручну зміни буде перезаписано.
Як і у випадку з /etc/nsswitch.conf
, існує man-сторінка, пов’язана з файлом. Доступ до неї можна отримати за допомогою команди man resolv.conf
або за адресою https://man7.org/linux/man-pages/man5/resolv.conf.5.html.
Формат файлу досить простий. У крайньому лівому стовпчику ви маєте опцію name
. Решта стовпців у цьому ж рядку є значенням опції.
Найпоширенішим варіантом є параметр nameserver
. Він використовується для визначення адреси IPv4 або IPv6 DNS-сервера. На дату написання цієї статті ви можете вказати до трьох серверів імен. Якщо ваш /etc/resolv.conf
не має опції nameserver
, ваша система за умовчанням використовуватиме сервер імен на локальній машині.
Нижче наведено простий файл прикладу типових конфігурацій:
search lpi.org nameserver 10.0.0.53 nameserver fd00:ffff::2:53
Опція search
використовується, щоб дозволити пошук у короткій формі. У прикладі налаштовано один пошуковий домен lpi.org
. Це означає, що будь-яка спроба розпізнати ім’я хоста без доменної частини матиме .lpi.org
, доданий перед пошуком. Наприклад, якщо ви спробуєте знайти хост під назвою learning
, резолвер шукатиме learning.lpi.org
. Ви можете налаштувати до шести доменів пошуку.
Іншим поширеним варіантом є параметр domain
. Він використовується для встановлення вашого локального доменного імені. Якщо цей параметр відсутній, за замовчуванням буде використано все після першої .
в імені хоста машини. Якщо ім’я хоста не містить .
, передбачається, що машина є частиною кореневого домену. Як і search
, domain
можна використовувати для пошуку за короткими іменами.
Майте на увазі, що domain` і search
взаємовиключні. Якщо обидва присутні, використовується останній екземпляр у файлі.
Є кілька параметрів, які можна встановити, щоб вплинути на поведінку резолвера. Щоб установити їх, використовуйте ключове слово options
, за яким слідує назва параметра, який потрібно встановити, і, якщо це можна застосувати, :
, а потім значення. Нижче наведено приклад налаштування параметра тайм-ауту, який означає тривалість часу в секундах, протягом якого резолвер чекатиме на сервер імен, перш ніж відмовитися:
option timeout:3
Існують інші параметри resolv.conf
, але ці є найпоширенішими.
Файл /etc/hosts
Файл /etc/hosts
використовується для перетворення імен в IP-адреси і навпаки. Підтримуються як IPv4, так і IPv6. Лівий стовпець – це IP-адреса, решта – імена, пов’язані з цією адресою. Найпоширенішим використанням /etc/hosts
є хости та адреси, де DNS неможливий, наприклад адреси зворотного зв’язку. У наведеному нижче прикладі визначено IP-адреси критичних компонентів інфраструктури.
Ось реалістичний приклад файлу /etc/hosts
:
127.0.0.1 localhost 127.0.1.1 proxy ::1 localhost ip6-localhost ip6-loopback ff02::1 ip6-allnodes ff02::2 ip6-allrouters 10.0.0.1 gateway.lpi.org gateway gw fd00:ffff::1 gateway.lpi.org gateway gw 10.0.1.53 dns1.lpi.org fd00:ffff::1:53 dns1.lpi.org 10.0.2.53 dns2.lpi.org fd00:ffff::2:53 dns2.lpi.org
systemd-resolved
Systemd надає службу під назвою systemd-resolved
. Він забезпечує mDNS, DNS і LLMNR. Під час роботи він прослуховує DNS-запити на 127.0.0.53
. Він не забезпечує повноцінний сервер DNS. Будь-які запити DNS, які він отримує, обробляються серверами запитів, налаштованими в /etc/systemd/resolv.conf
або /etc/resolv.conf
. Якщо ви бажаєте використовувати цю службу, використовуйте resolve
для hosts
у /etc/nsswitch.conf
. Майте на увазі, що пакет ОС, який містить бібліотеку systemd-resolved
, може бути не встановлений за замовчуванням.
Інструменти розпізнавання імен
Користувачам Linux доступно багато інструментів для розпізнавання імен. Цей урок охоплює три. Один, getent
, корисний для того, щоб побачити, як будуть вирішуватися запити в реальному світі. Ще одна команда — host
, яка корисна для простих запитів DNS. Програма під назвою dig
корисна для складних операцій DNS, яка може допомогти у вирішенні проблем із сервером DNS.
Команда getent
Утиліта getent
використовується для відображення записів із баз даних служби імен. Вона може отримувати записи з будь-якого джерела, яке можна налаштувати за допомогою /etc/nsswitch.conf
.
To use getent
, follow the command with the type of name you wish to resolve and optionally a specific entry to lookup. If you only specify the type of name, getent
will attempt to display all entries of that data type:
$ getent hosts 127.0.0.1 localhost 127.0.1.1 proxy 10.0.1.53 dns1.lpi.org 10.0.2.53 dns2.lpi.org 127.0.0.1 localhost ip6-localhost ip6-loopback $ getent hosts dns1.lpi.org fd00:ffff::1:53 dns1.lpi.org
Starting with glibc version 2.2.5, you can force getent
to use a specific data source with the -s
option. The example below demonstrates this:
$ getent -s files hosts learning.lpi.org ::1 learning.lpi.org $ getent -s dns hosts learning.lpi.org 208.94.166.198 learning.lpi.org
Команда host
host
— це проста програма для пошуку записів DNS. Без параметрів, якщо host
передано тільки ім’я, він повертає набори записів A, AAAA та MX. Якщо надається адреса IPv4 або IPv6, він виводить запис PTR, якщо той доступний:
$ host wikipedia.org wikipedia.org has address 208.80.154.224 wikipedia.org has IPv6 address 2620:0:861:ed1a::1 wikipedia.org mail is handled by 10 mx1001.wikimedia.org. wikipedia.org mail is handled by 50 mx2001.wikimedia.org. $ host 208.80.154.224 224.154.80.208.in-addr.arpa domain name pointer text-lb.eqiad.wikimedia.org.
Якщо ви шукаєте певний тип запису, ви можете використовувати host -t
:
$ host -t NS lpi.org lpi.org name server dns1.easydns.com. lpi.org name server dns3.easydns.ca. lpi.org name server dns2.easydns.net. $ host -t SOA lpi.org lpi.org has SOA record dns1.easydns.com. zone.easydns.com. 1593109612 3600 600 1209600 300
host
також можна використовувати для запиту на певний сервер імен, якщо ви не бажаєте використовувати ті, що містяться в /etc/resolv.conf
. Просто додайте IP-адресу або ім’я хоста сервера, який ви хочете використовувати, як останній аргумент:
$ host -t MX lpi.org dns1.easydns.com Using domain server: Name: dns1.easydns.com Address: 64.68.192.10#53 Aliases: lpi.org mail is handled by 10 aspmx4.googlemail.com. lpi.org mail is handled by 10 aspmx2.googlemail.com. lpi.org mail is handled by 5 alt1.aspmx.l.google.com. lpi.org mail is handled by 0 aspmx.l.google.com. lpi.org mail is handled by 10 aspmx5.googlemail.com. lpi.org mail is handled by 10 aspmx3.googlemail.com. lpi.org mail is handled by 5 alt2.aspmx.l.google.com.
Команда dig
Іншим інструментом для запиту DNS-серверів є dig
. Ця команда набагато докладніша, ніж host
. За замовчуванням запити dig
для записів A. Можливо, це надто багатослівно для простого пошуку IP-адреси чи імені хоста. dig
працюватиме для простих пошуків, але він більше підходить для усунення несправностей конфігурації DNS-сервера:
$ dig learning.lpi.org ; <<>> DiG 9.11.5-P4-5.1+deb10u1-Debian <<>> learning.lpi.org ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 63004 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 3, ADDITIONAL: 5 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ; COOKIE: ca7a415be1cec45592b082665ef87f3483b81ddd61063c30 (good) ;; QUESTION SECTION: ;learning.lpi.org. IN A ;; ANSWER SECTION: learning.lpi.org. 600 IN A 208.94.166.198 ;; AUTHORITY SECTION: lpi.org. 86400 IN NS dns2.easydns.net. lpi.org. 86400 IN NS dns1.easydns.com. lpi.org. 86400 IN NS dns3.easydns.ca. ;; ADDITIONAL SECTION: dns1.easydns.com. 172682 IN A 64.68.192.10 dns2.easydns.net. 170226 IN A 198.41.222.254 dns1.easydns.com. 172682 IN AAAA 2400:cb00:2049:1::a29f:1835 dns2.easydns.net. 170226 IN AAAA 2400:cb00:2049:1::c629:defe ;; Query time: 135 msec ;; SERVER: 192.168.1.20#53(192.168.1.20) ;; WHEN: Sun Jun 28 07:29:56 EDT 2020 ;; MSG SIZE rcvd: 266
Як бачите, dig
надає багато інформації. Вихідні дані поділені на розділи. У першому розділі відображається інформація про встановлену версію dig
та надісланий запит разом із усіма параметрами, які використовуються для команди. Далі відображається інформація про запит і відповідь.
У наступному розділі показано інформацію про використані EDNS-розширення і запит. У прикладі використовується розширення cookie. dig
шукає запис A для learning.lpi.org
.
У наступному розділі показано результат запиту. Число у другому стовпці – це TTL ресурса в секундах.
Решта вихідних даних надає інформацію про сервери імен домену, включаючи записи NS для сервера разом із записами A і AAAA серверів у записі NS домену.
Як і при використанні команди host
, ви можете вказати тип запису за допомогою параметра -t
:
$ dig -t SOA lpi.org ; <<>> DiG 9.11.5-P4-5.1+deb10u1-Debian <<>> -t SOA lpi.org ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 16695 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 3, ADDITIONAL: 6 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ; COOKIE: 185c67140a63baf46c4493215ef8906f7bfbe15bdca3b01a (good) ;; QUESTION SECTION: ;lpi.org. IN SOA ;; ANSWER SECTION: lpi.org. 600 IN SOA dns1.easydns.com. zone.easydns.com. 1593109612 3600 600 1209600 300 ;; AUTHORITY SECTION: lpi.org. 81989 IN NS dns1.easydns.com. lpi.org. 81989 IN NS dns2.easydns.net. lpi.org. 81989 IN NS dns3.easydns.ca. ;; ADDITIONAL SECTION: dns1.easydns.com. 168271 IN A 64.68.192.10 dns2.easydns.net. 165815 IN A 198.41.222.254 dns3.easydns.ca. 107 IN A 64.68.196.10 dns1.easydns.com. 168271 IN AAAA 2400:cb00:2049:1::a29f:1835 dns2.easydns.net. 165815 IN AAAA 2400:cb00:2049:1::c629:defe ;; Query time: 94 msec ;; SERVER: 192.168.1.20#53(192.168.1.20) ;; WHEN: Sun Jun 28 08:43:27 EDT 2020 ;; MSG SIZE rcvd: 298
Dig має багато параметрів для точного налаштування виведення та запиту, надісланого на сервер. Ці параметри починаються з +
. Одним із варіантів є параметр short
, який приховує всі виведення, крім результату:
$ dig +short lpi.org 65.39.134.165 $ dig +short -t SOA lpi.org dns1.easydns.com. zone.easydns.com. 1593109612 3600 600 1209600 300
Ось приклад вимкнення розширення cookie EDNS:
$ dig +nocookie -t MX lpi.org ; <<>> DiG 9.11.5-P4-5.1+deb10u1-Debian <<>> +nocookie -t MX lpi.org ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 47774 ;; flags: qr rd ra; QUERY: 1, ANSWER: 7, AUTHORITY: 3, ADDITIONAL: 5 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;lpi.org. IN MX ;; ANSWER SECTION: lpi.org. 468 IN MX 0 aspmx.l.google.com. lpi.org. 468 IN MX 10 aspmx4.googlemail.com. lpi.org. 468 IN MX 10 aspmx5.googlemail.com. lpi.org. 468 IN MX 10 aspmx2.googlemail.com. lpi.org. 468 IN MX 10 aspmx3.googlemail.com. lpi.org. 468 IN MX 5 alt2.aspmx.l.google.com. lpi.org. 468 IN MX 5 alt1.aspmx.l.google.com. ;; AUTHORITY SECTION: lpi.org. 77130 IN NS dns2.easydns.net. lpi.org. 77130 IN NS dns3.easydns.ca. lpi.org. 77130 IN NS dns1.easydns.com. ;; ADDITIONAL SECTION: dns1.easydns.com. 76140 IN A 64.68.192.10 dns2.easydns.net. 73684 IN A 198.41.222.254 dns1.easydns.com. 76140 IN AAAA 2400:cb00:2049:1::a29f:1835 dns2.easydns.net. 73684 IN AAAA 2400:cb00:2049:1::c629:defe ;; Query time: 2 msec ;; SERVER: 192.168.1.20#53(192.168.1.20) ;; WHEN: Mon Jun 29 10:18:58 EDT 2020 ;; MSG SIZE rcvd: 389
Вправи до посібника
-
Що буде робити команда нижче?
getent group openldap
-
Яка найбільша різниця між
getent
та іншими розглянутими інструментами,host
іdig
? -
Який параметр
dig
іhost
використовується для визначення типу запису, який ви бажаєте отримати? -
Що з наведеного нижче є правильним записом
/etc/hosts
?::1 localhost
localhost 127.0.0.1
-
Який параметр
getent
використовується для визначення джерела даних, яке слід використовувати для виконання пошуку?
Дослідницькі вправи
-
Якби ви редагували
/etc/resolv.conf
нижче за допомогою текстового редактора, що, ймовірно, трапиться?# Generated by NetworkManager nameserver 192.168.1.20
Зміни буде перезаписано NetworkManager.
NetworkManager оновить свою конфігурацію відповідно до ваших змін.
Ваші зміни не вплинуть на систему.
NetworkManager буде вимкнено.
-
Що означає наступний рядок у
/etc/nsswitch.conf
:hosts: files [SUCCESS=continue] dns
-
Враховуючи наступний
/etc/resolv.conf
, чому система не розпізнає імена через DNS?search lpi.org #nameserver fd00:ffff::1:53 #nameserver 10.0.1.53
-
Що робить команда
dig +noall +answer +question lpi.org
? -
Як можна перевизначити значення за замовчуванням
dig
, не вказавши їх у командному рядку?
Підсумки
Команда getent
є чудовим інструментом для перегляду результатів викликів резолвера. Для простих DNS-запитів host
простий у використанні та видає прості вихідні дані. Якщо вам потрібна детальна інформація або потрібно точно налаштувати DNS-запит, dig
, швидше за все, найкращий вибір.
Завдяки можливості додавати модулі спільної бібліотеки та налаштовувати поведінку резолвера, Linux чудово підтримує розпізнавання імен і чисел різних типів. Програму getent
можна використовувати для розпізнавання імен за допомогою бібліотек розпізнавача. host
і dig
можна використовувати для запиту DNS-серверів.
Файл /etc/nsswitch.conf
використовується для налаштування поведінки резолвера. Ви можете змінювати джерела даних і додавати просту умовну логіку для типів імен із кількома джерелами.
DNS налаштовується шляхом редагування /etc/resolv.conf
. Багато дистрибутивів мають інструменти, які керують цим файлом за вас, тому перевірте документацію вашої системи, якщо внесені вручну зміни не зберігаються.
Файл /etc/hosts
використовується для визначення імен хостів відповідно до IP-адреси і навпаки. Зазвичай він використовується для визначення імен, таких як localhost
, які недоступні через DNS.
Можна залишати коментарі у конфігураційних файлах, розглянутих у цьому уроці. Будь-який текст праворуч від #
ігнорується системою.
Відповіді до вправ посібника
-
Що буде робити команда нижче?
getent group openldap
Вона читатиме
/etc/nsswitch.conf
, шукатиме групуopenldap
із перелічених джерел і відображатиме інформацію про неї, якщо її знайдено. -
Яка найбільша різниця між
getent
та іншими розглянутими інструментами,host
іdig
?getent
шукає імена за допомогою бібліотек резолвера, інші просто запитують DNS.getent
можна використовувати для усунення несправностей вашого/etc/nsswitch.conf
і конфігурації бібліотек розпізнавання імен, налаштованих на використання вашою системою.host
іdig
використовуються для пошуку записів DNS. -
Який параметр
dig
іhost
використовується для визначення типу запису, який ви бажаєте отримати?Обидві програми використовують
-t
, щоб вказати тип запису, який ви бажаєте знайти. -
Що з наведеного нижче є правильним записом
/etc/hosts
?::1 localhost
X
localhost 127.0.0.1
::1 localhost
правильний рядок. Ліва колонка завжди містить адресу IPv4 або IPv6. -
Який параметр
getent
використовується для вказівки джерела даних, яке слід використовувати для виконання пошуку?Параметр
-s
використовується для визначення джерела даних. Наприклад:$ getent -s files hosts learning.lpi.org 192.168.10.25 learning.lpi.org $ getent -s dns hosts learning.lpi.org 208.94.166.198 learning.lpi.org
Відповіді до дослідницьких вправ
-
Якби ви редагували
/etc/resolv.conf
нижче за допомогою текстового редактора, що, ймовірно, трапиться?# Generated by NetworkManager nameserver 192.168.1.20
Зміни буде перезаписано NetworkManager.
X
NetworkManager оновить свою конфігурацію відповідно до ваших змін.
Ваші зміни не вплинуть на систему.
NetworkManager буде вимкнено.
-
Що означає наступний рядок у
/etc/nsswitch.conf
:hosts: files [SUCCESS=continue] dns
Пошук імен хостів спочатку перевірить ваші файли
/etc/hosts
, а потім DNS. Якщо шуканий запис знайдено у файлах і DNS, буде використано запис у DNS. -
Враховуючи наступний
/etc/resolv.conf
, чому система не розпізнає імена через DNS?search lpi.org #nameserver fd00:ffff::1:53 #nameserver 10.0.1.53
Обидва DNS-сервери закоментовані, і на локальному хості не працює DNS-сервер.
-
Що робить команда
dig +noall +answer +question lpi.org
?Він шукає запис A для lpi.org і відображає лише запит і відповідь.
-
Як можна перевизначити значення за замовчуванням
dig
, не вказавши їх у командному рядку?Ви створюєте файл
.digrc
у своєму домашньому каталозі.